找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2905|回复: 0
打印 上一主题 下一主题
收起左侧

基于MQTT技术的环境温湿度可视化系统设计思路

[复制链接]
跳转到指定楼层
楼主
ID:716857 发表于 2020-3-27 13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一章 背景与需求分析
1.1项目开发背景
1.2需求分析
第二章 通信协议与温度实时监控系统设计              2
2.1 服务器端设计              2
2.2 客户端设计              3
2.2.1 树莓派              3
2.2.2  PC端              3
2.3元器件选择与系统设计              5
2.4通信过程设计
第三章 mosquitto实现与部署
3.1 通信协议选择
3.2 中间件平台选型              6
3.3. 实现代码,关键代码,算法
3.4部署与运行过程
第四章 体会与总结

第一章 背景与需求分析1.1项目开发背景

智慧农业是智慧经济的重要内容,是依托物联网、云计算以及3S 技术等现代信息技术与农业生产相融合的产物,可以通过对农业生产环境的智能感知和数据分析,实现农业生产精准化管理和可视化诊断。

随着微电子技术和微型计算机,云计算的迅猛发展,微机测量和控制技术以其逻辑简单、控制灵活、使用方便及性能价格比高的优点得到了迅猛发展和广泛应用。它不仅在航天、航空、铁路交通、冶金、电力、电讯、石油化、制造业等领域获得了广泛应用,而且其技术在日常生活中也具有广阔的应用前景。尤其是许多智能仪器和测控系统中电脑控制技术的引入,使得传统仪器、仪表设备发生了根本变化,为工业生产的自动化、智能化奠定了坚实的技术基础。
  在智慧农业、工业生产、石油化工、电力、国防、科研领域和日常生活中,温湿度是极为普遍又极有意义的参数之一,温湿度是与我们的生活,工作息息相关的物理参数。自然界中任何物理的,化学的变化过程都与温度紧密联系。温湿度的测量与控制直接和产品质量、提高生产率、节约能源、安全生产等重要经济技术指标相关联,因此温湿度测量是一个具有重要意义的技术领域。

而对于温湿度的实时测量,远端可视化分析,更是利于各种以温湿度为指标系统的应用。


1.2需求分析

在工业、农业、日常生活等诸多方面,对于温湿度的实时测量,并进行远端可视化分析具有极为重要的意义,这在很大程度上节省远程硬件的连接,可通过云端进行实时的测量数据传输,利于对温湿度信息的实时监控,并根据监控的信息进行系统调控,到达远程控制温湿度的效果。由此,我们基于Mosquitto,使用MQTT协议进行相关的数据传输及控制,设计了一个温湿度的可视化系统。将DHT11传感器采集到的实时数据可视化,用于用户分析。整套系统的信息传递协议选择使用MQTT协议,通过在网页上提交查询申请,后台程序订阅所需街道传感器发布的信息,并将数据进行合适的处理返回给网页进行可视化,提供给用户查看。

  • 通信协议与温度实时监控系统设计
2.1 服务器端设计
MQTT 是一个基于发布/订阅模式的消息传输协议。它具有轻量级、开放、简单,易于实现,通信带宽要求低等特点。这些特点使得它对机器与机器的通信(M2M)以及物联网应用(IoT)来说是很好的选择。它还被应用到手机APP和Web应用中。 MQTT于1999年由Andy Stanford-Clark(IBM)和Arlen Nipper(Arcom,现为Cirrus Link)发明,最初的应用是为了以最小的电池损耗和最小网络带宽将石油管道数据通过卫星进行传输。在MQTT最初版本发布3年后,OASIS开源组织接管MQTT的标准化制定工作。
搭建MQTT服务选择开源软件Mosquitto,下载地址及各系统安装方法见https://mosquitto.org/download/ ,此实例安装于Mac系统,利用brew安装,安装命令brew install mosquitto
1、安装完成后,文件目录位于/usr/local/Cellar/mosquitto/1.4.11_2/
配置文件位于目录/usr/local/etc/mosquitto/
  • 设置 mosquitto MQTT服务启动websoc监听,修改配置文件/usr/local/etc/mosquitto/mosquitto.conf
  3、创建一个MQTT服务器账户
假设用户名为:user1
在命令行运行:mosquitto_passwd -c /etc/mosquitto/pwfile.txt user1
回车后连续输入2次用户密码即可
4、重新启动mosquitto  sudo service mosquitto start      #启动服务
2.2 客户端设计

2.2.1 树莓派

树莓派主要功能包括数据的采集和发送。

数据的采集需要使用温湿度传感器和树莓派上的数据采集程序。温湿度传感器主要用于采集实时的温湿度数据,数据采集程序负责将将传感器接受的温湿度数据采集到树莓派中,用于下一步的数据发送。

数据采集程序采用高效的Python编程,使用Python中的RPI.GPIO库,可以轻松的控制树莓派上的GPIO管脚,将传感器采集的数据接收至树莓派中。

