【问题标题】:AT+CMGS - Can not excape text input modeAT+CMGS - 无法摆脱文本输入模式
【发布时间】:2020-02-12 23:02:59
【问题描述】:

我正在使用 PuTTY 连接到 industrial cellular router,通过 AT-Commands 发送短信。

在 PuTTY 中,我选择 Telnet 并在端口 23 上连接到路由器的 IP 地址:

Router loging: root
Password: ****
# gsmat ATE1                         // turn echo on

OK

# gsmat AT+CMGF=1                    // switch to text mode (0 = PDU mode)

OK

# gsmat AT+CMGS=\"0664XXXXXXXX"     // "tel. number"
> Test message [ENTER]              // new line (expected)
> [Ctrl-Z]                          // nothing happens, also with Alt+0026, etc.
> [Ctrl-D]
> -sh: syntax error: unterminated quoted string
#

我通常应该在 Ctrl+Z 上发送 SMS(根据文档、论坛等),但没有任何反应。 所以我尝试了以下方法:

  • ASCII 码:[Alt+0026] 代替 (Ctrl+Z),没有任何反应,十六进制:0x1A
  • 从 Notepad++ 复制并粘贴 [SUB],没有任何反应(将普通文本复制并粘贴到 PuTTY 中可以正常工作)
  • [Ctrl-Y] 在某些论坛中的建议,可能是因为德语键盘布局(也没有任何反应)
  • [Ctrl-D],语法错误,输入转义,当然发送失败

我还尝试了不同的工具,例如超级终端、来自 CMD 的 SSH、Hercules tool、...

还有其他人知道如何在这种情况下转义这种文本输入模式吗?

我的目标是通过 C# 服务自动发送 SMS,我只需在输入中添加 (char)26 即可。

inputString = message.Length > 160 ? message.Substring(0, 160) : message;
inputString += (char)26;
connector.Write(inputString);

欢迎提出任何建议

Screenshot: PuTTY connection settings
Screenshot: PuTTY terminal input

【问题讨论】:

  • 您在 Ctrl+D 之后得到的错误似乎与 Telnet shell 相关,而不是调制解调器故障。据我所知,在 CTRL+Z 之后,您应该简单地等待(甚至可能需要几十秒),然后得到 OK 或 ERROR。
  • 您是否可以直接连接到调制解调器的串行端口而不使用该 shell 实用程序?这只是为了了解导致问题的组件。
  • @Cubo78 是的 Ctrl+D 只是最后一次尝试以某种方式退出文本输入模式。在 Ctrl+Z 发生 nothing 后,我已经等了几分钟。我很确定 0x1A 写在那里,只是因为文本输入模式而没有发送
  • 我不使用串口。我通过以太网 TCP/IP 连接到路由器。我可以通过浏览器访问路由器 WebGUI 进行设置。阅读消息等也可以正常工作。问题只是我认为发送消息的“命令”(Ctrl + Z)没有正确注册。我认为这可能是 PuTTY 的问题,但是在测试了不同的工具(超级终端,也可以通过 CMD 进行 SSH)之后,问题仍然存在
  • 我知道您是通过 TCP/IP 连接的。但是调制解调器通常可以(也)物理地访问,并且通常可以通过您可以在设备上找到的 USB/串行端口来完成。

标签: sms telnet putty gsm at-command


【解决方案1】:

问题似乎与 SMSC 号码有关。 AT+CSCA="+SMSC 号码"\r\n 解决了问题

【讨论】:

    【解决方案2】:

    根据几个互联网来源,例如this oneCTRL+Z是一个让你的捷径

    把你正在运行的任何东西放到一个挂起的后台进程中。输入 fg 来恢复它

    这似乎正是您所经历的:CTRL+Z 字符实际上从未发送过,这就是调制解调器从不发送响应的原因。

    据我所知,发送 ASCII 0x1A(十进制 26)应该可以被 PuTTY 正确识别。但既然你已经尝试过了,肯定还有其他问题,必须进行不同的尝试。 幸运的是,可以禁用进程挂起功能:如PuTTY user guide 所示,该功能称为键盘发送 Telnet 特殊命令

    为了禁用它:

    1. 打开 PuTTy 配置
    2. 类别连接 -> Telnet
    3. 取消标记键盘发送 Telnet 特殊命令 选项

    【讨论】:

    • 我查看了这个设置,它似乎默认未选中。我尝试了两种方法,但结果是一样的。 ASCII 0x1A 应该在没有 [ENTER] 的情况下被识别,对吧?也许我应该尝试使用其他工具,您有什么建议吗?
    • 不,抱歉。你能嗅探以太网连接上的数据吗?只是为了确定实际发送到设备的内容以及 PuTTy 过滤的内容。另一个问题:您是否尝试过以 ASCII 格式发送数据而之前没有尝试使用 CTRL-Z?也许,在过去,您可以在 ctrl-z 之后尝试 ASCII 解决方案。在那种情况下,我们知道由于“暂停的进程”,它无论如何都不会起作用。
    【解决方案3】:

    我所做的是通过 PDU 模式发送短信。稍微费点力,但自动发送短信要好得多。

    【讨论】:

    • 您使用哪个库将文本转换为 PDU?
    • 我自己实现了一个....它是针对嵌入式环境的,我用 C 语言编写的。编写起来并不难,尽管我确信它可能有一些好的库
    • 如果问题出在 PuTTy 对 CTRL+Z 的解释方式上,恐怕使用 PDU 格式并不能解决问题..
    猜你喜欢
    • 1970-01-01
    • 2016-05-15
    • 2014-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多