阿里云
一、AT 命令概述
AT 命令是一种古老的使用方式,从有线通信就开始使用了。
距离到 2024 年的今天, 已经有超过 40 年的使用历史。
AT 命令的使用场景是,把 4G 模组当做一个黑盒配件,设备必须有一个主控 CPU。
设备的主控 CPU, 通过串口,(也可以是 SPI 或者 USB,但是 99% 的场景都是通过串口),发送一个 "AT"字符串开头的指令, 向 4G 模组请求各种服务。
4G 模组完成服务后, 回复一个字符串,向主控 CPU 做应答。
通过这样一系列的发送请求,应答的交互方式, 使设备具备了通信能力。
AT 命令发展到今天, 功能日趋完善。
厂家的 4G 模组的 AT 指令至少具备如下完善的功能:
1. 基本的网络查询指令 信号强度查询,运营商查询,SIM 卡状态查询,IMEI 查询,注册网络状态查询,等等; 2. 各种通信协议的支持 TCP/UDP 协议,HTTP 协议,FTP 协议,MQTT 协议,等等; 3. 模组内部资源的使用文件系统的存入,删除,查询,等等。
尽管 AT 使用起来很便利,但是 AT 指令方式依然有几个明显的缺点:
1. 运行效率低 只能是两个物理 CPU 通过串口这样的介质做异步通信, 沟通效率很低,如果要做高效的业务和通信的整合动作的话, 代价更大。 2. 需要一个额外的主控 CPU; 3. 对于复杂度不高的物联网设备,虽然 4G 模组本身的运算资源和存储资源已经过剩, 但是为了使用 AT 指令,依然需要一个额外的主控 CPU。 4. 为了节约成本,主控 CPU 往往会选择一个资源不太大的型号,通常无法运行高级语言, 所以往往要用 C 语言开发业务逻辑。 5. 这需要研发团队熟悉主控 CPU 的开发架构,仍然是一个不小的学习成本。 6. 而 4G 模组因为资源足够大, 大多数 4G 模组已经支持脚本开发应用了,所以省掉设备主控 CPU,直接用 4G 模组开发应用, 研发成本更低。
尽管 AT 指令有这些缺点, 但是由于 AT 指令有庞大的用户群, 基于使用的惯性, AT 指令在今天仍然有非常大的使用比例。
二、本教程实现的功能概述
阿里云常见的两种链接方式分为一机一密和一型一密,其中一型一密又可以分为预注册和免预注册。
他们的区别在于:
对比项 | 一机一密 | 一型一密预注册 | 一型一密预注册 |
---|---|---|---|
设备端烧录信息 | ProductKey、DeviceName、DeviceSecret | ProductKey、ProductSecret | ProductKey、ProductSecret |
云端是否需要开启动态注册 | 无需开启,默认支持。 | 需打开动态注册开关。 | 需打开动态注册开关。 |
是否需要提前在物联网平台创建设备,注册 DeviceName | 需要,产品下 DeviceName 唯一。 | 需要,产品下 DeviceName 唯一。 | 不需要。 |
产线烧录要求 | 逐一烧录设备证书,需确保设备证书的安全性。 | 批量烧录相同的产品证书,需确保产品证书的安全存储。 | 批量烧录相同的产品证书,需确保产品证书的安全存储。 |
安全性 | 较高 | 一般 | 一般 |
本教程实现的功能定义是:
1. 使用一机一密 AT 直连 MQTT; 2. 一型一密 AT 方式连接(预注册); 3. 一型一密 AT 方式连接(免预注册);
三、准备硬件环境
工欲善其事,必先利其器。在正式介绍本功能示例之前,需要先准备好以下硬件环境。
本文章使用 Air700EMQ 核心板做演示;
参考:硬件环境清单,准备以及组装好硬件环境。
四、准备软件环境
工欲善其事,必先利其器。在正式介绍本功能示例之前,需要先准备好以下软件环境。
1. Luatools工具;
2. LLCOM 串口通信工具;
3. 本教程使用的AT固件版本号是:AirM2M_700EMQ_V2019_LTE_AT,如果版本号不正确,参考:固件版本确认和烧录检查确认。
五、使用方法举例
5.1 确认开发板正常开机并联网正常
本次教程所用固件版本是 V2019,通过 Luatools烧录过固件后可以通过打印来判断设备情况,具体参考下图:
5.2 连接阿里云所需相关指令
5.3 阿里云操作
5.3.1 产品操作
首先,打开阿里云找到物联网平台,开通业务后进入控制台。
点开设备管理的产品页面,点击新建产品。根据需求和图示说明创建产品。
5.3.2 设备操作
创建产品完成后就可以进入设备页面添加设备,在对应产品页面进入设备管理,按照提示添加设备
(在做正式产品时建议使用 imei 为 devicename,方便后期维护)
5.4 一机一密 AT 直连 MQTT
5.4.1 计算得到三元组
创建完毕后,点击 DeviceSecret 查看详情,一键复制设备证书
我们就可以得到设备证书信息
{
"ProductKey": "k04xkOr6rWR",
"DeviceName": "869861069996614",
"DeviceSecret": "09ba0ef4c5bbb19a8398c0a2f8b15ac0"
}
接下来,打开阿里云自带的三元组计算工具如何计算 MQTT 签名参数_物联网平台(IoT)-阿里云帮助中心
按要求解压完毕后,打开页面工具,将上面得到设备证书信息填入,method 选择 hmacmd5,即可得到三元组
MQTT 接入 Url 和 Port 可以在如下位置获取
5.4.2 直接获取三元组
我们还可以通过点击设备管理-设备-设备详情界面,直接查看这台设备的 MQTT 连接参数
在这里我们可以得到设备的 clientId、username、passwd、mqttHostUrl 和 port 信息
5.4.3 连接阿里云
接下来就可以打开 LLCOM,开始进行连接
→ AT+CGREG? //查询当前GPRS注册状态
← +CGREG: 0,1 //<n>=0,表示禁用URC上报,<stat>=1,标识已经注册GPRS网络,而且是本地网
← OK
→ AT+CGATT? //查看当前GPRS附着状态
← +CGATT: 1 //<state>=1,标明当前GPRS已经附着
← OK
//输入上方获取的"clientId","username","passwd"、最好用双引号括住,其中不要有空格,换行符
→ AT+MCONFIG="k04xkOr6rWR.869861069996614|securemode=2,signmethod=hmacsha256,timestamp=1728988266914|","869861069996614&k04xkOr6rWR","8b698e8b90eeee66ea733e8082d9061f6c5a04e45095e0bcbcde841304337ce3"
← OK
//输入上方获取的"mqttHostUrl","port"
→ AT+MIPSTART="iot-06z00fu5vlxsx8b.mqtt.iothub.aliyuncs.com","1883"
← OK
← CONNECT OK
→ AT+MCONNECT=1,60 //建立mqtt会话
← OK //注: 在MIPSTART返回 CONNECT OK后才能发MCONNECT命令,
//而且要立即发,否则会被服务器踢掉。
← CONNACK OK //收到CONNACK OK后才能发布消息
输入完毕后,我们可以看到已经成功连接上阿里云了
5.5 一型一密 AT 方式连接(预注册)
一型一密(预注册)需要产品的 ProductKey、ProductSecret 和 DeviceName
5.5.1 在阿里云打开动态注册开关
5.5.2 计算三元组
点击查看 ProductSecret,获取产品证书
{
"ProductSecret":"spiACsLREgY0sLoC"
"ProductKey":"k04xkOr6rWR"
}
参考使用 TLS 加密设备和物联网平台的 MQTT 通信_物联网平台(IoT)-阿里云帮助中心计算出三元组
5.5.3 连接阿里云
接下来步骤就跟 5.4.3 一致打开 LLCOM,开始进行连接,只不过需要把连接参数配置成一型一密的三元组
→ AT+CGREG? //查询当前GPRS注册状态
← +CGREG: 0,1 //<n>=0,表示禁用URC上报,<stat>=1,标识已经注册GPRS网络,而且是本地网
← OK
→ AT+CGATT? //查看当前GPRS附着状态
← +CGATT: 1 //<state>=1,标明当前GPRS已经附着
← OK
//输入上方获取的"clientId","username","passwd"、最好用双引号括住,其中不要有空格,换行符
→ AT+MCONFIG="869861069996614|securemode=2,signmethod=hmacsha256,timestamp=1729134662463|","869861069996614&k04xkOr6rWR","D90E4A4927E154099C68D23A54AC1418"
← OK
//输入上方获取的"mqttHostUrl","port"
→ AT+MIPSTART="iot-06z00fu5vlxsx8b.mqtt.iothub.aliyuncs.com","1883"
← OK
← CONNECT OK
→ AT+MCONNECT=1,60 //建立mqtt会话
← OK //注: 在MIPSTART返回 CONNECT OK后才能发MCONNECT命令,
//而且要立即发,否则会被服务器踢掉。
← CONNACK OK //收到CONNACK OK后才能发布消息
输入完毕后,我们可以看到设备也成功连接上阿里云了
5.6 一型一密 AT 方式连接(免预注册)
一型一密(免预注册)相比与预注册,只需要产品的 ProductKey、ProductSecret 即可
5.6.1 在阿里云打开动态注册开关
5.6.2 计算三元组
点击查看 ProductSecret,获取产品证书
{
"ProductSecret":"spiACsLREgY0sLoC"
"ProductKey":"k04xkOr6rWR"
}
参考使用 TLS 加密设备和物联网平台的 MQTT 通信_物联网平台(IoT)-阿里云帮助中心计算出三元组
5.6.3 连接阿里云
接下来步骤就跟 5.5.3 一致打开 LLCOM,输入算出来的三元组,输入完毕后,我们可以看到设备成功连接上阿里云
5.7 订阅与发布消息
5.7.1 订阅消息
按照以下步骤,选取一个具有订阅权限的 topic,其中 ${deviceName}要替换为自己真实的设备名称
然后在 LLCOM 输入指令订阅消息
//订阅发布的前提是确保已经连接上阿里云服务器
→ AT+MSUB="/k04xkOr6rWR/869861069996614/user/get",0 //订阅阿里云topic
← AT+MSUB="/k04xkOr6rWR/869861069996614/user/get",0
← OK
← SUBACK //订阅成功
然后返回阿里云平台-设备界面,就可以看到已订阅的 Topic,可以在这里发布消息
得到结果
5.7.8 发布消息
在产品-Topic 类列表-自定义 Topic 中选取一个具有发布权限的 Topic,其中 ${deviceName}也要替换为自己真实的设备名称
然后在 LLCOM 输入指令发布消息
//订阅发布的前提是确保已经连接上阿里云服务器
→ AT+MPUB="/k04xkOr6rWR/869861069996614/user/update",0,0,"SSSSddddd"
← AT+MPUB="/k04xkOr6rWR/869861069996614/user/update",0,0,"SSSSddddd"
← OK
发布的日志可以在下面的位置查看
可以看到内容
六、总结
本教程简单演示了设备上云,以及设备和云平台在线模拟设备工具的简单通信,通过以上步骤,您可以成功连接阿里云,并开始使用其提供的各种云服务和解决方案。希望本教程总结对您有所帮助,祝您在阿里云的使用过程中取得更好的成果!
七、常见问题
7.1 Air700EMQ 支持的 MQTT 版本
MQTT3.1.1
7.2 连接服务器失败
1、检查下模块信号、网络注册、网络附着、PDP激活状态。
2、检查下SIM卡是否欠费【4G模块有一种欠费表现:无法注册4G网络,可以注册2G网络】。
3、使用mqtt.fx,连接服务器确认一下是否可以连接成功,排除服务器故障。
4、部分国外的开源项目提供免费的MQTT代理服务器,因为网络的原因,国内存在严重的延迟或者丢包现象,导致程序运行出现问题。
5、确认是不是域名解析失败导致,可以通过AT+CDNSGIP=<domain name>确认一下域名是否能正常解析(注意:该命令只有在执行完at+cstt、at+ciicr、at+cifsr后才能正常工作),不能正常解析,可以通过AT+CDNSCFG=ip1,ip2设置域名解析服务器。
6、在 MIPSTART /SSLMIPSTART返 回 CONNECT OK后 才 能 发 MCONNECT命令,而且要立即发,否则会被服务器踢掉。
7.3 频繁掉线是什么原因
1、检查下是否存在代码逻辑错误,导致异常。
2、检查下是否不断重启,导致异常。
3、检查下服务器网络是否稳定,不要用内网穿透方式搭建服务器。
4、检查下使用环境是否网络覆盖不好,例如车库、地下、电梯、山区等。
5、检查下模块信号、网络注册、网络附着、PDP激活状态。
6、排查是否为设备天线问题:发出来设备的天线调试指标参数给合宙技术支持人员;曾经有一个客户天线指标明显有问题,导致10几个小时出现30次左右掉线;后来重新调试天线之后,40个小时出现几次掉线。
7、如果经常出现连接被动断开:
1) 检查下mqtt keep alive的时间,一般建议使用2分钟【如果每2分钟内都有应用数据收发,则可以把mqtt keep alive的时间设置的长一点儿】,除非有强制要求,否则不能太长,也不能太短。不建议超过4分钟,基站策略会关闭长时间没有数据传输的连接,太长时间可能会导致连接被基站关闭;不建议少于1分钟,太短时间可能会因为网络环境波动导致上行数据发送超时,可能超过1.5倍的心跳时间,从而被服务器主动断开连接。
2) 检查下是否在1.5倍的mqtt keep alive的时间,没有成功发送数据到服务器,就会被被服务器主动断开,这种情况一般都是发送数据超时引起的。
8、如果要降低掉线率,可通过如下方式设置【注意:在网络环境不变的情况下,降低掉线率意味着会增加响应延时】
A. mqtt keep alive的时间,一般建议使用2分钟【如果每2分钟内都有应用数据收发,则可以把mqtt keep alive的时间设置的长一点儿】,除非有强制要求,否则不能太长,也不能太短。不建议超过4分钟,基站策略会关闭长时间没有数据传输的连接,太长时间可能会导致连接被基站关闭;不建议少于1分钟,太短时间可能会因为网络环境波动导致上行数据发送超时,可能超过1.5倍的心跳时间,从而被服务器主动断开连接。
B. 减少Qos1和Qos2的publish使用,允许的话建议都使用Qos0。