从串口解码python中的USSD非英语响应

时间:2013-06-08 13:23:54

标签: python serial-port ussd non-english

我用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()

3 个答案:

答案 0 :(得分:0)

一个问题是您指定了编码方案“GSM 7 bit with unspecified language” 在您的AT命令中,这是参数“15”:

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

有关此问题的解释,请参阅规范文档3GPP TS 27.007第7:15节。

英语可以,可以用7位字母表定义 但由于Persion无法通过GSM 7位字母表定义,我想如下所示:调制解调器接收到以某种其他方式定义的字符串(通过8位或16位(UCS)编码方案)。因为调制解调器要么无法处理这种语言,要么无法将字符串与您的7位编码请求进行协调,它只是向您发送整个字符串。

您是否尝试将该字符串分成双八位字节(16位),并将其与波斯字母表匹配?可能你会在那里找到你的信息。

要指定波斯语,您可以尝试00010001(“17”),然后您会收到一个16位字符的字符串,由语言指示符预先设定。但我认为基本上,这就是你已经拥有的。所以也许你必须做自己的解码器。

对不起,更多的是一个灵感的猜测,而不是一个具体的答案。

答案 1 :(得分:0)

这对我来说很有效。我使用的是python gsmmodem和python simplesms。

rpm1.rpm

答案 2 :(得分:0)

您必须重新编码十六进制响应:

hex_ussd =' 97D34B7889877A547B49F9C600E12B944C6C9968D06DFC1855CC842014A0BBA6AE419C5109EC4E0A00'

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

打印good_ussd