如何编写 AT+CUSD ussd 命令以支持最大手机数量

Sye*_*hiq 5 ussd at-command

我面临与命令相关的问题AT+CUSD。在某些 Gsm 调制解调器上,此命令需要三个参数,而在其他调制解调器上,它只需要两个参数。此外,这些参数的值不同。

我想知道,如何配置Gsm调制解调器,以便该命令可以在大多数Gsm调制解调器上以统一的方式执行。

例如:在诺基亚 c6-01上,只有这样才能成功执行 cusd 命令:

AT+CUSD=1,"*123#",15
Run Code Online (Sandbox Code Playgroud)

而在索尼爱立信 K750 上:

AT+CUSD=1,"*123#"
Run Code Online (Sandbox Code Playgroud)

如果我给出第三个参数,它会出错。

hlo*_*dal 5

该命令在27.007中定义,语法如下

+CUSD=[<n>[,<str>[,<dcs>]]]
Run Code Online (Sandbox Code Playgroud)

所以实际上所有参数都是可选的,并且使用 0、1、2 或 3 个参数调用命令都是有效的。

关于该值,据我所知<dsc>,其指定的默认值 0 映射到带有德语的 GSM 7 位默认字母表,而值 15 是根据23.038没有任何特定语言的 GSM 7 位默认字母表。它还说

GSM 7 位默认字母表的实施是强制性的。其他字符集的支持是可选的。

因此,如果诺基亚设备出现错误,AT+CUSD=1,"*123#"我会将其解释为它没有任何德语支持,因此会失败。至于索尼爱立信手机,如果给定<dcs>任何值的参数都失败,我无法说出为什么它会失败(当然,它会失败的几个值,但它应该支持 15 个)。尝试迭代这些语言,看看是否有任何命中(例如是否支持英语?)。

您可以尝试以其他方式指定 GSM 7 位,例如 32(或者可能通过探索Any reserved codings shall be assumed to be the GSM 7 bit default alphabet (the same as codepoint 00001111) by a receiving entity.,尽管这可能不适用于所有手机)。

由于您在任何情况下都会检查您发出的任何 AT 命令的最终结果代码(您是,对吧?),因此实现后备算法并不需要太多额外的工作:

  1. 首先尝试使用 dcs = 15 调用
  2. 如果失败则使用 dcs = 32 调用
  3. 最后,如果以上都失败,请尝试不使用 dcs。

AT+CUSD这应该是在大量手机上调用的最便携的方式。


顺便说一下,请注意27.007 规范中0的值带有下划线。<n>这有点微妙,但这意味着它是一个默认值,没有明确说明(<dsc>例如,就像这样做的那样)。所以AT+CUSD=与 相同AT+CUSD=0(实际上,您甚至可以调用AT+CUSD=,"*123#"与 相同AT+CUSD=0,"*123#",尽管您可能会遇到无法正确解析此内容的电话。索尼爱立信早期生产的所有电话/调制解调器,以及几乎所有后来生产的电话/调制解调器,以及基于ST-Ericsson的平台将正确解析此内容)。


如果您想自动化测试,可以使用我的 atinout程序来实现,例如:

echo ATE1 | atinout - /dev/ttyACM0 -
for i in $(seq 0 15) 32; \
do \
        echo AT+CUSD=1,"xxxx",$i; \
done | atinout - /dev/ttyACM0 -
Run Code Online (Sandbox Code Playgroud)

如果您的调制解调器设备是 /dev/ttyASM0。


更新:您为字符串选择的字符集很可能是这里的问题,如本答案中所述。尝试运行一下AT+CSCS="GSM",看看是否有帮助。