ESP8266连接阿里云--MQTT协议

ESP8266连接阿里云–MQTT协议

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

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

ESP8266连接阿里云--MQTT协议_第1张图片
  1. 搜索物联网平台,登录物联网平台。
ESP8266连接阿里云--MQTT协议_第2张图片
  2. 进入物联网控制台
ESP8266连接阿里云--MQTT协议_第3张图片
  3. 选择公共实例
ESP8266连接阿里云--MQTT协议_第4张图片
  4. 创建产品
ESP8266连接阿里云--MQTT协议_第5张图片
ESP8266连接阿里云--MQTT协议_第6张图片
  5. 添加产品
ESP8266连接阿里云--MQTT协议_第7张图片
ESP8266连接阿里云--MQTT协议_第8张图片
ESP8266连接阿里云--MQTT协议_第9张图片  添加设备成功:
ESP8266连接阿里云--MQTT协议_第10张图片
  每一个设备都有自己的三元组,单击设备名字,查看设备三组:
  设备三元组很重要,在后面登录阿里云平台需要用到。ESP8266连接阿里云--MQTT协议_第11张图片

  1. 添加产品功能
    ESP8266连接阿里云--MQTT协议_第12张图片ESP8266连接阿里云--MQTT协议_第13张图片

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和端口号设置参考阿里云在线文档
ESP8266连接阿里云--MQTT协议_第14张图片
ESP8266连接阿里云--MQTT协议_第15张图片
  服务器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");

ESP8266连接阿里云--MQTT协议_第16张图片
  2.3 客户端ID
  根据阿里云文档介绍,clientId可自定义,一般我们直接使用三元组中的DeviceName代替;timestamp可不填。综上,mqttClientId: DS18B20|securemode=3,signmethod=hmacsha1|

  2.4 用户名
  用户名中deviceName用三元组中DeviceName代替;productKey用三元组中productKey代替。综上,mqttUsername: DS18B20&a1knXG89uwh

   2.5 密码
  密码生成我们可以直接使用阿里云提供的密码生成工具password工具
ESP8266连接阿里云--MQTT协议_第17张图片

3.订阅消息和发布消息

  3.1 订阅消息
  将硬件采集到的数据上传到云端我们称之为发布消息;云端将数据下发给开发板称为订阅。
  打开产品,查看产品详细信息,可以看到有订阅和发布接口。
ESP8266连接阿里云--MQTT协议_第18张图片

#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");

  3.2 发布消息
  上报格式可通过阿里云平台在线调试,按照云平台发布数据格式进行数据上传。
ESP8266连接阿里云--MQTT协议_第19张图片
  按照此方式实现数据上报

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);
}

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);
		}
	}

6.阿里云Web端设计

  阿里云服务器提供有网页端和移动端界面开发。我们介绍下网页端界面设计基本使用方法。
ESP8266连接阿里云--MQTT协议_第20张图片
  6.1 新建web应用ESP8266连接阿里云--MQTT协议_第21张图片
ESP8266连接阿里云--MQTT协议_第22张图片
  6.2 关联产品
ESP8266连接阿里云--MQTT协议_第23张图片
  6.3 新建应用
ESP8266连接阿里云--MQTT协议_第24张图片
  6.4 设计界面
ESP8266连接阿里云--MQTT协议_第25张图片
  6.5.配置数据来源
ESP8266连接阿里云--MQTT协议_第26张图片
  6.6.保存发布
ESP8266连接阿里云--MQTT协议_第27张图片
  6.7.下载程序,连接阿里云,预览web界面。
ESP8266连接阿里云--MQTT协议_第28张图片

总结

  MQTT 是一个客户端服务端架构的发布/订阅模式的消息传输协议。 它的设计思想是轻巧、 开放、简单、 规范, 因此易于实现。 消耗资源少,在MQTT3.1标准协议中仅有14个报文。每个报文都分为固定报头、可变报头和有效载荷3部分。
在这里插入图片描述
  14个报文如下:
ESP8266连接阿里云--MQTT协议_第29张图片
  关于MQTT每个报文详解查看MQTT3.1协议。
  示例工程:https://download.csdn.net/download/weixin_44453694/16632625

你可能感兴趣的:(ESP8266,mqtt,阿里云,wifi,物联网)