数据发送程序依然采用Python编写,由于整个过程我们使用的是MQTT通信协议,故数据发送程序使用了Python中的paho.mqtt库,向订阅的主题发送数据。

2.2.2 PC端

PC端分为三个部分,数据的接收,数据的处理,数据的可视化,均采用Python编写。数据的接收:使用Python中的paho.mqtt库,连接创建的Apollo服务器,订阅穿件的主题,接收树莓派发布的主题消息。

数据的处理:将接收的到来自主题订阅的数据进行处理,得到我们需要的数据格式。

数据的可视化:采用Python的flask动态网页框架和D3.js,将温湿度数据用折线图动态的展示在网页上

2.3元器件选择与系统设计

开发所需元器件:

D1  WiFi UNO开发面板 :基于ESP-8266EX Arduino 兼容,使用 Arduino IDE进行编程引脚。

DHT11 温湿度传感器 :DHT11是一款有已校准数字信号输出的温湿度传感器

元器件与线路板连接:

2.4通信过程设计
发布/订阅模式解耦了客户端,客户端分为2种角色:发布者(Publisher)和订阅者(Subscriber)。每一个发布者(Publisher)可以发送不同类型的消息,我们把消息的类型叫做主题(topic),MQTT通信中的消息都属于某一个主题  ,而只有订阅了这个主题的订阅者(Subscriber)才能收到属于这个主题的消息。发布者和订阅者不需要在意和知道对方的存在(不需要知道对方的IP和端口),也不需要直接与对方建立连接。因为通信中存在着一个叫代理(MQTT broker)的第三种角色,也可以叫MQTT服务器(MQTT server)。
发布者、订阅者只需要知道MQTT 服务器的IP和端口即可,并和它直接建立连接通信。MQTT代理作为消息的中转,它过滤所有接受到的消息,并按照一定的机制(MQTT标准规定是基于主题的消息过滤派发方式,而具体的MQTT服务器软件也提供了其他的派发方式)分发它们,使得所有注册到MQTT代理的订阅者只接收到他们订阅了的消息,而不会收到他不关心的消息。当发布者发布一条消息的时候,他必须同时指定消息的主题和消息的负载。MQTT代理在收到发布者发过来的消息时,无需访问消息负载,他只是访问消息的主题信息,然后根据这主题派发给订阅者。需要注意的是,一个客户端可以同时既当发布者又当订阅者。比如一个开发板连接了一盏LED灯,它可以发布灯的暗/亮状态信息,也可以从其他节点订阅对灯的控制消息。

利用手机热点建立局域网,将树莓派和电脑终端及作为服务器的电脑连接到同一个局域网,通信使用MQTT协议,利用mosquitto进行数据的传输。

第三章 mosquitto实现与部署3.1 通信协议选择

MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:
1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
2、对负载内容屏蔽的消息传输;
3、使用 TCP/IP 提供网络连接;
4、有三种消息发布服务质量:
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;

实现MQTT协议需要:客户端和服务器端。 MQTT协议中有三种身份:发布者(Publish)、代理(Broker)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。 MQTT传输的消息分为:主题(Topic)和负载(Payload)两部分。Topic可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(Payload),Payload可以理解为消息的内容,是指订阅者具体要使用的内容。 订阅(Subscription):订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。 会话(Session):每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。 主题名(Topic Name):连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。 主题筛选器(Topic Filter):一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。 负载(Payload):消息订阅者所具体接收的内容。

3.2 中间件平台选型

本组实验选用的中间件平台是mosquitto。mosquitto是一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。

3.3. 实现代码,关键代码,算法
mosquitto MQTT服务启动websoc监听,修改配置文/usr/local/etc/mosquitto/mosquitto.conf

启动服务
连接MQTT服务,设置Arduino MQTT客户端连接
Arduino 发送数据到MQTT服务采用Arduino Ciao Library
  1. #include "DHT.h"
  2. #include <Wire.h>
  3. #include <UnoWiFiDevEd.h>

  4. #define CONNECTOR "mqtt"
  5. #define TOPIC "DHT11_TOPIC"

  6. // what digital pin we're connected to
  7. #define DHTPIN 7   
  8. // Uncomment whatever type you're using!
  9. #define DHTTYPE DHT11   // DHT 11

  10. // Initialize DHT sensor.
  11. // Note that older versions of this library took an optional third parameter to
  12. // tweak the timings for faster processors.  This parameter is no longer needed
  13. // as the current DHT reading algorithm adjusts itself to work on faster procs.
  14. DHT dht(DHTPIN, DHTTYPE);

  15. void setup() {
  16.   Serial.begin(9600);
  17.   //DHT11 begin
  18.   dht.begin();
  19.   //Ciao begin
  20.   Ciao.begin();
  21. }

  22. void loop() {
  23.   // Wait a few seconds between measurements.
  24.   delay(6000);
  25.   // Reading temperature or humidity takes about 250 milliseconds!
  26.   // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
  27.   float h = dht.readHumidity();
  28.   // Read temperature as Celsius (the default)
  29.   float t = dht.readTemperature();

  30.   // Check if any reads failed and exit early (to try again).
  31.   if (isnan(h) || isnan(t)) {
  32.     Serial.println("Failed to read from DHT11 sensor!");
  33.     return;
  34.   }

  35.   Serial.print("Humidity: ");
  36.   Serial.print(h);
  37.   Serial.print(" %\t");
  38.   Serial.print("Temperature: ");
  39.   Serial.println(t);
  40.   String data = "{\"H\":" + String(h) +",\"T\":" + String(t)+"}";
  41.   // pushes data into a channel
  42.   Ciao.write(CONNECTOR, TOPIC,data);温
  43. }
