commit affaff014106b449828308215de054f6f7bb7e4d Author: TraceLumen Date: Sun Oct 25 07:17:14 2026 +0300 init, docs be added diff --git a/shell/send_sms_gsm.sh b/shell/send_sms_gsm.sh new file mode 100755 index 0000000..b451b27 --- /dev/null +++ b/shell/send_sms_gsm.sh @@ -0,0 +1,240 @@ +#!/bin/bash +# send_sms_gsm_test2.sh — PDU GSM 7-bit, cat-ридер + +PORT="/dev/ttyUSB2" +LOG="/pkg/gnu/unitprint/simd/var/modem_sms.log" +SMSC="+79585370690" + +# ─── Обработка параметров командной строки ───────── +if [ -z "$1" ]; then + echo "Ошибка: Не указан номер получателя." + echo "Использование: $0 <НОМЕР> [ТЕКСТ]" + echo "Пример: $0 +7xxxxxxxxxx \"OTP 412385\"" + exit 1 +fi +NUMBER="$1" + +# Генерируем случайное 6-значное число (от 000000 до 999999) +RAND_NUM=$(printf "%06d" $((RANDOM % 1000000))) +TEXT="${2:-OTP $RAND_NUM}" # ← Если $2 не задан, берем "OTP <случайное_число>" + +# ─── Функция: номер → swapped nibbles ───────────── +format_number() { + local num="${1#+}" + (( ${#num} % 2 != 0 )) && num="${num}F" + local out="" i + for (( i=0; i<${#num}; i+=2 )); do + out+="${num:i+1:1}${num:i:1}" + done + echo "$out" +} + +# ─── GSM 7-bit: ASCII → септеты → packed HEX ────── +# Результат в глобальной TEXT_PACKED (не через echo/субшелл) +declare -a SEPTETS +TEXT_PACKED="" + +build_gsm7() { + local text="$1" i code + SEPTETS=() + for (( i=0; i<${#text}; i++ )); do + printf -v code '%d' "'${text:i:1}" + case $code in + 64) SEPTETS+=(0) ;; + 36) SEPTETS+=(2) ;; + 10) SEPTETS+=(10) ;; + 13) SEPTETS+=(13) ;; + 95) SEPTETS+=(17) ;; + *) SEPTETS+=($code) ;; + esac + done + + local n=${#SEPTETS[@]} + local oct_count=$(( (n * 7 + 7) / 8 )) + local -a oct + for (( i=0; i 1 )) && (( bi+1 < oct_count )); then + oct[$((bi+1))]=$(( oct[$((bi+1))] | (v >> (8 - bo)) )) + fi + done + + TEXT_PACKED="" + for (( i=0; i/dev/null; then + return 0 + fi + sleep 0.02 + done + return 1 +} + +# ─── Запуск cat-ридера ───────────────────────────── +> "$LOG" +stty -F "$PORT" 115200 raw -echo 2>/dev/null +cat "$PORT" >> "$LOG" 2>/dev/null & +READER_PID=$! + +# ─── Инициализация ───────────────────────────────── +printf 'AT\r' > "$PORT"; wait_in_log 3000 "OK" +printf 'AT+CMEE=2\r' > "$PORT"; wait_in_log 3000 "OK" +printf 'AT+CMGF=0\r' > "$PORT"; wait_in_log 3000 "OK" + +# ─── Отправка ────────────────────────────────────── +> "$LOG" # очистка перед CMGS +START=$(date +%s%N) +printf 'AT+CMGS=%d\r' "$TPDU_LEN" > "$PORT" + +# Ждём ">" в логе +if ! wait_in_log 5000 ">"; then + echo "ERROR: не получили >" + cat "$LOG" + kill $READER_PID 2>/dev/null + exit 1 +fi + +printf '%s\x1A' "$FULL_PDU" > "$PORT" + +# Ждём +CMGS или ошибку +if wait_in_log 30000 "+CMGS"; then + ELAPSED=$(( ($(date +%s%N) - START) / 1000000 )) + echo "OK: отправлено за ${ELAPSED} мс" + grep "+CMGS" "$LOG" +elif wait_in_log 2000 "CMS ERROR"; then + echo "ERROR от модема:" + grep -a "CMS ERROR" "$LOG" +else + echo "TIMEOUT: нет ответа" + cat "$LOG" +fi + +kill $READER_PID 2>/dev/null +rm -f "$LOG" diff --git a/shell/send_sms_ucs2.sh b/shell/send_sms_ucs2.sh new file mode 100755 index 0000000..a257805 --- /dev/null +++ b/shell/send_sms_ucs2.sh @@ -0,0 +1,70 @@ +#!/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