LINUX.ORG.RU

Кодирование запросов и декодирование ответов USSD

 , , , ,


0

1

Нашёл в сети скрипт для кодирования/декодирования USSD запросов/ответов.

#!/bin/bash

# ussd.sh v1.0 (22.06.2013) by Shumaher
##########################

SCRIPTVER='ussd.sh v1.0 (22.06.2013) by Shumaher'

echo $SCRIPTVER
echo
echo

decodeUCS2()	# UCS to text
{
    bytes=$(echo -n $1 | sed "s/\(.\{2\}\)/\\\x\1/g")
    REPLY=$(printf $bytes | iconv -f UCS-2BE -t UTF-8)
	echo "$REPLY"
}

encodePDU()		# text to PDU
{
    in=$1
    let "in_len=${#in}-1"
    for chr in $(seq  0 $in_len)
    do
        let "chr2=$chr+1"
        let "t=$chr%8+1"
        if [ "$t" -ne 8 ]; then
            byte=$(printf "%d" "'${in:$chr:1}")
            let "c=$byte>>($chr%8)"
            let "c2=(1<<$t)-1"
            byte2=$(printf "%d" "'${in:$chr2:1}")
            let "b=$byte2 & $c2"
            let "c=$b<<(8-$t) | $c"
            REPLY=$REPLY$(echo "obase=16; $c" | bc | sed "s/^\(.\{,1\}\)$/0\1/")
        fi
    done
	echo "$REPLY"
	echo
	echo "AT-command to send '$1' as USSD-request: AT+CUSD=1,\"$REPLY\",15"
}

helpmsg()
{
	echo "Type '`basename $0` *USSD*command#' to convert USSD-request to PDU"
	echo "or   '`basename $0` UCS2-message'   to convert UCS2-encoded USSD-answer to UTF8."
	echo
}

if [ $# -eq 0 ]
then
	helpmsg
elif [ $# -eq 1 ] && echo -n $1 | grep -q '^[#|\*].*'
then
	encodePDU "$1"
elif [ $# -gt 1 ]
	then
	echo "Invalid argument."
	helpmsg
else
	decodeUCS2 "$1"
fi
echo

Что-то не получается кодировать команду.

$ sh ussd.sh *102#
ussd.sh v1.0 (22.06.2013) by Shumaher
ussd.sh: 23: ussd.sh: let: not found
AT-command to send '*102#' as USSD-request: AT+CUSD=1,"",15



Последнее исправление: viktor76876 (всего исправлений: 1)

Ответ на: комментарий от Nirvandil

$ bash ./ussd.sh *102#

Спасибо! Заработало. А как декодировать ответ от оператора? Ответ приходит не в ucs, а в gsm 7 bit. При попытке декодирования - ошибка

iconv: illegal input sequence at position 6
훰ᰍኇ

viktor76876
() автор топика
Ответ на: комментарий от viktor76876

Я тоже. Но он и не нужен, походу. См. http://git.savannah.gnu.org/cgit/libiconv.git/tree/NOTES (Вопрос «How do I add a new character set», ответ см. начиная с п.4). Ещё см. коммит 614f279f в том же репозитории - как пример добавления кодировки (tools/Makefile, по-моему, менять не нужно).

Sorcerer ★★★★★
()

А почему не используется ofono? И не на всех модемах такое заработает на самом деле. Но можно попробовать. И да, использовать sh (который скорее всего ash или dash) для скрипта, которому нужен bash, неправильно.

slapin ★★★★★
()
Ответ на: комментарий от ZenitharChampion

Все же хочется заставить работать имеющийся скрипт.

viktor76876
() автор топика
Ответ на: комментарий от slapin

И да, использовать sh (который скорее всего ash или dash) для скрипта, которому нужен bash, неправильно.

Скрипт не мой. Найден в сети.

И не на всех модемах такое заработает на самом деле.

Мне автоматизация не нужна. Я просто хочу «скормить» скрипту команду *XXX#, и получить ответ, который можно отправить модему. Ответ модема на USSD запрос - «скормить» скрипту и получить читабильный текст.

viktor76876
() автор топика
Ответ на: комментарий от viktor76876

из тех, которые умеют правильно расшифровать PDU с кириллицей я знаю только ofono и gsm0710muxd от OpenMoko.

slapin ★★★★★
()
Ответ на: комментарий от viktor76876

Разобрался. Проблема с правами была. Теперь при выполнении make ошибка

./encodings.def:156:1: note: in expansion of macro 'DEFENCODING'
 DEFENCODING(( "GSM-7",
 ^
make[1]: *** [iconv.lo] Error 1
make[1]: Leaving directory `/home/user/libiconv-1.14/lib'
make: *** [all] Error 2
DEFENCODING(( "GSM-7",
              "GSM7",
            ),
            gsm7,
            { gsm7_mbtowc, NULL },     { gsm7_wctomb, NULL })

viktor76876
() автор топика
Ответ на: комментарий от viktor76876

Вы это не соберёте, - тем неочевидные скрипты сборки. Лучше попробуйте собрать iconv из glibc, он вроде недалеко отошёл от оригинального. Но какие файлы где править, - это вам придётся самостоятельно догадаться. :)

Sorcerer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.