Files
simd/shell/send_sms_ucs2.sh
2026-10-25 07:32:43 +03:00

71 lines
2.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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