From 2d0be0500d1e0fc73e2aa2ebf213eeacada63426 Mon Sep 17 00:00:00 2001 From: TraceLumen Date: Mon, 26 Oct 2026 05:33:58 +0300 Subject: [PATCH] fix checking UDL lenth for different encoding and different formats --- shell/send_sms.sh | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/shell/send_sms.sh b/shell/send_sms.sh index 0031fa6..2b6b5da 100755 --- a/shell/send_sms.sh +++ b/shell/send_sms.sh @@ -68,9 +68,9 @@ EOF die() { echo "ERROR: $*" >&2; exit 1; } -# ══════════════════════════════════════════════════════════════════ +# ═════════════════════════════════════════════════════════════════ # РАЗБОР АРГУМЕНТОВ -# ══════════════════════════════════════════════════════════════════ +# ═════════════════════════════════════════════════════════════════ POSITIONAL=() while (( $# > 0 )); do case "$1" in @@ -241,10 +241,15 @@ build_gsm7() { } build_ucs2() { - local raw - raw=$(printf '%s' "$1" | iconv -f UTF-8 -t UTF-16BE 2>/dev/null) || die "iconv: неверная UTF-8 строка" - TEXT_HEX=$(printf '%s' "$raw" | xxd -p | tr -d '\n' | tr 'a-f' 'A-F') - UDL=$(( ${#TEXT_HEX} / 2 )) + # iconv → xxd напрямую, без сохранения в переменную (bash не держит \x00) + TEXT_HEX=$(printf '%s' "$1" | iconv -f UTF-8 -t UTF-16BE 2>/dev/null \ + | xxd -p | tr -d '\n' | tr 'a-f' 'A-F') + + if [[ -z "$TEXT_HEX" ]]; then + die "iconv: не удалось сконвертировать текст в UTF-16BE" + fi + + UDL=$(( ${#TEXT_HEX} / 2 )) # для UCS2 это БАЙТЫ, не символы } # ══════════════════════════════════════════════════════════════════ @@ -254,8 +259,15 @@ build_ucs2() { if [[ "$ENCODING" == "gsm" ]]; then build_gsm7 "$TEXT"; else build_ucs2 "$TEXT"; fi -MAX_UDL=160 -[[ "$ENCODING" == "ucs2" ]] && MAX_UDL=70 +# ══════════════════════════════════════════════════════════════════ +# ПРОВЕРКА ДЛИНЫ (ИСПРАВЛЕНО) +# ══════════════════════════════════════════════════════════════════ +if [[ "$ENCODING" == "ucs2" ]]; then + MAX_UDL=140 # Лимит в БАЙТАХ для UCS2 (140 байт = 70 символов) +else + MAX_UDL=160 # Лимит в СЕПТЕТАХ для GSM 7-bit +fi + (( UDL <= MAX_UDL )) || die "текст длиннее одного SMS ($UDL > $MAX_UDL). Нужна конкатенация/UDH" FO=$(build_fo) @@ -266,16 +278,18 @@ VP_HEX="" [[ -n "$VALIDITY_MIN" ]] && VP_HEX=$(build_vp "$VALIDITY_MIN") build_da "$RECEIVER" "$TOA" +DA_PART="$DA_HEX" -SMSC_HEX="" +SMSC_PART="" if (( USE_SMSC )); then build_smsc "$SMSC" 91 + SMSC_PART="$SMSC_HEX" fi # [FO][MR][DA][PID][VP?][DCS][UDL][UD] -TPDU="${FO}${MR_HEX}${DA_HEX}00${VP_HEX}${DCS}${UDL_HEX}${TEXT_HEX}" +TPDU="${FO}${MR_HEX}${DA_PART}00${VP_HEX}${DCS}${UDL_HEX}${TEXT_HEX}" TPDU_LEN=$(( ${#TPDU} / 2 )) -FULL_PDU="${SMSC_HEX}${TPDU}" +FULL_PDU="${SMSC_PART}${TPDU}" echo "FO=$FO MR=$MR_HEX PID=00 DCS=$DCS UDL=$UDL_HEX VP=${VP_HEX:-none}" echo "CLASS=${CLASS:-не задан} ENCODING=$ENCODING"