python - 如何知道短信发送是失败还是成功?
问题描述
我从 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"
打印出存储中的任何内容,但是没有打印出任何消息。
解决方案
命令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"
- 已存储的消息已发送<-- 这一条与您相关
推荐阅读
- r - 如何在R中的向量中返回最大值
- python - 选择奇数行和列
- arrays - 计算器程序
- ef-core-2.1 - EF Core Set Identity Insert On 和 SaveChanges
- ruby-on-rails - Rails:如何在 Rails 中有五个不同的用户模型时实现登录和身份验证?
- distributed - Raft 如何处理 AppendEntries RPC 中的延迟回复?
- android - 活动本质上是应用程序的文件/页面吗?
- javascript - 无法在 jQuery 中存储特定的目标值
- sharepoint - 如何使用 Microsoft Flow 重命名 SharePoint 文件夹
- database - 如何加快从美国到印度数据库的数据库连接?