fix checking UDL lenth for different encoding and different formats
This commit is contained in:
@ -68,9 +68,9 @@ EOF
|
|||||||
|
|
||||||
die() { echo "ERROR: $*" >&2; exit 1; }
|
die() { echo "ERROR: $*" >&2; exit 1; }
|
||||||
|
|
||||||
# ══════════════════════════════════════════════════════════════════
|
# ═════════════════════════════════════════════════════════════════
|
||||||
# РАЗБОР АРГУМЕНТОВ
|
# РАЗБОР АРГУМЕНТОВ
|
||||||
# ══════════════════════════════════════════════════════════════════
|
# ═════════════════════════════════════════════════════════════════
|
||||||
POSITIONAL=()
|
POSITIONAL=()
|
||||||
while (( $# > 0 )); do
|
while (( $# > 0 )); do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@ -241,10 +241,15 @@ build_gsm7() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
build_ucs2() {
|
build_ucs2() {
|
||||||
local raw
|
# iconv → xxd напрямую, без сохранения в переменную (bash не держит \x00)
|
||||||
raw=$(printf '%s' "$1" | iconv -f UTF-8 -t UTF-16BE 2>/dev/null) || die "iconv: неверная UTF-8 строка"
|
TEXT_HEX=$(printf '%s' "$1" | iconv -f UTF-8 -t UTF-16BE 2>/dev/null \
|
||||||
TEXT_HEX=$(printf '%s' "$raw" | xxd -p | tr -d '\n' | tr 'a-f' 'A-F')
|
| xxd -p | tr -d '\n' | tr 'a-f' 'A-F')
|
||||||
UDL=$(( ${#TEXT_HEX} / 2 ))
|
|
||||||
|
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
|
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"
|
(( UDL <= MAX_UDL )) || die "текст длиннее одного SMS ($UDL > $MAX_UDL). Нужна конкатенация/UDH"
|
||||||
|
|
||||||
FO=$(build_fo)
|
FO=$(build_fo)
|
||||||
@ -266,16 +278,18 @@ VP_HEX=""
|
|||||||
[[ -n "$VALIDITY_MIN" ]] && VP_HEX=$(build_vp "$VALIDITY_MIN")
|
[[ -n "$VALIDITY_MIN" ]] && VP_HEX=$(build_vp "$VALIDITY_MIN")
|
||||||
|
|
||||||
build_da "$RECEIVER" "$TOA"
|
build_da "$RECEIVER" "$TOA"
|
||||||
|
DA_PART="$DA_HEX"
|
||||||
|
|
||||||
SMSC_HEX=""
|
SMSC_PART=""
|
||||||
if (( USE_SMSC )); then
|
if (( USE_SMSC )); then
|
||||||
build_smsc "$SMSC" 91
|
build_smsc "$SMSC" 91
|
||||||
|
SMSC_PART="$SMSC_HEX"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# [FO][MR][DA][PID][VP?][DCS][UDL][UD]
|
# [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 ))
|
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 "FO=$FO MR=$MR_HEX PID=00 DCS=$DCS UDL=$UDL_HEX VP=${VP_HEX:-none}"
|
||||||
echo "CLASS=${CLASS:-не задан} ENCODING=$ENCODING"
|
echo "CLASS=${CLASS:-не задан} ENCODING=$ENCODING"
|
||||||
|
|||||||
Reference in New Issue
Block a user