运行 GSM 调制解调器上的 USSD 命令(可能编码错误)

Running USSD command on GSM modem (wrong Encoding maybe)

我正在尝试使用 GSM 调制解调器执行 USSD 命令。

AT+CUSD=1,"*200#",15

我得到的结果不可读

"+CUSD: 0,"Æ·ÜNÓu9XŽt�¤å1:,?—u0Œt�ši7è,Óëizy®ƒ5ÓnÔL»Ai7½,w‡éé·;Ì.ÏAòòœvÓËs�ÖL»",15"

当我在移动设备 phone 上使用相同的 sim 尝试相同的 ussd 代码时,我得到了正确的结果,即

"Forfait: 909DA. Recharchege:0.0DA Min gratuites: 0Min. Min internationales restantes :0Min"

将字符集 AT+CSCS 从 GSM 更改为 IRA 或 PCCP、PCDN、8859-1 不会更改响应,它是完全相同的响应

将 AT+CSCS 更改为十六进制给我一个错误:

AT+CSCS="HEX"
AT+CUSD=1,"*200#",15 

OK
+CUSD: 2,"Unexpected Data Value",15
+CUSD: 2,"Unexpected Data Value",15
ERROR

并将其更改为 UCS2 并调用 USSD 使我的调制解调器重新启动

AT+CSCS="UCS2"
AT+CUSD=1,"*200#",15 

AT+CUSD命令在27.007中指定,主动结果代码的格式定义为+CUSD: <m>[,<str>,<dcs>].

从您收到的回复中,您可以看到 <m>0<dcs>15,此外还有 <str> 的乱码方式并不简单地直接映射到 AT+CSCS 字符编码;有一整节专门解释它的介绍,您必须进一步研究。

查找 27.007 中引用的 23.038 标准,<dcs> 值 15 映射到 未指定语言 但阅读上面的文本似乎也与 [=34 相同=]GSM 7 位默认字母表.

所以是的,您对编码问题的怀疑是正确的,不幸的是,标准对此不是很直观,您必须深入研究。

为了调试这个,我将从设置 AT+CSCS="HEX" 开始并验证接收到的数据在解码时是否有意义,然后努力以可用的格式呈现它或者可能在软件中从十六进制显式解码它你自己(但请注意,更改 AT+CSCS 然后从那时起适用于所有字符串,包括 AT+CSCS<chset> 参数,当你稍后想将​​编码更改为其他内容时......)

AT+CMGF=0

AT+CSCS=十六进制

AT+CUSD=1,"*123#", 15

获取结果并将ussd pdu转换为文本

python 库: https://pypi.org/project/PDUUSSDConverter/

直接回答。祝你好运