搜索

[uCOS/RTOS] 【RT-Thread作品秀】基于RT-Thread+MQTT协议的远程传感器数据...

[复制链接]
693|0
 楼主 | 2020-7-4 21:20 | 显示全部楼层 |阅读模式
【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组件命令。
1.png
软件框架说明
2.png
流程图:
Wifi线程,主要完成温度采集与上报
3.png
主线程,主要用于led灯的循环显示
4.png
软件模块说明
软件主要难点在于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

基于MQTT协议的远程传感器数据采集系统_xinmeng_wit.pdf (453.13 KB, 下载次数: 20)

使用特权

评论回复
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 我要提问 投诉建议 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

关闭

热门推荐上一条 /5 下一条

在线客服 快速回复 返回顶部 返回列表