我有一个连接到我的计算机的 GSM 调制解调器,我想使用我编写的 python 程序接收发送给它的文本消息,我只是想知道什么是轮询数据的最佳技术。
我是否应该编写一个具有无限循环的程序,该循环不断检查传入的短信,即在循环内,程序发送 AT 命令并读取输入数据。或者调制解调器是否有一种方法可以向应用程序发送传入数据(短信)的信号。
我试图想象手机只是一个 GSM 调制解调器,当收到短信时,手机会提醒您该事件,或者手机软件是否有一个无限循环来轮询传入的数据。
我有一个连接到我的计算机的 GSM 调制解调器,我想使用我编写的 python 程序接收发送给它的文本消息,我只是想知道什么是轮询数据的最佳技术。
我是否应该编写一个具有无限循环的程序,该循环不断检查传入的短信,即在循环内,程序发送 AT 命令并读取输入数据。或者调制解调器是否有一种方法可以向应用程序发送传入数据(短信)的信号。
我试图想象手机只是一个 GSM 调制解调器,当收到短信时,手机会提醒您该事件,或者手机软件是否有一个无限循环来轮询传入的数据。
我以前写过类似的东西。有一种方法可以使用 AT 命令告诉调制解调器在每次收到 SMS 时向您发出信号。
作为参考,我在嵌入式应用程序中使用了Maestro 100 GSM 调制解调器。
首先,您必须正确初始化调制解调器。我使用的是 SMS 的文本模式,但您可能使用了不同的方式。从这些中挑选你想要的。AT+CNMI 是最重要的。
AT&F0 # Restore factory defaults
ATE0 # Disable command echo
AT+CMGF=1 # Set message format to text mode
AT+CNMI=1,1,0,1,0 # Set new message indicator
AT+CPMS="SM","SM","SM" # Set preferred message storage to SIM
然后,您将等待消息通知,如下所示。(不匹配索引号,通知之间可能不同)
+CMTI: "SM",0 # Message notification with index
当您收到该通知时,检索未读短信:
AT+CMGL="REC UNREAD" # Retrieve unread messages
我建议您也添加一个民意调查,也许每 5 分钟左右一次,以防您错过通知。使用串行通讯,您永远无法确定!
我发现我不记得很多与 SMS 相关的 AT 命令集。安德烈米勒的回答似乎敲响了几个钟声。无论如何,您应该非常仔细地阅读文档,我敢肯定有一些陷阱。
我对轮询的建议是至少每 5 秒一次——这只是为了在断开连接时保持稳健性和响应能力。
我使用状态机在初始化、读取和删除消息之间导航。