71 lines
2.0 KiB
Bash
71 lines
2.0 KiB
Bash
|
|
#!/bin/bash
|
|||
|
|
PORT="/dev/ttyUSB2"
|
|||
|
|
NUMBER="+7..."
|
|||
|
|
TEXT="Привет 412385"
|
|||
|
|
SMSC="+79585370690"
|
|||
|
|
|
|||
|
|
# Функция: номер → swapped nibbles
|
|||
|
|
format_number() {
|
|||
|
|
local num="${1#+}"
|
|||
|
|
local len=${#num}
|
|||
|
|
if (( len % 2 != 0 )); then
|
|||
|
|
num="${num}F"
|
|||
|
|
fi
|
|||
|
|
local formatted=""
|
|||
|
|
for (( i=0; i<${#num}; i+=2 )); do
|
|||
|
|
formatted="${formatted}${num:i+1:1}${num:i:1}"
|
|||
|
|
done
|
|||
|
|
echo "$formatted"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# --- SMSC ---
|
|||
|
|
SMSC_FMT=$(format_number "$SMSC")
|
|||
|
|
SMSC_DIGITS="${SMSC#+}"
|
|||
|
|
SMSC_LEN=$(printf "%02X" $(( (${#SMSC_DIGITS} + 1) / 2 + 1 )))
|
|||
|
|
SMSC_PART="${SMSC_LEN}91${SMSC_FMT}"
|
|||
|
|
|
|||
|
|
# --- DA (Destination Address) ---
|
|||
|
|
DEST_DIGITS="${NUMBER#+}" # ← убираем плюс
|
|||
|
|
DEST_FMT=$(format_number "$NUMBER")
|
|||
|
|
DEST_LEN=$(printf "%02X" ${#DEST_DIGITS}) # ← длина в цифрах, НЕ с плюсом!
|
|||
|
|
DEST_PART="${DEST_LEN}91${DEST_FMT}"
|
|||
|
|
|
|||
|
|
# --- Текст (UCS2 / UTF-16BE) ---
|
|||
|
|
TEXT_HEX=$(echo -n "$TEXT" | iconv -f UTF-8 -t UTF-16BE | xxd -p | tr 'a-f' 'A-F' | tr -d '\n')
|
|||
|
|
TEXT_LEN_BYTES=$(( ${#TEXT_HEX} / 2 ))
|
|||
|
|
TEXT_LEN_HEX=$(printf "%02X" $TEXT_LEN_BYTES)
|
|||
|
|
|
|||
|
|
# --- TPDU ---
|
|||
|
|
# FO=01, MR=00, DA, PID=00, DCS=08(UCS2), UDL, текст
|
|||
|
|
TPDU="0100${DEST_PART}0008${TEXT_LEN_HEX}${TEXT_HEX}"
|
|||
|
|
TPDU_LEN_DEC=$(( ${#TPDU} / 2 ))
|
|||
|
|
FULL_PDU="${SMSC_PART}${TPDU}"
|
|||
|
|
|
|||
|
|
echo "========================================="
|
|||
|
|
echo "Текст: $TEXT"
|
|||
|
|
echo "HEX текста: $TEXT_HEX"
|
|||
|
|
echo "DA Length: $DEST_LEN (${#DEST_DIGITS} цифр)"
|
|||
|
|
echo "Длина TPDU: $TPDU_LEN_DEC байт"
|
|||
|
|
echo "Итоговая PDU:"
|
|||
|
|
echo "$FULL_PDU"
|
|||
|
|
echo "========================================="
|
|||
|
|
|
|||
|
|
# --- Настройка модема ---
|
|||
|
|
printf 'AT+CMEE=2\r' > "$PORT"; sleep 0.3
|
|||
|
|
printf 'AT+CMGF=0\r' > "$PORT"; sleep 0.3
|
|||
|
|
|
|||
|
|
# --- Чтение ответов в фоне ---
|
|||
|
|
cat "$PORT" &
|
|||
|
|
READER_PID=$!
|
|||
|
|
sleep 0.3
|
|||
|
|
|
|||
|
|
# --- Отправка ---
|
|||
|
|
printf 'AT+CMGS=%d\r' "$TPDU_LEN_DEC" > "$PORT"
|
|||
|
|
sleep 1
|
|||
|
|
printf '%s\x1A' "$FULL_PDU" > "$PORT"
|
|||
|
|
echo 'Отправлен sms ?'
|
|||
|
|
|
|||
|
|
# Ждём ответ (до 30 сек, т.к. сеть может думать долго)
|
|||
|
|
sleep 30
|
|||
|
|
kill $READER_PID 2>/dev/null
|