1.云平台介绍
物联网云平台&MQTT协议(物联网)
物联网云平台:阿里云,ONENET,腾讯云,有人云
这里只介绍云平台;
1.2.1阿里云平台介绍
设备通过MQTT协议连接阿里云,mqtt基于TCP/IP
1.2.2创建产品与设备
1.创建产品界面
2.设备界面
2.MQTT协议讲解
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。
MQTT最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
设备1, 服务器
设备2,
设备1要把数据发给设备2;
设备2 订阅服务器主题1
设备1 把消息发布给服务器主题1,
服务器在接收到设备1主题1的消息后,发布给设备2
MQTT协议
MQTT报文有14种(14种报文类型)
MQTT控制报文格式:
报文由三个部分组成:固定报文,可变报文,有效载荷
固定报头:
14种报文类型分别:
标志:
只有发布报文才需要标志
2.2.3剩余长度
可变报头:
有效载荷:
根据报文类型不同,有效载荷内容不同;
例如:发布报文的有效载荷是具体要发送的消息
我们会使用那些报文:
连接报文:
3.1连接报文
CONNECT-连接服务端:客户端到服务端的网络连接建立后,客户端发送给服务端的第一个报文必须是连接报文CONNECT;
在一个网络连接上客户端只能发送一次拼接报文,第二次发送将视为违规处理
3.1.2可变报头
3.13有效载荷
CONNECT报文的有效载荷包含一个或多个以长度为前缀的字段,可变报头中的标志决定是否包含这些字段。如果包含的话,必须按这个顺序出现:客户端表示==标识符,遗嘱主题,遗嘱消息,用户名,密码。
连接报文的有效载荷根据可变报头决定
4.1MQTTfx软件连接云平台
mqtt.fx参数填写要求
向指定topic发布消息:
查看发布的数据:
点击监控运维-》日志服务-》选择设备
发送消息格式:
JSON数据格式
{
"method":"thing.event.property.post",
"id":"2222222",
"params":{
"light":3,
"HCHO":2.2,
"tem":66.6
},
"version":"2.2.2"
}
主题选择:
主题去自己创建的产品--Topic类列表中找
根据功能选择topic,之后看操作权限和描述
属性上报:把设备的属性发给服务器
属性设备:服务器把要设置的属性发给设备
5发送连接报文链接阿里云
代码:
#include "stm32f10x.h"
#include "aliot.h"
#include "MQTTPacket.h"
#include "ADC.h"
//发送连接报文,连接阿里云
void AliotSendConnect(void)
{
uint8_t buf[300]={0};//定义数组用来存放连接报文
uint16_t buflen;//报文长度
MQTTPacket_connectData options = MQTTPacket_connectData_initializer;
options.clientID.cstring = clientId;
options.username.cstring = Username;
options.password.cstring = passwd;
//1.拼接连接报文,返回值是连接报文的长度
buflen = MQTTSerialize_connect(buf,300,&options);
if(buflen==0){
printf("连接报文拼接失败\r\n");
return;
}
printf("连接报文拼接成功\r\n");
//2.发送报文
Usart3SendArr(buf,buflen);
}
这里我用串口3来发送wifi信息
6.发送发布报文
代码:
以环境监测数据为例:声明参数
//发送发布报文
extern float ch2o;
extern float hum;
extern float tem;
extern int co2;
extern float voc;
extern ADCARR adcData;
extern int RGB;
void AliotSendPublish(void)
{
uint8_t buf[800]={0};//定义数组用来存放发布报文
uint16_t buflen;//报文长度
MQTTString topicName;
topicName.cstring = TOPICNAME;
unsigned char payload[256] = {0};
sprintf((char *)payload,"{\
\"method\":\"thing.event.property.post\",\
\"id\":\"162277852\",\
\"params\":{\
\"HCHO\":%.2f,\
\"temperature\":%.1f,\
\"Humidity\":%.1f,\
\"co2\":%d,\
\"VOC\":%.1f,\
\"Light\":%d,\
\"MQ2\":%d,\
\"RGB\":%d\
},\
\"version\":\"1.0.0\"\
}",ch2o,tem,hum,co2,voc,adcData.light,adcData.mq2,RGB);
buflen = MQTTSerialize_publish( buf,800, 0,0,0,0,topicName,payload, strlen((char*)payload));
Usart3SendArr(buf,buflen);
//printf("发布报文发送成功\r\n");
}