Skip to content

Instantly share code, notes, and snippets.

@jazzl0ver
Created June 25, 2025 11:22
Show Gist options
  • Save jazzl0ver/605703b051892e28a97c535de0380aa5 to your computer and use it in GitHub Desktop.
Save jazzl0ver/605703b051892e28a97c535de0380aa5 to your computer and use it in GitHub Desktop.
send ussd command
#!/bin/bash
#
# Посылает USSD-запрос, переданный первым параметром командной строки и выводит ответ
#
DEVICE="/dev/ttyS0"
BAUD=115200
TMPLOG="/tmp/ussd.log"
USSD_HEX=$(echo -n "$1" | iconv -f utf-8 -t utf-16be | xxd -p)
# Очистим лог
> "$TMPLOG"
# Открываем модем на чтение и запись
echo "🔌 Открываем устройство $DEVICE..."
exec 3<> "$DEVICE" || { echo "❌ Не удалось открыть $DEVICE"; exit 1; }
stty -F "$DEVICE" $BAUD -echo -icanon time 5 min 0
send_at() {
local CMD="$1"
echo "➡️ Отправка: $CMD"
echo -e "$CMD\r" >&3
for i in {1..10}; do
if read -t 1 -u 3 RAWLINE; then
LINE=$(echo "$RAWLINE" | tr -d '\r')
echo "$LINE" >> "$TMPLOG"
[[ "$LINE" == "OK" ]] && return 0
fi
sleep 1
done
echo "❌ Команда '$CMD' не получила OK"
exit 1
}
# Отправляем команды
send_at "AT"
send_at "AT+CSCS=\"UCS2\""
send_at "AT+CUSD=1,\"$USSD_HEX\",15"
# Ждём ответ USSD
echo "⏳ Ожидание USSD-ответа (до 10 секунд)..."
for i in {1..10}; do
if read -t 1 -u 3 RAWLINE; then
LINE=$(echo "$RAWLINE" | tr -d '\r')
echo "$LINE" >> "$TMPLOG"
echo "$LINE" | grep "+CUSD" && break
fi
done
# Извлечь +CUSD строку
RAWRESPONSE=$(grep "+CUSD" "$TMPLOG" | tail -n1)
RESPONSE=$(echo "$RAWRESPONSE" | tr -d '\r')
HEX=$(echo "$RESPONSE" | cut -f2 -d, | sed -e 's/"//g')
if [ -z "$HEX" ]; then
echo "❌ Не удалось извлечь HEX-ответ"
echo "🔎 Ответ: $RESPONSE"
exit 1
fi
echo "📥 Декодированный ответ:"
echo "$HEX" | xxd -r -p | iconv -f utf-16be -t utf-8
echo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment