基于STM32+FreeRtos+ESP8266+MQTT连接阿里云

基于STM32+FreeRtos+DHT12+ESP8266+MQTT连接阿里云

  • 1.概述
  • 2.实现步骤
    • 2.1.MQTT.fx模拟器与阿里云通信
    • 2.2.STM32与阿里云通信
  • 3. 搭建云平台
    • 3.1.登陆阿里云平台
  • 4.连接阿里云平台(MQTT.fx)
  • 5.连接阿里云平台(STM32)
    • 5.1.调试信息
    • 5.2.源码分析
      • 5.2.1. 向服务器发起连接(CONNECT)
      • 5.2.2.服务器回复连接回执(CONNACK)
      • 5.2.3.向服务器发起订阅(SUBSCRIBE)
      • 5.2.4.服务器回复订阅回执(SUBACK)
      • 5.2.5.向服务器发起心跳包请求(PINGREQ)
      • 5.2.6.服务器回复心跳回执(PINGRESP)
      • 5.2.7.服务器发布消息
      • 5.2.8.轮询,读MQTT返回数据类型
      • 5.2.9.向服务器发送dht12温湿度传感器的数据
  • 6.连接信息
  • 7.实物图

1.概述

实现通过stm32f103c8t6+操作系统(freertos)读取dht12温湿度传感器的数据,采用ESP8266连接网络,经过MQTT协议连接阿里云IOT,进行数据的传输,以及服务器发送数据控制LED的亮灭,包括消息的发布和订阅等操作,完成云端和设备端的通讯。

2.实现步骤

2.1.MQTT.fx模拟器与阿里云通信

首先,我们使用MQTT.fx模拟器,通过模拟的方式去和阿里云平台进行通讯,次步骤是为了验证我们是否完成了阿里云平台的 搭建。其次是为了获取一些相关的日志信息。

2.2.STM32与阿里云通信

其次,我们使用STM32F103C8T6,通过ESP8266连接网络,进行阿里云平台的通讯,实现本次设计的最终方案。本设计使用了dht12温湿度传感器进行读取温度,并通过阿里云平台进行发布,控制我们的LED灯的亮灭。

3. 搭建云平台

3.1.登陆阿里云平台

1.登陆网址:https://www.aliyun.com/
2.找到物联网平台
3.根据阿里云的文档创建一个产品,创建一个这个产品的设备,并添加一个自定义功能
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第1张图片
4.我们先创建一个产品,创建流程如下:
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第2张图片
然后点击确认即可。

5.产品弄好了,就要在产品下面挂上设备
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第3张图片
6.设置下添加的设备的名字
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第4张图片

7.查看添加的设备信息
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第5张图片
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第6张图片
注意,以下信息是连接阿里云平台的时候需要用到的。
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第7张图片
提示:后面咱就会使用下面三个参数(三元组)组合MQTT参数
“ProductKey”: “a1Q",
“DeviceName”: “dht12”,
“DeviceSecret”: "7G
****************VsU”

4.连接阿里云平台(MQTT.fx)

1.这里需要用到两个软件
1.1.阿里云物联平台配置_32
1.2.MQTT.fx
2.打开MQTT.fx软件

2.1.打开软件

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第8张图片

2.2.配置相关信息

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第9张图片
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第10张图片
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第11张图片
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第12张图片

3.连接调试
3.1.查看Topic列表,一会需要用到
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第13张图片
3.2.发布LED开关和温湿度功能。
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第14张图片
3.3.添加自定义功能,
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第15张图片
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第16张图片
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第17张图片
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第18张图片
3.4.最后一定要记得发布。
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第19张图片

3.5.连接服务器
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第20张图片
3.6.推送的内容需要在阿里云平台点击
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第21张图片
3.7.推送温湿度数据到阿里云平台服务器上
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第22张图片
基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第23张图片
3.8.到此,MQTT.fx模拟器调试就结束了。

5.连接阿里云平台(STM32)

5.1.调试信息

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第24张图片

5.2.源码分析

5.2.1. 向服务器发起连接(CONNECT)

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第25张图片

5.2.2.服务器回复连接回执(CONNACK)

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第26张图片

5.2.3.向服务器发起订阅(SUBSCRIBE)

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第27张图片

5.2.4.服务器回复订阅回执(SUBACK)

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第28张图片

5.2.5.向服务器发起心跳包请求(PINGREQ)

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第29张图片

5.2.6.服务器回复心跳回执(PINGRESP)

在这里插入图片描述

5.2.7.服务器发布消息

在这里插入图片描述
当服务器发布消息的时候,会进入此函数,对数据进行解析数据,数据格式为json格式,如代码所示。

u8 MQTT_Publish(unsigned char* data,int len)
{
	int buflen = sizeof(buf);
	int rc = 0;
	unsigned char dup;
	int qos;
	unsigned char retained = 0;
	unsigned short msgid = 1;
	int payloadlen_in;
	unsigned char* payload_in;
	MQTTString receivedTopic;
		
	cJSON *json , *json_params, *json_id, *json_led, *json_display;
	
	memcpy(buf,data,len);
	
	rc = MQTTDeserialize_publish(&dup, &qos, &retained, &msgid, &receivedTopic,&payload_in, &payloadlen_in, (unsigned char*)buf, buflen);	//服务器有推送信息
	printf("message arrived : %s\r\n", payload_in);
	
	json = cJSON_Parse((char *)payload_in);			//解析数据包
	if (!json)  
	{  
		printf("Error before: [%s]\r\n",cJSON_GetErrorPtr());  
	} 
	else
	{
		json_id = cJSON_GetObjectItem(json , "id"); 
		if(json_id->type == cJSON_String)
		{
			printf("id:%s\r\n", json_id->valuestring);  
		}
		json_params = cJSON_GetObjectItem(json , "params");  
		if(json_params)  
		{  
			if(cJSON_GetObjectItem(json_params, "LED0"))
			{
				json_led  = cJSON_GetObjectItem(json_params, "LED0");
				if(json_led->type == cJSON_Number)
				{
					printf("LED:%d\r\n", json_led->valueint);  
					if(json_led->valueint == 1)
					{
						LED0 = 0;
					}
					else
					{
						LED0 = 1;
					}			
				}
			}
			if(cJSON_GetObjectItem(json_params, "display"))
			{
				json_display = cJSON_GetObjectItem(json_params, "display");
				if (json_display->type == cJSON_String)  
				{  
					//暂不处理
				}  
			}
		} 
	}
	cJSON_Delete(json);
	
	return TRUE;
}

5.2.8.轮询,读MQTT返回数据类型

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第30张图片

5.2.9.向服务器发送dht12温湿度传感器的数据

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第31张图片

注释:由于本设计使用了ESP8266来联网,ESP8266联网部分代码就不再过多解释,可参考相关的例子进行。

6.连接信息

基于STM32+FreeRtos+ESP8266+MQTT连接阿里云_第32张图片
注释:串口通信这块使用串口DMA的方式,开启串口DMA中断收发的方式,同时使用了freertos操作系统。

7.实物图

你可能感兴趣的:(物联网专区,stm32,阿里云,物联网)