如何写一个AT+CUSD ussd命令来支持最大手机数量

How to write a AT+CUSD ussd command to support maximum handsets

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

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

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

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

而在索尼爱立信 K750 上:

AT+CUSD=1,"*123#"

如果我给第三个参数就报错

命令在27.007中定义,语法给出为

+CUSD=[<n>[,<str>[,<dcs>]]]

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

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

Implementation of the GSM 7 bit default alphabet is mandatory. Support of other character sets is optional.

因此,如果诺基亚设备出现 AT+CUSD=1,"*123#" 错误,我会将其解释为它不支持任何德语,因此会失败。至于 Sony Ericsson phone 我不能说如果给定任何值的 <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.,尽管这可能不适用于所有 phone)。

由于您正在检查您在任何情况下发出的任何 AT 命令的最终结果代码(您是,对吗?),实现一个后备算法:

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

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


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


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

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

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


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