【RT-Thread作品秀】基于MQTT协议的远程传感器数据采集系统 作者:肖朋 概述出生于互联网时代的我们,见证了智能手机和个人电脑通过计算机网络互相进行连接,把每个人紧密地连接在一起,形成了一个地球村。而今,我们即将迈入5G时代,在通信技术不断发展的今天,连接到互联网的将不仅是昂贵精密的手机电脑,身边的各种物体也可以通过物联网连接到云端,由物联网平台管理上云的物联网设备,使用者通过浏览器,小程序等接收物发出的通知并且完成想过操作。物联网不仅将物与物连接在一起,也将物与人紧密地连接在一起,让生活更加智慧便捷。这,就是即将到来的AIOT时代。 远程数据采集系统实现了将本地MCU端的数据通过无线网络的方式传输到远程电脑端或者手机端,解决了传统网线的局限性,使用起来更方便,相信这也是以后发展的大势所趋。单片机联网以后将会越来越容易。 本设计将mcu采集的传感器数据通过wifi上传到阿里云服务器,在服务器端很方便的就能查看数据的实时变化曲线。 RT-Thread使用情况RT-Thread是本次设计不可分割的一部分,大大提高了MCU资源利用率,实现了多线程的任务调度。 此次设计采用的是RT-Thread nano版本,nano版本相对于master版本来说具有资源占用少的有点,只提供RTOS内核和finsh组件,移植方便,也更灵活。 RT-Thread版本:nano 3.1.3 组件:finsh 硬件框架 1. 主控采用雅特力开发板AT32F403A,AT32F403A是基于cortex-m4内核的MCU,主频高达240MHz,跑RTOS无任何压力。 2. 主控与各个传感器之间通过基本的板级通讯协议连接,如I2C,SPI,1wire等等,由于时间关系,本次设计只用到了ds18b20温度传感器,ds18b20是单总线通讯方式,占用MCU引脚少,方便多路并联。 3. WIFI模块作为数据上云的核心模块,起到了至关重要的作用,它将mcu的uart信号转换为wifi信号然后配合MQTT协议实现云连接。 4. 串口控制台用来打印调试信息和查看RT-Thread输出的信息,同时可以接收finsh组件命令。 软件框架说明
流程图: Wifi线程,主要完成温度采集与上报 主线程,主要用于led灯的循环显示 软件模块说明软件主要难点在于MQTT协议的实现和JSON格式的转换。 1.MQTT协议是用开源库移植过来的,移植过程中遇到了一些问题,主要是消息的接收,需要重新实现,主要函数如下: int transport_getdata(unsigned char* buf,int count) { //rt_thread_delay(200); if(count> strEsp8266_Fram_Record .InfBit .FramLength - (int)(pdata_buf -strEsp8266_Fram_Record .Data_RX_BUF)) { rt_kprintf("getdataerror:count is too long!\r\n"); } else { memcpy(buf,pdata_buf,count); pdata_buf+=count; } if(strEsp8266_Fram_Record.InfBit .FramLength - (int)(pdata_buf - strEsp8266_Fram_Record .Data_RX_BUF)<= 0) { pdata_buf= (char *)&strEsp8266_Fram_Record .Data_RX_BUF[0]; strEsp8266_Fram_Record.InfBit .FramLength=0; strEsp8266_Fram_Record.InfBit .FramFinishFlag = 0; } returncount; } 2.JSON格式的转换也是移植的开源库,主要使用方法如下: voidsensor_data_publish(void) { char temperature[20]; cJSON* pJsonRoot = NULL; pJsonRoot = cJSON_CreateObject();// cJSON_AddStringToObject(pJsonRoot, "id", "12345");// cJSON_AddStringToObject(pJsonRoot, "method","thing.event.property.post");// cJSON * pJsonChild = cJSON_CreateObject();// sprintf ( temperature,"%.1f",DS18B20_GetTemp_SkipRom() ); // 打印DS18B20 获取的温度值 cJSON_AddStringToObject(pJsonChild,"Temp",temperature); cJSON_AddItemToObject(pJsonRoot, "params", pJsonChild);// char * lpJsonStr = cJSON_Print(pJsonRoot); //cJSON_Delete(pJsonChild); cJSON_Delete(pJsonRoot);// rt_kprintf("time:%s\r\n",lpJsonStr); IOT_baidu_connect_publish(P_TOPIC_NAME,lpJsonStr); free(lpJsonStr); } 演示效果 视频地址:https://www.bilibili.com/video/BV14f4y117US/ 代码地址https://gitee.com/xinmeng_wit/IOT_RTT/tree/7bfa8a5bebc3e261799b6d4eddc60dca7b4fdb81
|