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