在各类物联网应用中,NB或者4G网络是常见的通信介质,其最大的优势是可以借助现有的移动基站,无需额外建立基站,所以广泛应用在三表(水表、电能表、天然气表)无线抄表中。通常情况下,对于这类小流量的数据,是通过串口(UART)与NB或者4G模组通信,以AT指令的方式进行数据交互和命令控制。
我们拿到一个模组后,一般原厂会提供一份或者多份AT指令手册,软件工程师根据指令手册实现预期的功能。厂家提供的指令手册一般的非常全面的,但是我们需要的可能只是其中一部分指令,大部分都是用不到的。这个时候就需要我们能够快速从“众多”命令中提取“有用”命令。本文就是本人根据使用过的模组总结一个整体流程,流程的每一步对应一条或多条AT指令,不同厂商的模组AT指令可能不同,但“总体流程”是不变的,根据流程去找指令,效率会高很多。
举个也许不那么恰当的例子:使用一个UART需执行的配置步骤:
不同的CPU,具体配置寄存器肯定是不一样的,但是上述的整体过程步骤是不会变的,根据理论步骤找到对应的寄存器。
根据以往使用的模组归纳整体拨号流程:
测试串口链路—>关闭回显—>查询模组名称—>获取IEME号—>检测SIM卡—>查询信号强度—>设置网络着附—>查询网络着附—>查询运营商—>设置APN—>查询本地IP—>IEME认证—>建立连接—>open socket—>数据发送/接收—>close socket
上述流程只是本人根据以往使用过的NB/4G模组进行的总结,不同的模组,特别是新推出或者小众厂商的模组,与流程不一定完全吻合,具体情况还得根据具体模组来。
指令 | 返回 |
---|---|
AT | AT |
不同厂商的模组启动时间存在差异,模组完全启动后才能响应AT指令。比如之前遇到的一个美格模块,启动时间要14S。开机后,可考虑周期性向模组串口发送“AT”命令,直至有响应。
指令 | 返回 |
---|---|
ATE0 | OK |
有些模块默认是开启回显的。回显就是,发送的内容串口会完整地返回来,一般在开发初期调试会开启回显。后期正常产品是要关闭的,减少串口带宽占用。
注
开启回显命令: ATE1
指令 | 返回 |
---|---|
AT+CGMM | 模块名称 |
同一厂商不同模组或者不同厂商的模组,都有一定标识的模组名称。模组名称一般用于驱动程序中兼容多种模组的一个标识,根据不同的模组名称来执行后续不同的联网指令。如果一款产品只用一种模组,可以跳过这个步骤。
指令 | 返回 |
---|---|
AT+CGSN | IEME |
国际移动设备识别码(International Mobile Equipment Identity,IMEI),就是我们平常所说的手机序列号(俗称手机串号),用于在移动电话网络中识别每一部独立的移动通信设备,相当于移动电话的身份证。同理,4G模组、NB模组也有一个唯一的IEME号。
在4G模组拨号联网时,一般不用手动认证IEME号。NB模组在连接socket前一般需要手动认证IEME号。
IEME号注意保密,就像你的身份证号一样。
指令 | 返回 |
---|---|
AT+CPIN? | +CPIN: READY |
检测到sim卡才能执行后续拨号联网过程。一些模组带有自动检测sim卡状态功能,模组上电后检测到sim卡会串口会主动输出信息,如卡不存在,模组则自动进入PSM模式,如移远的BCxx系列的NB模组。
例:
AT+CPIN?
+CPIN: READY
指令 | 返回 |
---|---|
AT+CSQ | 信号强度 |
拨号前查询信号强度,信号强度过低可能导致着附移动网失败。实际使用,根据信号强度选择是否进行拨号连接,减少重复拨号过程。连接上TCP网络后,可在空闲线程进行信号强度查询。
例:
AT+CSQ
+CSQ: 29,99
该命令不同模组可能不一样。参考命令:
指令 | 返回 |
---|---|
AT+CREG=1 | OK |
例:
AT+CREG=1
OK
该命令不同模组可能不一样。参考SIMCOM某4G模组命令:
指令 | 返回 |
---|---|
AT+CREG=1 | +CREG: 1,1 |
例:
AT+CGREG?
+CREG: 1,3
指令 | 返回 |
---|---|
AT+COPS? | 具体运营商 |
例:
AT+COPS?
+COPS: 0,0,"CHN-TELECOM",7
运营商信息主要用于下一步APN设置,其次是提供用户查看。
该命令不同模组可能不一样。参考移远某4G模组命令:
指令 | 返回 |
---|---|
AT+QICSGP | OK |
APN是根据上一步运营商类型来设置的,不同的运营商不一样的设置。如果是专网,还需要由专网运营商提供专门的用户名和密码。
参考三大运营商非专网APN:
例:
AT+QICSGP=1,1,"cmnet","card","card",3
OK
该命令不同模组可能不一样。参考移远某NB模组命令:
指令 | 返回 |
---|---|
AT+CGDCONT? | 本地IP |
如果成功获取到本地IP,说明模组已经接入运营商的移动网络,否则需等待本地IP获取。获取到本地IP后,离建立TCP网络就只差一步之遥了!
例:
AT+CGDCONT?
+CGDCONT: 1,"IP","CMIOT","10.139.210.85",0,0
该命令不同模组可能不一样。参考移远某NB模组命令:
指令 | 返回 |
---|---|
AT+EGMR+IEME | OK |
IEME手动认证,一般用于NB模组中,4G网络中一般不用手动认证。应该是NB出自网络安全性认证考虑。
例:
AT+EGMR=1,7,"123456789012345" /* IEME号注意保密,就像你的身份证号一样 */
OK
不同模组该命令不一定独立出来,一般与“open socket”命令结合一起,参考美格某模组指令:
指令 | 返回 |
---|---|
AT+MIPCALL=1 | 成功返回本地IP |
例:美格某模块建立连接
AT+MIPCALL=1
+MIPCALL:1,10.13.44.170
该命令不同模组可能不一样。参考移远某NB模组命令:
指令 | 返回 |
---|---|
AT+QIOPEN | OK |
例:移远某模组建立socket
AT+QIOPEN=1,1,"TCP","20.10.150.154",6201,10000,1
OK
该命令不同模组可能不一样。即使命令不一样,根据手册目录易辨别出TCP/UDP的命令。需要注意的是数据发送方式是十六进制字符还是ASII码,有的模组是同一条指令,通过配置实现切换;有的模组则是独立为两条指令。
模组的网络数据一般是主动输出到串口,带有特定标识的“URC帧”,接收后程序解析获取有效数据。
例:
移远某模组:+QIURC: "recv",1,20
SIMCOM某模组:+RECEIVE,1,20
美格某模组:+MIPRTCP=1,20
该命令不同模组可能不一样,但同样易辨别出来。
例:
移远某模组:AT+QICLOSE=1
SIMCOM某模组:AT+NETCLOSE=1
美格某模组:AT+MIPCLOSE=1