首页 > 解决方案 > 如何知道短信发送是失败还是成功?

问题描述

我从 GSM 调制解调器端口创建一个 SMS 网关。我需要验证短信发送是失败还是成功。所以我认为检查失败或成功的方法是检查名为发件箱的消息存储是否成功并且起草失败。
但是,如果我尝试发出 AT 命令来按索引检查存储或打印所有索引中包含的消息,它会返回 nothing

发送消息后的响应:

+CMGS:170

当我阅读时,我们可以使用AT+CMGR命令阅读消息

modem = serial.Serial('COM5', 9600, timeout=0)

modem.write(b'AT+CMGR=170\r')

while True:
    print(modem.read(100))
    input('Type to see response')

我还尝试使用命令AT+CMGR="ALL"打印出存储中的任何内容,但是没有打印出任何消息。

标签: pythonsmspyserialgsmat-command

解决方案


命令AT+CMGS 直接发送短信而不存储它们。在其命令响应中

+CMGS:170

数字 170 只是计数成功发送的累进数字(递增到 255 并从 0 重新开始),它与存储它的 SMS 内存位置完全无关。

但好在只有短信发送成功时调制解调器才会发送响应,否则ERROR返回响应。“发送”是什么意思?就是已经成功发送到短信服务中心。实际发送到 SMS 收件人通常是即时的,但也可能因网络拥塞或收件人不可用而延迟。

只是为了完整性,实际上AT+CMGR=<index>AT+CMGL=ALL可以显示已发送的消息,但仅适用于AT+CMGW在发送之前存储的消息。例如,使用 +CMGL 您可能有 N 行,每行报告:

+CMGL: <index>,<stat>,...

其中可以有以下值:

  • "REC UNREAD"- 新的传入消息
  • "REC READ"- 已阅读传入消息
  • "STO UNSENT"- 存储的消息尚未发送
  • "STO SENT"- 已存储的消息已发送<-- 这一条与您相关

推荐阅读