复制代码

湿度web可视化
浏览器客户端展示数据,需要与MQTT服务通讯,这里采用MQTT client mqtt.js
可视化展示采用实时数据图表可视化epoch.js

  1. <!DOCTYPE HTML>

  2. <html>

  3. <head>

  4.   <title>epoch.js mqtt.js</title>

  5.               <script src="https://unpkg.com/mqtt/dist/mqtt.min.js" type="text/javascript"></script>

  6.               <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>

  7.     <script src="http://d3js.org/d3.v3.js" charset="utf-8"></script>

  8.     <script src="http://epochjs.github.io/epoch/js/epoch.js" charset="utf-8"></script>

  9.     <link rel="stylesheet" href="http://epochjs.github.io/epoch/css/epoch.css">

  10. </head>

  11. <body>

  12. <div id="container" style="min-width: 310px; height: 200px; margin: 30 auto" class="epoch"></div>



  13. <script>

  14.    $(function(){

  15.      var temperatureData = {

  16.        label: "temperature",

  17.        values:[]

  18.      };

  19.      var humidityData = {

  20.        label: "humidity",

  21.        values:[]

  22.      };

  23.      var chartData = [temperatureData,humidityData];

  24.      var temperature,humidity,nextData = [];

  25.      var mychart = $('#container').epoch({

  26.        type: 'time.line',

  27.        data: chartData,

  28.        ticks:{ right: 5, bottom: 50, left: 5 },

  29.        axes: ['left', 'bottom', 'right']

  30.      });

  31.      var client = mqtt.connect('http://192.168.31.175:9001'); // you add a ws:// url here

  32.      client.subscribe("DHT11_TOPIC")

  33.      client.on("message", function (topic, msg) {

  34.        nextData = [];

  35.        //console.log([topic, msg].join(": "));

  36.        var jsonData = JSON.parse(msg);

  37.        // console.log(jsonData);

  38.        time = parseInt(new Date().getTime() / 1000);

  39.        temperature = {time:time,y:jsonData.T};

  40.        humidity = {time:time,y:jsonData.H};

  41.        nextData.push(temperature);

  42.        nextData.push(humidity);

  43.        mychart.push(nextData);

  44.      })

  45.    });



  46. </script>

  47. </body>

  48. </html>
复制代码

温度可视化
实物图
3.4部署与运行过程
第4章   体会与总结

次基于MQTT与ESP8266的实时温湿度采集系统的制作,让我们增加了对从最低端传感器的数据采集到顶端客户端的数据显示的过程,以及对MQTT协议的传输模式的了解。

到了物联网时代,由于智能硬件的差异,相比互联网终端,硬件配置要低得多,而且环境也复杂。在网络不稳定的情况下,保证数据的传输没有问题、保证数据不被重复发送、连接断开后重新连接,使用MQTT最适合物联网数据的传输。

在制作过程中有以下一些注意事项:

  • WiFi模块需要通过连接网络构建TCP环境,而判定连接哪个网络是根据用户名和密码确定的,路由器的用户名和密码在程序中是固定的,想要连接其他网络必须修改程序中用户名和密码的内容才能实现。
  • MQTT消息的发送和订阅都是依赖MQTT服务器的,没有MQTT服务器,客户端是无法订阅和发送消息的。所以在最开始的时候,我们选择了开放的云平台阿里云作为服务器,阿里云能够支持MQTT的接入,并且与MQTT.fx一起使用可以省去很多麻烦。
  • 整个过程需要考虑多种情况,服务器的连接有两种情况,发送端是否满足发送的条件,接收端接接收到的是什么样的报文等。
  • 当与服务器建立连接后并不是能立即发送数据,首先需要判断发送缓冲区有数据,然后是满足三种情况能开始发送数据:连接报文、订阅报文和连接和订阅均成功。
  • 由于室内温湿度处在变化中,而我们接收到的数据不能实时地显示变化的温度湿度,于是我们给数据发送加了定时器,通过串口控制,每10s钟发送一次数据。

完整的Word格式文档51黑下载地址:
基于MQTT技术的环境温湿度可视化系统.doc (1.72 MB, 下载次数: 20)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表