手机远程访问mqtt服务器,玩转MQTT实现远程数据采集和控制

本文介绍了如何利用STM32和ESP8266等硬件,结合ONENET平台,实现手机、电脑和大屏对温湿度、光照度和开关的远程数据采集与控制。通过创建产品和设备,设备周期性发布数据并响应平台控制命令,实现物联网应用。
摘要由CSDN通过智能技术生成

本帖最后由 yaojin919000 于 2021-1-4 15:15 编辑

本文简单介绍利用STM32和esp8266等元器件,利用ONENET平台,实现手机端、电脑端和大屏三种办法对现场温湿度光照度和开关信息的采集显示,并在手机端和电脑端对现场的LED灯以及蜂鸣器进行控制。

实现思路:根据ONENET平台的协议要求,先选择多协议接入建立一个产品,记住产品ID,在这个产品下再创建两个设备,记住设备的ID和鉴权信息,这些信息在编程的过程中需要使用。为了体现使用平台的灵活性,我创建了2个不同硬件的设备,一个是使用STM32+8266ESP-01S的硬件组成,一个是采用NODEMCU模块的硬件组成,两个设备都可以独立运行使用,各自单独组成一个独立的控制系统。两个设备通过ONENET平台每5秒钟发布一次数据,并且随时等待平台对自己的控制命令并完成执行。

硬件部分介绍:设备一采用nodemcu设备硬件简单,直接某宝购买(十几元)用杜邦线外配几个LED灯。自己配上5V电源和手机充电线(见图一)完活。设备二稍微复杂一点,选用STM32F103C8T6最小系统板,参照萝卜兄弟设计一个PCB线路板,把蜂鸣器、BHT11、BHT1750、0.96OLED、通讯模块8266ESP01S还有TCP1211,再配上两个按钮和LED指示灯(参图二),线路板选择嘉立创线上编辑,直接5片一元下单,一周内顺丰邮到家,全部硬件成本约50-60元。

软件部分介绍:针对两个不同设备,分别开发两套独立的软件。主要的功能都是完成数据采集,打包,上传,对平台下发的数据进行解析并执行相关的操作。下面将详细讲解一下:使用STM32+8266ESP-01S的软件讲:这部分软件采用c语言编写,参照ONENET平台上张继瑞老师和正点原子的例程,分成几个部分:

初始化部分:/硬件初始化void Hardware_Init(void)

{

delay_init();                        //延时函数初始化

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级

Usart1_Init(115200);         //串口1初始化为115200

Usart2_Init(115200);         //串口2,驱动ESP8266用

EXTIX_Init();                //外部中断初始化

LED_Init();                                //LED初始化

ADCx_Init();                        //ADC   DMA初始化

DHT11_GPIO_Config();        //DHT11温湿度传感器初始化

BH1750_Init();                        //光照

KEY_Init();

BEEP = 0;//鸣叫提示接入成功

delay_ms(250);

BEEP = 1;

数据采集部分:

/*光照度传感器获取数据*/

value_light = LIght_Intensity();

/* 温湿度传感器获取数据*/

/*调用Read_DHT11读取温湿度,若成功则输出该信息*/

if( Read_DHT11(&DHT11_Data)==SUCCESS)

{

sprintf(str, "温度:%d.%d ℃ ",DHT11_Data.temp_int,DHT11_Data.temp_deci);

sprintf(str, "湿度:%d.%d %c ",DHT11_Data.humi_int,DHT11_Data.humi_deci,'%');

}

else

{

printf("Read DHT11 ERROR!\r\n");//读取数据失败,串口打印:Read DHT11 ERROR.

}

Led_Status = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4);//读取LED0的状态

Led_Status1 = GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_13);//读取LED1的状态

上传部分:

memset(buf, 0, sizeof(buf));

body_len = OneNet_FillBuf(buf);                                                                                          //获取当前需要发送的数据流的总长度

printf("send data:%s\n",buf);

if(body_len)

{

if(MQTT_PacketSaveData(DEVID, body_len, NULL, 5, &mqttPacket) == 0)                             //封包

{

for(; i < body_len;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值