STM32通过ESP8266数据上云MQTT服务器学习笔记

在这次的设计中需要实现STM32硬件层的数据采集上传云端服务器,鉴于设计成本的有限,所以准备使用EMQX的开源MQTT云端服务器。硬件端的资料使用到了中国移动物联网开发平台OneNET中MQTT例程

声明:因个人能力有限,若有错误之处还望指出。同时十分感谢B站“画卿师兄”,对我的帮助很大。

目录

一、ESP8266

二、数据上传

1.串口二初始化

2.订阅上行Topic

3.数据上传

下篇将整理MQTT服务下发命令,硬件层实现的学习笔记


一、ESP8266

首先在ESP8266.c文件中,需要将WIFI的信息修改成自己的:

#define ESP8266_WIFI_INFO		"AT+CWJAP=\"/***WIFI名***/\",\"/***WIFI密码***/\"\r\n"

 其次需要修改服务器的域名和TCP端口号

#define ESP8266_ONENET_INFO		"AT+CIPSTART=\"TCP\",\"broker-cn.emqx.io\",1883\r\n"

 broker-cn.emqx.io为MQTT服务器域名

1883为TCP端口号

二、数据上传

1.串口二初始化

esp8266需要使用到串口二初始化

ESP8266_Init();		 //初始化ESP8266
Usart2_Init(115200); //8266通讯串口

2.订阅上行Topic

const char *devSubTopic[] = {"/mysmarthome/sub"};
OneNet_Subscribe(devSubTopic, 1);

3.数据上传

const char devPubTopic[] = "/mysmarthome/pub";
char PUB_BUF[256];//上传数据的BUF

unsigned short timeCount = 0;	//发送间隔变量
unsigned char *dataPtr = 0;		

if(++timeCount >= 100)	//发送间隔5s
	{
		LED_Status = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2);//读取LED1的状态
		BEEP_Status = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4);//读取风扇的状态
		HC_SR501_Status = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15);//读取红外的状态
		UsartPrintf(USART_DEBUG, "OneNet_Publish\r\n");
		sprintf(PUB_BUF,"{\"Temp\":%d,\"Hum\":%d,\"Ziwaixiandeng\":%d,\"Fenshan\":%d,\"Zaiwu\":%d}",
        (int)temperature,humidity,LED_Status?0:1,BEEP_Status,HC_SR501_Status);
			
        //上传消息的Topic
		OneNet_Publish(devPubTopic, PUB_BUF);
			
		timeCount = 0;
		ESP8266_Clear();
	}
		
//检查有无下发指令
dataPtr = ESP8266_GetIPD(3);
if(dataPtr != 0)
OneNet_RevPro(dataPtr);
		
delay_ms(10);
		

其中 

const char devPubTopic[] = "/mysmarthome/pub";
char PUB_BUF[256];//上传数据的BUF

OneNet_Publish(devPubTopic, PUB_BUF);

用来上传温湿度等传感器的状态数据 

        LED_Status = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2);//读取LED1的状态
        BEEP_Status = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_4);//读取风扇的状态
        HC_SR501_Status = GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15);//读取红外的状态
  
        sprintf(PUB_BUF,"{\"Temp\":%d,\"Hum\":%d,\"Ziwaixiandeng\":%d,\"Fenshan\":%d,\"Zaiwu\":%d}",
        (int)temperature,humidity,LED_Status?0:1,BEEP_Status,HC_SR501_Status);

设置三个Status接受GPIO口的高低电平的状态,以BUF承接上传至订阅的Topic。(这样就可以显示LED,风扇,红外传感器的开关状态)

由于LED为高电平熄灭,低电平点亮,故可以直接用个三元运算符:LED_Status?0:1 将LED 的GPIO电平状态取反(另外两个是正常的所有直接采集即可)

至于最后的

dataPtr = ESP8266_GetIPD(3);
if(dataPtr != 0)
OneNet_RevPro(dataPtr);

 使用来后面接受MQTT服务器下发命令的


下篇会整理MQTT服务下发命令,硬件层接受并实现的学习笔记

你可能感兴趣的:(MQTT服务器,嵌入式,ESP8266,stm32)