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

从串行端口解码python中的USSD非英语响应,python,serial-port,ussd,non-english,Python,Serial Port,Ussd,Non English,我用python发送USSD请求并打印响应。我的英语回答是正确的,但当USSD的回答不是英语时,我会得到类似的回答 97D34B7889877A547B49F9C600E12B944C6C9968D06DFC1855C842014A0BBA6AE419C5109EC4E0A00 我怎样才能得到波斯人的回应 我的代码: phone = serial.Serial("COM4", 115200, timeout=5) try: phone.write(b'AT+CUSD=1,\"*140*

我用python发送USSD请求并打印响应。我的英语回答是正确的,但当USSD的回答不是英语时,我会得到类似的回答

97D34B7889877A547B49F9C600E12B944C6C9968D06DFC1855C842014A0BBA6AE419C5109EC4E0A00

我怎样才能得到波斯人的回应

我的代码:

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

一个问题是您指定了一个编码方案“GSM 7位未指定语言” 在AT命令中,这是参数“15”:

请参阅规范文件3GPP TS 27.007第7:15节以了解此说明

这对英语来说没问题,它可以用7位字母表来定义。
但是,由于Persion不能由GSM 7位字母表定义,我猜是这样的:调制解调器接收到以其他方式定义的字符串(通过8位或16位(UCS)编码方案)。因为调制解调器不能处理这种语言,或者不能使字符串与您的7位编码请求相一致,所以它只发送整个字符串

你有没有试过把这个字符串分成两个八位字节(16位),然后和波斯字母表匹配?也许你会在那里找到你的信息

要指定波斯语,您可以尝试0000001(“17”),然后您将期望收到一个由16位字符组成的字符串,该字符串由语言指示符预先指定。但我认为基本上,这就是你已经拥有的。所以,也许你必须自己去编码


对不起,与其说是一个具体的答案,不如说是一个启发性的猜测。

这对我来说非常合适。我使用的是python gsmmodem和python SimpleMs

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.'

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

hex_ussd = '97D34B7889877A547B49F9C600E12B944C6C9968D06DFC1855CC842014A0BBA6AE419C5109EC4E0A00'

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

print good_ussd

这是一个旧线程,但如果您对pygsm有问题,请从下载它并将其作为模块放在python站点包文件夹中。它将链接到您的包,代码将顺利运行。对于Python 3000:
good\u ussd=bytes.fromhex(hex\u ussd).decode('utf8')
hex_ussd = '97D34B7889877A547B49F9C600E12B944C6C9968D06DFC1855CC842014A0BBA6AE419C5109EC4E0A00'

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

print good_ussd