#!/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