在这次的设计中需要实现STM32硬件层的数据采集上传云端服务器,鉴于设计成本的有限,所以准备使用EMQX的开源MQTT云端服务器。硬件端的资料使用到了中国移动物联网开发平台OneNET中MQTT例程
声明:因个人能力有限,若有错误之处还望指出。同时十分感谢B站“画卿师兄”,对我的帮助很大。
目录
一、ESP8266
二、数据上传
1.串口二初始化
2.订阅上行Topic
3.数据上传
下篇将整理MQTT服务下发命令,硬件层实现的学习笔记
首先在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端口号
esp8266需要使用到串口二初始化
ESP8266_Init(); //初始化ESP8266
Usart2_Init(115200); //8266通讯串口
const char *devSubTopic[] = {"/mysmarthome/sub"};
OneNet_Subscribe(devSubTopic, 1);
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];//上传数据的BUFOneNet_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服务器下发命令的