连接阿里云MQTTT设备

该文档介绍了A900E连接阿里云 MQTT平台设备的例程。 1.[AM900EV3 MQTTAT指令](doc:zdsqhfto) 2.[完整例程](https://github.com/zhaodan341/AM900E_ALIYUN_MQTT.git) ## 1. 模块采用MQTT协议连接ONENET流程图 ![image.png](1) ## 2. 注册阿里云物联网平台 注册阿里云https://account.aliyun.com,进入阿里云官网,点击“物联网与云通信”,选择“ 物联网接入”,开通相关功能。 ![image.png](https://cos.easydoc.net/68658482/files/k2ft2m53.png) 注册后开通物联网接入功能 ![image.png](https://cos.easydoc.net/68658482/files/k2ft3ksm.png) 在控制台后创建产品 ![image.png](https://cos.easydoc.net/68658482/files/k2ftejuv.png) 创建完成产品,点击查看 ![image.png](https://cos.easydoc.net/68658482/files/k2ftflwb.png) 点击前往管理,点击添加设备 ![image.png](https://cos.easydoc.net/68658482/files/k2fy44l7.png) 添加设备 ![image.png](https://cos.easydoc.net/68658482/files/k2ftqmjk.png) 将此三个信息记录下来,并点击查看 ![image.png](https://cos.easydoc.net/68658482/files/k2ftrlgi.png) 在此界面,点击查看设备 ![image.png](https://cos.easydoc.net/68658482/files/k2ftsgqp.png) 在功能定义界面,新增功能 ![image.png](https://cos.easydoc.net/68658482/files/k2ftthy3.png) 在消息通信界面,查看Topic,这些Topic我们后期调试会用到 ![image.png](https://cos.easydoc.net/68658482/files/k2ftu239.png) 暂时用到的两个Topic,为 /sys/a12QFB3H4ZP/AM900E01/thing/event/property/post 设备属性上报 /sys/a12QFB3H4ZP/AM900E01/thing/service/property/set 设备属性设置 阿里云建立的设备三要素信息: ![image.png](https://cos.easydoc.net/68658482/files/k2ftvai3.png) product_key: a12laHdcyk1 device_name: AM900E01 device_secret: GvQQwbTyX5XmQsUxv5aMC5kNs71LmPM2 打开技小新编程工具,输入设备信息三要素,重新生成三个连接参数: ![image.png](https://cos.easydoc.net/68658482/files/k2ftvumv.png) ClientD: FESA234FBDS24|securemode=3,signmethod=hmacsha1,timestamp=789| Username: AM900E01&a12laHdcyk1 Password: 45074273f371a525468bb5d99096437dc5723474 或者通过哈希算法得到设备秘钥 ```language ********************************************************************************************************* * 函 数 名: _iotx_generate_sign_string * 功能说明: 生成哈希密匙 hmacsha1 * 形 参: device_id :SN/MAC (自定义) * :device_name :设备名字 * : product_key :产品KEY * :device_secret:设备密匙 * :sign_string :哈希值 * 返 回 值: 1 表示成功 0: 表示异常 ********************************************************************************************************* */ int _iotx_generate_sign_string(const char *device_id, const char *device_name, const char *product_key, const char *device_secret, char *sign_string) { char signsource[DEV_SIGN_SOURCE_MAXLEN] = {0}; uint16_t signsource_len = 0; uint8_t sign_hex[32] = {0}; signsource_len = strlen(device_id) + strlen(device_name) + strlen(product_key) + strlen(TIMESTAMP_VALUE); if (signsource_len >= DEV_SIGN_SOURCE_MAXLEN) { return 0; } memset(signsource, 0, DEV_SIGN_SOURCE_MAXLEN); memcpy(signsource, "clientId", strlen("clientId")); memcpy(signsource + strlen(signsource), device_id, strlen(device_id)); memcpy(signsource + strlen(signsource), "deviceName", strlen("deviceName")); memcpy(signsource + strlen(signsource), device_name, strlen(device_name)); memcpy(signsource + strlen(signsource), "productKey", strlen("productKey")); memcpy(signsource + strlen(signsource), product_key, strlen(product_key)); memcpy(signsource + strlen(signsource), "timestamp", strlen("timestamp")); memcpy(signsource + strlen(signsource), TIMESTAMP_VALUE, strlen(TIMESTAMP_VALUE)); utils_hmac_sha256((uint8_t *)signsource, strlen(signsource), (uint8_t *)device_secret, strlen(device_secret), sign_hex); _hex2str(sign_hex, 32, sign_string); return 1; } ``` 具体参数示例: ```language /* ClientIdSNMAC :自定义,可以是设备IMEI 也可以是别的名字 */ #define ClientIdSNMAC "FESA234FBDS25" /* 对应平台相关信息 */ #define ProductKey "a12J7oLVMpF" #define DeviceName "dev02" #define DeviceSecret "zq9EXO3Lhi9DcIVEIzyO2xTtUoDuB6d6" #define Aliyunhostname "\"218.11.0.64\"" #define Aliyunhostport "1883" #define Aliyunkeeplive 120 //单位 s ``` 3. 连接流程(采用AM900E 连接MQTT指令V2.0版) AT+CGATT=1 //挂接 GPRS 网络 OK AT+CGDCONT=1,"IP","cmmtm" //设置 PDP 上下文 OK AT+CGACT=1,1 //激活PDP 上下文 OK AT+AMMQTTCONN="218.11.0.64",1883,"FESA234FBDS24|securemode=3,signmethod=hmacsha1,timestamp=789|",120,0,"AM900E01&a12laHdcyk1","45074273f371a525468bb5d99096437dc5723474" //连接在阿里云建立的测试设备,参数分别为,平台IP地址,端口号,新生成的ClientD,保活时间,清理会话标志,新生成的Username,Password OK 设备显示在线 AT+AMMQTTPUB="/sys/a12laHdcyk1/AM900E01/thing/event/property/post","{\"id\":\"789\",\"version\":\"1.0\",\"params\":{\"PM2D5\":101.23,\"SoilTemperature\":21.8},\"method\":\"thing.event.property.post\"}",1,0,0 OK //向指定的topic发布信息 ,参数为,发布TOPIC,payload(上传数据),服务质量qos,重发标志,保留payload格式为:“”标识符:数据“”,标识符和数据类型从产品的功能定义中查询 ![image.png](https://cos.easydoc.net/68658482/files/k2fve0bt.png) ![image.png](https://cos.easydoc.net/68658482/files/k2fvhxio.png) AT+MQTTDISCONN //发送断开MQTT连接命令 OK ![image.png](https://cos.easydoc.net/68658482/files/k2fvd3cq.png)