连接阿里云MQTTT设备
该文档介绍了A900E连接阿里云 MQTT平台设备的例程。
1.[AM900EV3 MQTTAT指令](doc:zdsqhfto)
2.[完整例程](https://github.com/zhaodan341/AM900E_ALIYUN_MQTT.git)
## 1. 模块采用MQTT协议连接ONENET流程图

## 2. 注册阿里云物联网平台
注册阿里云https://account.aliyun.com,进入阿里云官网,点击“物联网与云通信”,选择“ 物联网接入”,开通相关功能。

注册后开通物联网接入功能

在控制台后创建产品

创建完成产品,点击查看

点击前往管理,点击添加设备

添加设备

将此三个信息记录下来,并点击查看

在此界面,点击查看设备

在功能定义界面,新增功能

在消息通信界面,查看Topic,这些Topic我们后期调试会用到

暂时用到的两个Topic,为
/sys/a12QFB3H4ZP/AM900E01/thing/event/property/post 设备属性上报
/sys/a12QFB3H4ZP/AM900E01/thing/service/property/set 设备属性设置
阿里云建立的设备三要素信息:

product_key: a12laHdcyk1
device_name: AM900E01
device_secret: GvQQwbTyX5XmQsUxv5aMC5kNs71LmPM2
打开技小新编程工具,输入设备信息三要素,重新生成三个连接参数:

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格式为:“”标识符:数据“”,标识符和数据类型从产品的功能定义中查询


AT+MQTTDISCONN //发送断开MQTT连接命令
OK
