3

Python で USSD リクエストを送信し、レスポンスを出力します。私の英語の応答は正しいですが、USSDの応答が英語でない場合、次のような結果になります

97D34B7889877A547B49F9C600E12B944C6C9968D06DFC1855CC842014A0BBA6AE419C5109EC4E0A00

ペルシャ語の応答を取得するにはどうすればよいですか?

私のコード:

phone = serial.Serial("COM4",  115200, timeout=5)
try:
    phone.write(b'AT+CUSD=1,\"*140*11#\",15\r')
    print b'AT+CUSD=1,\"*140*11#\",15\r'
    time.sleep(.5)
    print phone.readall()
finally:
    phone.close()
4

3 に答える 3

2

16 進数の応答を再エンコードする必要があります。

hex_ussd = '97D34B7889877A547B49F9C600E12B944C6C9968D06DFC1855CC842014A0BBA6AE419C5109EC4E0A00'

good_ussd = unicode(hex_ussd.decode('hex'), 'utf-16-be').encode('utf8')

print good_ussd
于 2016-02-29T18:06:19.880 に答える
0

問題の 1 つは、AT コマンドでコーディング スキーム「GSM 7 bit with unspecified language」を指定したことです。これはパラメーター「15」です。

AT+CUSD=1,\"*140*11#\",15\r

この説明については、仕様文書 3GPP TS 27.007 セクション 7:15 を参照してください。

これは、7 ビットのアルファベットで定義できる英語の場合は問題ありません。
しかし、Persion は GSM 7 ビット アルファベットでは定義できないため、次のようなものだと思います: モデムが別の方法 (8 ビットまたは 16 ビット (UCS) コーディング スキーム) で定義された文字列を受信した)。モデムはこの言語を処理できないか、文字列と 7 ビット コーディングの要求を一致させることができないため、単に文字列全体を送信します。

その文字列を 2 つのオクテット (16 ビット) に分割し、それをペルシャ語のアルファベットに一致させてみましたか? きっとあなたのメッセージがそこにあるはずです。

ペルシア語を指定するには、00010001 ("17") を試すことができます。すると、言語インジケータが前に付いた 16 ビット文字の文字列を受け取ることが期待されます。しかし、本質的に、それはあなたがすでに持っているものだと思います。そのため、独自のデコーダーを作成する必要があるかもしれません。

申し訳ありませんが、具体的な答えというよりも、インスピレーションを得た推測です。

于 2013-06-14T09:26:56.200 に答える
0

これは私にとって完璧に機能します。私は python gsmmodem と python simplesms を使用しています。

pip install python-gsmmodem
pip install simplesms



from gsmmodem.modem import GsmModem
from simplesms import pdu as gsmpdu
PORT = '/dev/ttyUSB0' #Port your gsm modem is connected to.
PIN = None # SIM card PIN (if any)
BAUDRATE = 115200
USSD_STRING = '*140*11#'

modem = GsmModem(PORT, BAUDRATE)
modem.connect(PIN)
modem.waitForNetworkCoverage(10)

#encode ussd string
encoded_ussd_strint = gsmpdu.encode(USSD_STRING)

#send encoded ussd string
response = modem.sendUssd(encoded_ussd_strint)

#decode encoded ussd response
decoded_response = gsmpdu.decode(response.message)

print 'USSD reply received: {0}'.format(decoded_response)
if response.sessionActive:
    print 'Closing USSD session.'
    # At this point, you could also reply to the USSD message by using response.reply()
    response.cancel()
else:
    print 'USSD session was ended by network.'
于 2015-09-29T06:35:04.630 に答える