mqtt协议怎么用?以MQTT3.1协议ESP8266连接阿里云物联网平台

mqtt(message queuing telemetry transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的轻量级通讯协议,该协议构建于tcp/ip协议上,由ibm在1999年发布。mqtt最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,mqtt在物联网、小型设备、移动应用等方面有广泛的应用。mqtt属于应用层协议。最新版本为mqtt v5.0标准。本次连接阿里云物联网平台主要以mqtt标准协议3.1版本为主。
1.注册阿里云账号,登陆云平台 1.1 搜索物联网平台,登录物联网平台 1.2. 选择公共实例,创建产品    设置产品信息
添加产品
每一个设备都有自己的三元组,单击设备名字,查看设备三组:设备三元组很重要,在后面登录阿里云平台需要用到。
添加产品功能
2.连接阿里云 2.1 编写esp8266驱动程序,连接阿里云//tcp+sta模式,连接服务器#define wifi_name wbyq //wifi名#define wifi_password asdfghjkl23//wifi密码#define server_ip a1knxg89uwh.iot-as-mqtt.cn-shanghai.aliyuncs.com//服务器ip#define server_port 1883//端口号while(1){ stat=esp8266_sta_tcpclinet_init((u8 *)wifi_name,(u8 *)wifi_password,(u8 *)server_ip,server_port); if(stat==0)break; delay_ms(500); printf(stat=%d\r\n,stat);}printf(服务器连接成功\r\n); 服务器ip和端口号设置参考阿里云在线文档
服务器ip格式:
${yourproductkey}.iot-as-mqtt.${yourregionid}.aliyuncs.com:1883${yourproductkey}为设备的productkey,上面讲到设备三元组已提到过。${yourregionid} 是区域代码,我这是属于华东2,区域代码:cn-shanghai综上,服务器ip为 ”a1knxg89uwh.iot-as-mqtt.cn-shanghai.aliyuncs.com” 2.2 mqtt连续服务端 mqtt连接阿里云需要三个参数:客户端id、用户名、密码。
这三个参数填写可参考阿里云文档工具。
#define clientid stm32|securemode=3,signmethod=hmacsha1|#define username stm32&a17b5wkuy0s#define password ebff9579ed3e610228da8c035afc9636954c43bd//密文 while(1) { mqtt_init(); stat=mqtt_connect(clientid,username,password); if(stat==0)break; delay_ms(500); printf(正在连接....\r\n); } printf(阿里云连接成功\r\n); 2.3 客户端id  根据阿里云文档介绍,clientid可自定义,一般我们直接使用三元组中的devicename代替;timestamp可不填。综上,mqttclientid: ds18b20|securemode=3,signmethod=hmacsha1|
 2.4 用户名
 用户名中devicename用三元组中devicename代替;productkey用三元组中productkey代替。综上,mqttusername: ds18b20&a1knxg89uwh
  2.5 密码
 密码生成我们可以直接使用阿里云提供的密码生成工具password工具
3.订阅消息和发布消息   3.1 订阅消息
 将硬件采集到的数据上传到云端我们称之为发布消息;云端将数据下发给开发板称为订阅。
打开产品,查看产品详细信息,可以看到有订阅和发布接口。
#define set_topic /sys/a1knxg89uwh/ds18b20/thing/service/property/set//订阅#define post_topic /sys/a1knxg89uwh/ds18b20/thing/event/property/post//发布stat=mqtt_subscribetopic(set_topic,0,1);if(stat)printf(订阅失败\r\n);else printf(订阅成功\r\n); 4.发送心跳包   mqtt属于长连接,要想实现设备一直在线,就需要固定时给服务器发送心跳包,超过时间未发送则会被强制下线。
if(time>=5000){ time=0; mqtt_sentheart();//发送心跳包} 5.主函数while(1) { stat=esp8266_sta_tcpclinet_init((u8 *)wifi_name,(u8 *)wifi_password,(u8 *)server_ip,server_port); if(stat==0)break; delay_ms(500); printf(stat=%d\r\n,stat); } printf(服务器连接成功\r\n); while(1) { mqtt_init(); stat=mqtt_connect(clientid,username,password); if(stat==0)break; delay_ms(500); printf(正在连接....\r\n); } printf(阿里云连接成功\r\n); stat=mqtt_subscribetopic(set_topic,0,1); if(stat)printf(订阅失败\r\n); else printf(订阅成功\r\n); while(1) { if(usart3_flag) { usart3_cnt=0; usart3_flag=0; } delay_ms(1); time++; cnt++; if(time>=5000) { time=0; mqtt_sentheart();//发送心跳包 } if(cnt>=1000) { cnt=0; temp=ds18b20_gettemp()*0.0625; sprintf(mqtt_message,{\method\:\thing.event.property.post\,\id\:\0000000001\,\ params\:{\roomtemp\:%.2f},\version\:\1.0.0\},temp);//温度 mqtt_publishdata(post_topic,mqtt_message,0); } } 总结   mqtt 是一个客户端服务端架构的发布/订阅模式的消息传输协议。 它的设计思想是轻巧、 开放、简单、 规范, 因此易于实现。 消耗资源少,在mqtt3.1标准协议中仅有14个报文。每个报文都分为固定报头、可变报头和有效载荷3部分。
14个报文如下:
关于mqtt每个报文详解查看mqtt3.1协议。

小米与华为互撕 无论输赢华为都是最大的受益者
Xilinx All Programmable SoC高级驾驶员辅助解决方案
鸿蒙系统首批升级名单_鸿蒙系统的上市公司有哪些
怎样用区块链技术来改善环境
索尼Playstation VR的发布巩固了公司的视频游戏机市场龙头地位
mqtt协议怎么用?以MQTT3.1协议ESP8266连接阿里云物联网平台
赛灵思:AI芯片的核心壁垒是软件生态
USB之数据包阐述
热继电器什么时候使用_如何使用_热继电器工作原理
电子陶瓷外壳的应用及制备
5G美洲:理性看待open RAN
电子芯闻早报:Intel借势物联网,倾斜安卓阵营
京东与北汽将全面深化数字化转型
重新定义万亿字节规模数据中心 西部数据分区存储技术引领存储行业
三星电子将采用三星显示的QD面板生产电视
物联网中的身份认证是如何实现
数据出境的安全合规思考
江西加快发展数字经济:推动VR、物联网、5G等产业建设
无人机遥感的数据如何来处理
构建一个手套控制机械手臂