0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

嵌入式技术 来源:嵌入式技术 作者:嵌入式技术 2022-05-25 18:32 次阅读

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(Publish/Subscribe)模式的轻量级通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大的优点在于可以以极少的代码和有限的带宽,为远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,MQTT在物联网、小型设备、移动应用等方面有广泛的应用。MQTT属于应用层协议。最新版本为MQTT v5.0标准。本次连接阿里云物联网平台主要以MQTT标准协议3.1版本为主。

1.注册阿里云账号,登陆云平台

pYYBAGKN70uAA6kZAAfLwYwUP38961.png

1.1 搜索物联网平台,登录物联网平台

poYBAGKN8LKAEwgFAAFGkiSP3tA599.png

1.2. 选择公共实例,创建产品

pYYBAGKN8R2AN9KUAAG5zVn_TPs116.png

设置产品信息

poYBAGKN8V2AfJI-AAEj6SF8mgs140.png

添加产品

pYYBAGKN9jOAGz7ZAAGQ5mo04co954.pngpoYBAGKN9lOAYYo9AAEYIckILAI932.pngpoYBAGKN9oaARD5YAAIzoF7NHU8786.png

每一个设备都有自己的三元组,单击设备名字,查看设备三组:设备三元组很重要,在后面登录阿里云平台需要用到。

poYBAGKN95WAALNOAAEg8AnLnNc665.png

添加产品功能

poYBAGKN-WaAG5L0AAFYOZWUiz0167.png

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和端口号设置参考阿里云在线文档

pYYBAGKN-fiARaqwAAHV7NLbvyI681.pngpYYBAGKN-j2AGsozAAInhrtQwFA997.png

服务器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工具

poYBAGKN-wWAEQLDAANzGqFXegQ300.png

3.订阅消息和发布消息

  3.1 订阅消息
 将硬件采集到的数据上传到云端我们称之为发布消息;云端将数据下发给开发板称为订阅。
打开产品,查看产品详细信息,可以看到有订阅和发布接口

poYBAGKN-6eAYXScAAEO0uL-ieM966.png
#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协议。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6037

    文章

    44558

    浏览量

    635238
  • 物联网
    +关注

    关注

    2909

    文章

    44634

    浏览量

    373318
  • 阿里云
    +关注

    关注

    3

    文章

    956

    浏览量

    43038
  • ESP8266
    +关注

    关注

    50

    文章

    962

    浏览量

    45003
  • MQTT
    +关注

    关注

    5

    文章

    651

    浏览量

    22504
收藏 人收藏

    评论

    相关推荐

    esp8266连接阿里平台mqtt连接超时

    esp8266nodemcu在使用arduino.ide连接阿里平台的时候,wifi配置正常但连接
    发表于 10-26 21:39

    基于鸿蒙Hi3861V100 MQTT协议 对接阿里联网平台

    更新啦!!!!!!!!!!基于鸿蒙HarmonyOS Hi3861V100 开发板通过MQTT协议 对接阿里IOT
    发表于 01-25 08:31

    STM32+ESP8266+MQTT协议

    STM32+ESP8266+MQTT协议上传平台(OneNET)
    发表于 09-08 07:21

    STM32F103板子是如何通过MQTT协议连接阿里联网平台的呢

    STM32F103板子是如何通过MQTT协议连接阿里联网
    发表于 10-26 06:27

    esp8266怎样通过MQTT协议连接阿里

    STM32F103单片机应用WIFI模块esp8266通过MQTT协议连接阿里:复制这段内容后
    发表于 11-26 08:24

    STM32+ESP8266+MQTT协议如何连接OneNet联网平台

    STM32+ESP8266+MQTT协议如何连接OneNet联网平台
    发表于 12-02 06:52

    stm32通过esp8266 AT命令连接阿里联网

    stm32通过esp8266 AT命令连接阿里联网。不引用库,自己写
    发表于 01-21 08:29

    M5311模块MQTT协议连接阿里联网平台相关资料下载

    一、准备三元组在阿里联网平台新建产品和设备后,平台给每一个设备自动赋予三元组。二、准备
    发表于 02-11 07:08

    NodeMCU是怎样通过MQTT连接阿里联网

    NodeMCU 通过MQTT 连接阿里联网1.NodeMCU固件的选择及刷入
    发表于 02-22 07:47

    stm32通过esp8266 AT命令连接阿里联网

    stm32通过esp8266 AT命令连接阿里联网。不引用库,自己写
    发表于 03-30 14:01

    NodeMCU 通过MQTT 连接阿里联网

    NodeMCU 通过MQTT 连接阿里联网1.NodeMCU固件的选择及刷入
    发表于 12-28 19:19 17次下载
    NodeMCU 通过<b class='flag-5'>MQTT</b> <b class='flag-5'>连接</b><b class='flag-5'>阿里</b><b class='flag-5'>云</b><b class='flag-5'>物</b><b class='flag-5'>联网</b>

    ESP8266通过MQTT协议连接ONENET

    ESP8266通过MQTT协议连接ONENET一、设计目标二、ONENET平台搭建三、硬件准备四、程序烧写五、ONENET
    发表于 01-12 19:58 53次下载
    <b class='flag-5'>ESP8266</b>通过<b class='flag-5'>MQTT</b><b class='flag-5'>协议</b><b class='flag-5'>连接</b>ONENET

    STM32 + ESP8266 + MQTT协议连接OneNet

    STM32+ESP8266使用标准MQTT协议登录Onenet服务器,实现数据交互。
    的头像 发表于 02-28 13:22 1.9w次阅读
    STM32 + <b class='flag-5'>ESP8266</b> + <b class='flag-5'>MQTT</b><b class='flag-5'>协议</b><b class='flag-5'>连接</b>OneNet

    STM32驱动ESP8266连接阿里(1)----使用AT指令连接阿里

    购买的ESP8266一般没带MQTT固件,所以无法通过MQTT指令与平台通信,需要烧录固件。 MQTT
    的头像 发表于 07-27 11:47 3100次阅读
    STM32驱动<b class='flag-5'>ESP8266</b><b class='flag-5'>连接</b><b class='flag-5'>阿里</b><b class='flag-5'>云</b>(1)----使用AT指令<b class='flag-5'>连接</b><b class='flag-5'>阿里</b><b class='flag-5'>云</b>

    STM32、ESP8266MQTT连接阿里联网的串口通信异常解析

    STM32、ESP8266MQTT协议连接阿里
    的头像 发表于 04-19 17:19 1453次阅读