创建单个设备
在左侧导航栏,选择设备管理 > 设备,在产品下添加设备,操作如图3.3所示:
总结
本章主要是讲解了创建一个阿里云产品,这是为了后续MQIT接入阿里云做准备,读者只需按照步骤创建自己的阿里云产品即可。
图3.3 创建单个设备
确定后弹出来的设备证书信息(ProductKey、DeviceName和DeviceSerect)后面接入该平台需要用到,请记录保存下来。不小心关闭也没关系,在产品设备中能找到。设备证书界面如图3.4所示:
图3.4 查看设备证书
相关参数说明在表3.3中
表3.3 设备证书中相关参数说明
参数 |
说明 |
ProductKey |
设备所隶属产品的Key,即物联网平台为产品颁发的全局唯一标识符。 |
DeviceName |
设备在产品内的唯一标识符。DeviceName与设备所属产品的ProductKey组合,作为设备标识,用来与物联网平台进行连接认证和通信。 |
DeviceSecret |
物联网平台为设备颁发的设备密钥,用于认证加密。需与DeviceName成对使用。 |
之后,可以在设备列表中,单击设备对应的查看按钮,进入设备详情页设备信息页签下,查看设备信息。
4.使用MQTT.fx接入物联网平台
4.1前提条件
已在物联网平台控制台创建产品和设备,并获取设备证书信息(ProductKey、DeviceName和DeviceSerect)。创建产品和设备具体操作细节,请参考创建产品、单个创建设备和批量创建设备。
上文创建的产品设备后设备证书信息如下(下文将以此作为示例做讲解):
"ProductKey": "a14ayJGOfy7", "DeviceName": "XYD_LOCK", "DeviceSecret": "ch4UVyPXhAOdFwWYGbfWMw6G6ztxbTir"
4.2使用MQTT.fx接入
- 下载并安装MQTT.fx软件。请访问MQTT.fx官网。
- 打开MQTT.fx软件,单击设置图标。如图20.2.1所示:
图20.2.1 MQTT.fx设置图标
设置连接参数。物联网平台目前支持两种连接模式,不同模式设置参数不同。
TCP直连:Client ID中securemode=3,无需设置SSL/TLS信息。
TLS直连:Client ID中securemode=2,需要设置SSL/TLS信息。
设置基本信息,如图20.2.2所示:
图20.2.2 设置基本信息
设置基本信息相关参数说明如表20.2.1所示
表20.2. 1设置基本信息相关参数说明
参数 |
说明 |
Profile Name |
输入您的自定义名称。 |
Profile Type |
选择为 MQTT Broker。 |
Broker Port |
设置为:1883 |
General栏目下的设置项可保持系统默认,也可以根据您的具体需求设置。
- 单击User Credentials,设置User Name和Password。如图20.2.3所示
图20.2.3设置用户名和密码
用户相关信息说明如表20.2.2所示:
表20.2.2用户相关信息说明
参数 |
说明 |
User Name |
由设备名DeviceName、符号(&)和产品ProductKey组成。 固定格式: 完整示例如: |
- Password生成工具
打开“软件工具\mqttfx\mqtt签名工具\sign.html”,按照上文参数规则填入信息后点击生成,如图20.2.4所示:
图20.2.4 密码生成配置
- 最终得到
User Name:XYD_LOCK&a14ayJGOfy7
Password:9CE77B5B8E383FFEF3C0C4BE15497D5BE1A4D6D0
这两个在后面进行MQTT连接时需要用到。
- (可选)TCP直连模式(即
securemode=3
)下,无需设置SSL/TLS信息,直接进入下一步。
TLS直连模式(即securemode=2
)下,需要选择SSL/TLS,勾选 Enable SSL/TLS,设置Protocol。建议Protocol选择为TLSv1.2。设置如图20.2.5所示:
图20.2.5 设置TCP直连模式
填写完成后,单击OK。
- 设置完成后,单击 Connect进行连接。如图20.2.6所示
图20.2.6 连接示意图
4.3下行通信测试
从物联网平台发送消息,在MQTT.fx上接收消息,测试MQTT.fx与物联网平台连接是否成功 。
- 在MQTT.fx上,单击Subscribe。
- 输入一个设备具有订阅权限的Topic,单击Subscribe,订阅这个Topic。如图20.3.1所示
图20.3.1订阅Topic
订阅成功后,该Topic将显示在列表中。如图20.3.2所示
图20.3.2 查看一订阅的Topic
- 在物联网平台控制台中,该设备的设备详情页,Topic列表下,单击已订阅的Topic对应的发布消息操作按钮。
- 输入消息内容,单击确认。如图20.3.3所示:
图20.3.3 下行发送消息示例
- 回到MQTT.fx上,查看是否接收到消息。如图20.3.4所示:
图20.3.4 下行通信接收消息示例
4.4上行通信测试
在MQTT.fx上发送消息,通过查看设备日志,测试MQTT.fx与物联网平台连接是否成功 。
- 在MQTT.fx上,单击Publish。
- 输入一个设备具有发布权限的Topic,和要发送的消息内容,单击Publish,向这个Topic推送一条消息。如图20.4.1所示:
图20.4.1 上行通信发送消息示例
- 在物联网平台控制台中,该设备的设备详情 > 日志服务 > 上行消息分析栏下,查看上行消息。您还可以复制MessageID,在消息内容查询中,选择原始数据查看具体消息内容。
4.5查看日志
在MQTT.fx上,单击Log查看操作日志和错误提示日志。如图20.5所示
图20.5 查看日志
现在本地端如果想要连接上网页端(MQTT协议)
第一步:先让设备能联网
第二步,使用这个联网设备来发送对应的连接到阿里云平台的参数
第三步:订阅一个具有订阅权限topic,网页端就可以使用这个topic来发送数据给设备
第四步:选择一个具有发布权限的topic,再把数据上传到网页端
5.核心代码实现(STM32f407VGT6为例)
5.1 ESP8266的连接与订阅
void ESP8266_Connet(void) { u8 errorCode; UART4_Init(115200); ESP8266_TcpInit(); //修改成自己的WiFi名和WiFi密码 ESP8266_Wificonnect((uint8_t *)"Mi 10",(uint8_t*)"12345678"); //自己MQTT的broker Address ESP8266_Severconnect((uint8_t *)"h0jpzgOH9rd.iot-as-mqtt.cn-shanghai.aliyuncs.com"); errorCode = ESP8266_SendandReceive((uint8_t *)"AT+CIPSEND\r\n",(uint8_t *)"OK"); if(!errorCode) { _mqtt.Init(rxbuf,0,txbuf,0); //MQTT连接 //修改成自己MQTT的Client ID,User Name和在mqtt工具中生成的签名代码 errorCode=_mqtt.Connect("ESP8266|securemode=3,signmethod=hmacsha1|", "HZL_BS&h0jpzgOH9rd", "8A71EC003C918FED63578E81D5C7C02EDBAA9485"); printf("55555"); if(errorCode==1){ printf("MQTT接入成功\r\n"); //自己的Subscribe地址 errorCode=_mqtt.SubscribeTopic("/sys/h0jpzgOH9rd/HZL_BS/thing/service/property/set",0,1);//订阅 if(errorCode==1) { printf("MQTT订阅成功\r\n"); } } } }
5.2 ESP8266数据发送
void ESP8266_Send(void) { uint8_t score[] = "A:97 B:122"; uint8_t foul[] = "A:6 B:9"; uint8_t win[] = "B:win"; char string[520] = {0}; //按物模型通信的结构发送信息 sprintf(string, "{\"method\":\"thing.service.property.set\",\"id\":\"1948364543\",\"params\":{\"foul\":\"%s\",\"score\":\"%s\",\"win\":\"%s\"},\"version\":\"1.0.0\"}",foul,score,win); printf("%s\r\n",string); //自己的Publish地址 _mqtt.PublishData("/sys/h0jpzgOH9rd/HZL_BS/thing/event/property/post",string,0); }
5.3 ESP8266数据接收
//通过接受中断来接收云上发来的数据 void UART4_IRQHandler(void) { uint8_t temp; if(USART_GetITStatus(UART4,USART_IT_RXNE)) { //清除接收中断标志 temp = USART_ReceiveData(UART4); if(temp == 0) { esp8266rec.buff[esp8266rec.len++] = ' '; } else { esp8266rec.buff[esp8266rec.len++] = temp; } } else if(USART_GetITStatus(UART4,USART_IT_IDLE))//空闲中断 { //清除空闲中断标志 temp = UART4->SR; temp = UART4->DR; temp = temp; esp8266rec.buff[esp8266rec.len] = '\0'; esp8266rec.len = 0; esp8266rec.flag= 1; printf("%s", esp8266rec.buff); } }
- 【实验现象】