重新连接断开的GSM调制解调器的功能/AT命令是什么?
我有一个GSM调制解调器,它过一段时间就会断开连接,可能是因为信号太弱。我想知道有没有AT命令可以检测到断开连接,并重新建立连接。
有没有什么方法可以用代码(最好是Python)来检测断开连接并重新建立连接呢?
Gath
3 个回答
你可以定期检查信号强度,使用命令 AT+CSQ。如果信号低于某个标准,就可以认为你已经断开连接了,这时候可以强制重新连接。
你可以试试很不错的 pyserial 这个 Python 库,地址是 http://pyserial.sourceforge.net/,它可以帮助你把 AT 命令发送到调制解调器。
希望这些对你有帮助。
这是我在使用Telit设备时的做法:
我使用AT+CGREG=1
来订阅一些不请自来的消息。以下是文档中的摘录:
+CGREG - GPRS Network Registration Status
AT+CGREG=[<n>]
Set command controls the presentation of an unsolicited result code
+CGREG: (see format below).
Parameter:
<n> - result code presentation mode
0 - disable network registration unsolicited result code
1 - enable network registration unsolicited result code; if there is a change in the terminal GPRS network registration status, it is issued the unsolicited result code:
+CGREG: <stat>
然后我在调制解调器的串口线上等待+CGREG
消息。当有消息到来时,我会检查状态是否为1(连接到家庭网络)或5(在漫游中连接)。
注意:当我发出AT+CGREG?时,会收到不同的+CGREG
响应,这个很容易区分。
根据连接的类型不同,电路交换(CS)或分组交换(PS),监控的方式会有所不同。要检测断开连接,你可以启用一个叫做UR(无请求结果)代码的功能,使用AT+CPSB=1
来监控PDP上下文活动(也就是分组交换连接)。对于电路交换的电话,你可以通过启用+CIEV:
的UR代码,使用AT+CMER=3,0,0,2
来进行监控。
要重新建立连接,你需要重新设置连接。对于电路交换,你要么需要知道拨打的电话号码,要么可以使用一种特殊的AT命令ATDL
[1],它会拨打上一个拨打的号码。如果是分组交换的连接,如果是用ATD命令开始的(比如“ATD*99*....”),你也可以使用ATDL,但如果是用AT+CGDATA开始的,就没有办法了。
不过,上面提到的ATD相关内容其实并不是你想要的。对于电路交换,你可以从你的Python脚本中发起一个电话,但这又有什么用呢?在收到CONNECT
后,所有的数据流量都会通过你的Python脚本所使用的串口连接来进行。而对于分组交换,连接甚至不会成功,除非手机从电脑那里接收到PPP流量作为连接建立的一部分。你打算让你的Python脚本来提供这些流量吗?
你真正想要的是让你的电脑尝试重新连接,无论是通过标准的操作系统拨号网络,还是通过某个特殊的应用程序来启动。所以,你需要用Python脚本来监控调制解调器,然后在电脑端采取适当的行动来重新建立连接。
[1] 关于ATDL的附注:注意如果你想重复上一个语音通话,仍然需要以分号结束,也就是ATDL;
,否则你会开始一个数据通话。