第一章 背景與需求分析
1.1項(xiàng)目開發(fā)背景
1.2需求分析
第二章 通信協(xié)議與溫度實(shí)時(shí)監(jiān)控系統(tǒng)設(shè)計(jì) 2
2.1 服務(wù)器端設(shè)計(jì) 2
2.2 客戶端設(shè)計(jì) 3
2.2.1 樹莓派 3
2.2.2 PC端 3
2.3元器件選擇與系統(tǒng)設(shè)計(jì) 5
2.4通信過程設(shè)計(jì)
第三章 mosquitto實(shí)現(xiàn)與部署
3.1 通信協(xié)議選擇
3.2 中間件平臺(tái)選型 6
3.3. 實(shí)現(xiàn)代碼,關(guān)鍵代碼,算法
3.4部署與運(yùn)行過程
第四章 體會(huì)與總結(jié)
第一章 背景與需求分析1.1項(xiàng)目開發(fā)背景智慧農(nóng)業(yè)是智慧經(jīng)濟(jì)的重要內(nèi)容,是依托物聯(lián)網(wǎng)、云計(jì)算以及3S 技術(shù)等現(xiàn)代信息技術(shù)與農(nóng)業(yè)生產(chǎn)相融合的產(chǎn)物,可以通過對(duì)農(nóng)業(yè)生產(chǎn)環(huán)境的智能感知和數(shù)據(jù)分析,實(shí)現(xiàn)農(nóng)業(yè)生產(chǎn)精準(zhǔn)化管理和可視化診斷。 隨著微電子技術(shù)和微型計(jì)算機(jī),云計(jì)算的迅猛發(fā)展,微機(jī)測量和控制技術(shù)以其邏輯簡單、控制靈活、使用方便及性能價(jià)格比高的優(yōu)點(diǎn)得到了迅猛發(fā)展和廣泛應(yīng)用。它不僅在航天、航空、鐵路交通、冶金、電力、電訊、石油化、制造業(yè)等領(lǐng)域獲得了廣泛應(yīng)用,而且其技術(shù)在日常生活中也具有廣闊的應(yīng)用前景。尤其是許多智能儀器和測控系統(tǒng)中電腦控制技術(shù)的引入,使得傳統(tǒng)儀器、儀表設(shè)備發(fā)生了根本變化,為工業(yè)生產(chǎn)的自動(dòng)化、智能化奠定了堅(jiān)實(shí)的技術(shù)基礎(chǔ)。
在智慧農(nóng)業(yè)、工業(yè)生產(chǎn)、石油化工、電力、國防、科研領(lǐng)域和日常生活中,溫濕度是極為普遍又極有意義的參數(shù)之一,溫濕度是與我們的生活,工作息息相關(guān)的物理參數(shù)。自然界中任何物理的,化學(xué)的變化過程都與溫度緊密聯(lián)系。溫濕度的測量與控制直接和產(chǎn)品質(zhì)量、提高生產(chǎn)率、節(jié)約能源、安全生產(chǎn)等重要經(jīng)濟(jì)技術(shù)指標(biāo)相關(guān)聯(lián),因此溫濕度測量是一個(gè)具有重要意義的技術(shù)領(lǐng)域。 而對(duì)于溫濕度的實(shí)時(shí)測量,遠(yuǎn)端可視化分析,更是利于各種以溫濕度為指標(biāo)系統(tǒng)的應(yīng)用。
1.2需求分析在工業(yè)、農(nóng)業(yè)、日常生活等諸多方面,對(duì)于溫濕度的實(shí)時(shí)測量,并進(jìn)行遠(yuǎn)端可視化分析具有極為重要的意義,這在很大程度上節(jié)省遠(yuǎn)程硬件的連接,可通過云端進(jìn)行實(shí)時(shí)的測量數(shù)據(jù)傳輸,利于對(duì)溫濕度信息的實(shí)時(shí)監(jiān)控,并根據(jù)監(jiān)控的信息進(jìn)行系統(tǒng)調(diào)控,到達(dá)遠(yuǎn)程控制溫濕度的效果。由此,我們基于Mosquitto,使用MQTT協(xié)議進(jìn)行相關(guān)的數(shù)據(jù)傳輸及控制,設(shè)計(jì)了一個(gè)溫濕度的可視化系統(tǒng)。將DHT11傳感器采集到的實(shí)時(shí)數(shù)據(jù)可視化,用于用戶分析。整套系統(tǒng)的信息傳遞協(xié)議選擇使用MQTT協(xié)議,通過在網(wǎng)頁上提交查詢申請(qǐng),后臺(tái)程序訂閱所需街道傳感器發(fā)布的信息,并將數(shù)據(jù)進(jìn)行合適的處理返回給網(wǎng)頁進(jìn)行可視化,提供給用戶查看。 - 通信協(xié)議與溫度實(shí)時(shí)監(jiān)控系統(tǒng)設(shè)計(jì)
2.1 服務(wù)器端設(shè)計(jì)MQTT 是一個(gè)基于發(fā)布/訂閱模式的消息傳輸協(xié)議。它具有輕量級(jí)、開放、簡單,易于實(shí)現(xiàn),通信帶寬要求低等特點(diǎn)。這些特點(diǎn)使得它對(duì)機(jī)器與機(jī)器的通信(M2M)以及物聯(lián)網(wǎng)應(yīng)用(IoT)來說是很好的選擇。它還被應(yīng)用到手機(jī)APP和Web應(yīng)用中。 MQTT于1999年由Andy Stanford-Clark(IBM)和Arlen Nipper(Arcom,現(xiàn)為Cirrus Link)發(fā)明,最初的應(yīng)用是為了以最小的電池?fù)p耗和最小網(wǎng)絡(luò)帶寬將石油管道數(shù)據(jù)通過衛(wèi)星進(jìn)行傳輸。在MQTT最初版本發(fā)布3年后,OASIS開源組織接管MQTT的標(biāo)準(zhǔn)化制定工作。 1、安裝完成后,文件目錄位于/usr/local/Cellar/mosquitto/1.4.11_2/ 配置文件位于目錄/usr/local/etc/mosquitto/ - 設(shè)置 mosquitto MQTT服務(wù)啟動(dòng)websoc監(jiān)聽,修改配置文件/usr/local/etc/mosquitto/mosquitto.conf
3、創(chuàng)建一個(gè)MQTT服務(wù)器賬戶 假設(shè)用戶名為:user1 在命令行運(yùn)行:mosquitto_passwd -c /etc/mosquitto/pwfile.txt user1 回車后連續(xù)輸入2次用戶密碼即可 4、重新啟動(dòng)mosquitto sudo service mosquitto start #啟動(dòng)服務(wù) 2.2 客戶端設(shè)計(jì)2.2.1 樹莓派 樹莓派主要功能包括數(shù)據(jù)的采集和發(fā)送。 數(shù)據(jù)的采集需要使用溫濕度傳感器和樹莓派上的數(shù)據(jù)采集程序。溫濕度傳感器主要用于采集實(shí)時(shí)的溫濕度數(shù)據(jù),數(shù)據(jù)采集程序負(fù)責(zé)將將傳感器接受的溫濕度數(shù)據(jù)采集到樹莓派中,用于下一步的數(shù)據(jù)發(fā)送。 數(shù)據(jù)采集程序采用高效的Python編程,使用Python中的RPI.GPIO庫,可以輕松的控制樹莓派上的GPIO管腳,將傳感器采集的數(shù)據(jù)接收至樹莓派中。 數(shù)據(jù)發(fā)送程序依然采用Python編寫,由于整個(gè)過程我們使用的是MQTT通信協(xié)議,故數(shù)據(jù)發(fā)送程序使用了Python中的paho.mqtt庫,向訂閱的主題發(fā)送數(shù)據(jù)。 2.2.2 PC端 PC端分為三個(gè)部分,數(shù)據(jù)的接收,數(shù)據(jù)的處理,數(shù)據(jù)的可視化,均采用Python編寫。數(shù)據(jù)的接收:使用Python中的paho.mqtt庫,連接創(chuàng)建的Apollo服務(wù)器,訂閱穿件的主題,接收樹莓派發(fā)布的主題消息。 數(shù)據(jù)的處理:將接收的到來自主題訂閱的數(shù)據(jù)進(jìn)行處理,得到我們需要的數(shù)據(jù)格式。 數(shù)據(jù)的可視化:采用Python的flask動(dòng)態(tài)網(wǎng)頁框架和D3.js,將溫濕度數(shù)據(jù)用折線圖動(dòng)態(tài)的展示在網(wǎng)頁上 2.3元器件選擇與系統(tǒng)設(shè)計(jì) 開發(fā)所需元器件: D1 WiFi UNO開發(fā)面板 :基于ESP-8266EX Arduino 兼容,使用 Arduino IDE進(jìn)行編程引腳。 DHT11 溫濕度傳感器 :DHT11是一款有已校準(zhǔn)數(shù)字信號(hào)輸出的溫濕度傳感器 元器件與線路板連接:  2.4通信過程設(shè)計(jì)發(fā)布/訂閱模式解耦了客戶端,客戶端分為2種角色:發(fā)布者(Publisher)和訂閱者(Subscriber)。每一個(gè)發(fā)布者(Publisher)可以發(fā)送不同類型的消息,我們把消息的類型叫做主題(topic),MQTT通信中的消息都屬于某一個(gè)主題 ,而只有訂閱了這個(gè)主題的訂閱者(Subscriber)才能收到屬于這個(gè)主題的消息。發(fā)布者和訂閱者不需要在意和知道對(duì)方的存在(不需要知道對(duì)方的IP和端口),也不需要直接與對(duì)方建立連接。因?yàn)橥ㄐ胖写嬖谥粋(gè)叫代理(MQTT broker)的第三種角色,也可以叫MQTT服務(wù)器(MQTT server)。 發(fā)布者、訂閱者只需要知道MQTT 服務(wù)器的IP和端口即可,并和它直接建立連接通信。MQTT代理作為消息的中轉(zhuǎn),它過濾所有接受到的消息,并按照一定的機(jī)制(MQTT標(biāo)準(zhǔn)規(guī)定是基于主題的消息過濾派發(fā)方式,而具體的MQTT服務(wù)器軟件也提供了其他的派發(fā)方式)分發(fā)它們,使得所有注冊到MQTT代理的訂閱者只接收到他們訂閱了的消息,而不會(huì)收到他不關(guān)心的消息。當(dāng)發(fā)布者發(fā)布一條消息的時(shí)候,他必須同時(shí)指定消息的主題和消息的負(fù)載。MQTT代理在收到發(fā)布者發(fā)過來的消息時(shí),無需訪問消息負(fù)載,他只是訪問消息的主題信息,然后根據(jù)這主題派發(fā)給訂閱者。需要注意的是,一個(gè)客戶端可以同時(shí)既當(dāng)發(fā)布者又當(dāng)訂閱者。比如一個(gè)開發(fā)板連接了一盞LED燈,它可以發(fā)布燈的暗/亮狀態(tài)信息,也可以從其他節(jié)點(diǎn)訂閱對(duì)燈的控制消息。 
利用手機(jī)熱點(diǎn)建立局域網(wǎng),將樹莓派和電腦終端及作為服務(wù)器的電腦連接到同一個(gè)局域網(wǎng),通信使用MQTT協(xié)議,利用mosquitto進(jìn)行數(shù)據(jù)的傳輸。 第三章 mosquitto實(shí)現(xiàn)與部署3.1 通信協(xié)議選擇MQTT是IBM開發(fā)的一個(gè)即時(shí)通訊協(xié)議。MQTT是面向M2M和物聯(lián)網(wǎng)的連接協(xié)議,采用輕量級(jí)發(fā)布和訂閱消息傳輸機(jī)制。Mosquitto是一款實(shí)現(xiàn)了 MQTT v3.1 協(xié)議的開源消息代理軟件,提供輕量級(jí)的,支持發(fā)布/訂閱的的消息推送模式,使設(shè)備對(duì)設(shè)備之間的短消息通信簡單易用。

MQTT協(xié)議是為大量計(jì)算能力有限,且工作在低帶寬、不可靠的網(wǎng)絡(luò)的遠(yuǎn)程傳感器和控制設(shè)備通訊而設(shè)計(jì)的協(xié)議,它具有以下主要的幾項(xiàng)特性:
1、使用發(fā)布/訂閱消息模式,提供一對(duì)多的消息發(fā)布,解除應(yīng)用程序耦合;
2、對(duì)負(fù)載內(nèi)容屏蔽的消息傳輸;
3、使用 TCP/IP 提供網(wǎng)絡(luò)連接;
4、有三種消息發(fā)布服務(wù)質(zhì)量:
“至多一次”,消息發(fā)布完全依賴底層 TCP/IP 網(wǎng)絡(luò)。會(huì)發(fā)生消息丟失或重復(fù)。這一級(jí)別可用于如下情況,環(huán)境傳感器數(shù)據(jù),丟失一次讀記錄無所謂,因?yàn)椴痪煤筮會(huì)有第二次發(fā)送。
“至少一次”,確保消息到達(dá),但消息重復(fù)可能會(huì)發(fā)生。
“只有一次”,確保消息到達(dá)一次。這一級(jí)別可用于如下情況,在計(jì)費(fèi)系統(tǒng)中,消息重復(fù)或丟失會(huì)導(dǎo)致不正確的結(jié)果。
5、小型傳輸,開銷很。ü潭ㄩL度的頭部是 2 字節(jié)),協(xié)議交換最小化,以降低網(wǎng)絡(luò)流量; 實(shí)現(xiàn)MQTT協(xié)議需要:客戶端和服務(wù)器端。 MQTT協(xié)議中有三種身份:發(fā)布者(Publish)、代理(Broker)、訂閱者(Subscribe)。其中,消息的發(fā)布者和訂閱者都是客戶端,消息代理是服務(wù)器,消息發(fā)布者可以同時(shí)是訂閱者。 MQTT傳輸?shù)南⒎譃椋褐黝}(Topic)和負(fù)載(Payload)兩部分。Topic可以理解為消息的類型,訂閱者訂閱(Subscribe)后,就會(huì)收到該主題的消息內(nèi)容(Payload),Payload可以理解為消息的內(nèi)容,是指訂閱者具體要使用的內(nèi)容。 訂閱(Subscription):訂閱包含主題篩選器(Topic Filter)和最大服務(wù)質(zhì)量(QoS)。訂閱會(huì)與一個(gè)會(huì)話(Session)關(guān)聯(lián)。一個(gè)會(huì)話可以包含多個(gè)訂閱。每一個(gè)會(huì)話中的每個(gè)訂閱都有一個(gè)不同的主題篩選器。 會(huì)話(Session):每個(gè)客戶端與服務(wù)器建立連接后就是一個(gè)會(huì)話,客戶端和服務(wù)器之間有狀態(tài)交互。會(huì)話存在于一個(gè)網(wǎng)絡(luò)之間,也可能在客戶端和服務(wù)器之間跨越多個(gè)連續(xù)的網(wǎng)絡(luò)連接。 主題名(Topic Name):連接到一個(gè)應(yīng)用程序消息的標(biāo)簽,該標(biāo)簽與服務(wù)器的訂閱相匹配。服務(wù)器會(huì)將消息發(fā)送給訂閱所匹配標(biāo)簽的每個(gè)客戶端。 主題篩選器(Topic Filter):一個(gè)對(duì)主題名通配符篩選器,在訂閱表達(dá)式中使用,表示訂閱所匹配到的多個(gè)主題。 負(fù)載(Payload):消息訂閱者所具體接收的內(nèi)容。 3.2 中間件平臺(tái)選型本組實(shí)驗(yàn)選用的中間件平臺(tái)是mosquitto。mosquitto是一款實(shí)現(xiàn)了消息推送協(xié)議 MQTT v3.1 的開源消息代理軟件,提供輕量級(jí)的,支持可發(fā)布/可訂閱的的消息推送模式,使設(shè)備對(duì)設(shè)備之間的短消息通信變得簡單,比如現(xiàn)在應(yīng)用廣泛的低功耗傳感器,手機(jī)、嵌入式計(jì)算機(jī)、微型控制器等移動(dòng)設(shè)備。 3.3. 實(shí)現(xiàn)代碼,關(guān)鍵代碼,算法mosquitto MQTT服務(wù)啟動(dòng)websoc監(jiān)聽,修改配置文/usr/local/etc/mosquitto/mosquitto.conf 
啟動(dòng)服務(wù) 連接MQTT服務(wù),設(shè)置Arduino MQTT客戶端連接 Arduino 發(fā)送數(shù)據(jù)到MQTT服務(wù)采用Arduino Ciao Library - #include "DHT.h"
- #include <Wire.h>
- #include <UnoWiFiDevEd.h>
-
- #define CONNECTOR "mqtt"
- #define TOPIC "DHT11_TOPIC"
-
- // what digital pin we're connected to
- #define DHTPIN 7
- // Uncomment whatever type you're using!
- #define DHTTYPE DHT11 // DHT 11
-
- // Initialize DHT sensor.
- // Note that older versions of this library took an optional third parameter to
- // tweak the timings for faster processors. This parameter is no longer needed
- // as the current DHT reading algorithm adjusts itself to work on faster procs.
- DHT dht(DHTPIN, DHTTYPE);
-
- void setup() {
- Serial.begin(9600);
- //DHT11 begin
- dht.begin();
- //Ciao begin
- Ciao.begin();
- }
-
- void loop() {
- // Wait a few seconds between measurements.
- delay(6000);
- // Reading temperature or humidity takes about 250 milliseconds!
- // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
- float h = dht.readHumidity();
- // Read temperature as Celsius (the default)
- float t = dht.readTemperature();
-
- // Check if any reads failed and exit early (to try again).
- if (isnan(h) || isnan(t)) {
- Serial.println("Failed to read from DHT11 sensor!");
- return;
- }
-
- Serial.print("Humidity: ");
- Serial.print(h);
- Serial.print(" %\t");
- Serial.print("Temperature: ");
- Serial.println(t);
- String data = "{\"H\":" + String(h) +",\"T\":" + String(t)+"}";
- // pushes data into a channel
- Ciao.write(CONNECTOR, TOPIC,data);溫
- }
復(fù)制代碼
濕度web可視化
瀏覽器客戶端展示數(shù)據(jù),需要與MQTT服務(wù)通訊,這里采用MQTT client mqtt.js
可視化展示采用實(shí)時(shí)數(shù)據(jù)圖表可視化epoch.js
- <!DOCTYPE HTML>
- <html>
- <head>
- <title>epoch.js mqtt.js</title>
- <script src="https://unpkg.com/mqtt/dist/mqtt.min.js" type="text/javascript"></script>
- <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
- <script src="http://d3js.org/d3.v3.js" charset="utf-8"></script>
- <script src="http://epochjs.github.io/epoch/js/epoch.js" charset="utf-8"></script>
- <link rel="stylesheet" href="http://epochjs.github.io/epoch/css/epoch.css">
- </head>
- <body>
- <div id="container" style="min-width: 310px; height: 200px; margin: 30 auto" class="epoch"></div>
-
- <script>
- $(function(){
- var temperatureData = {
- label: "temperature",
- values:[]
- };
- var humidityData = {
- label: "humidity",
- values:[]
- };
- var chartData = [temperatureData,humidityData];
- var temperature,humidity,nextData = [];
- var mychart = $('#container').epoch({
- type: 'time.line',
- data: chartData,
- ticks:{ right: 5, bottom: 50, left: 5 },
- axes: ['left', 'bottom', 'right']
- });
- var client = mqtt.connect('http://192.168.31.175:9001'); // you add a ws:// url here
- client.subscribe("DHT11_TOPIC")
- client.on("message", function (topic, msg) {
- nextData = [];
- //console.log([topic, msg].join(": "));
- var jsonData = JSON.parse(msg);
- // console.log(jsonData);
- time = parseInt(new Date().getTime() / 1000);
- temperature = {time:time,y:jsonData.T};
- humidity = {time:time,y:jsonData.H};
- nextData.push(temperature);
- nextData.push(humidity);
- mychart.push(nextData);
- })
- });
-
- </script>
- </body>
- </html>
復(fù)制代碼
溫度可視化 實(shí)物圖 3.4部署與運(yùn)行過程第4章 體會(huì)與總結(jié)次基于MQTT與ESP8266的實(shí)時(shí)溫濕度采集系統(tǒng)的制作,讓我們增加了對(duì)從最低端傳感器的數(shù)據(jù)采集到頂端客戶端的數(shù)據(jù)顯示的過程,以及對(duì)MQTT協(xié)議的傳輸模式的了解。 到了物聯(lián)網(wǎng)時(shí)代,由于智能硬件的差異,相比互聯(lián)網(wǎng)終端,硬件配置要低得多,而且環(huán)境也復(fù)雜。在網(wǎng)絡(luò)不穩(wěn)定的情況下,保證數(shù)據(jù)的傳輸沒有問題、保證數(shù)據(jù)不被重復(fù)發(fā)送、連接斷開后重新連接,使用MQTT最適合物聯(lián)網(wǎng)數(shù)據(jù)的傳輸。 在制作過程中有以下一些注意事項(xiàng): - WiFi模塊需要通過連接網(wǎng)絡(luò)構(gòu)建TCP環(huán)境,而判定連接哪個(gè)網(wǎng)絡(luò)是根據(jù)用戶名和密碼確定的,路由器的用戶名和密碼在程序中是固定的,想要連接其他網(wǎng)絡(luò)必須修改程序中用戶名和密碼的內(nèi)容才能實(shí)現(xiàn)。
- MQTT消息的發(fā)送和訂閱都是依賴MQTT服務(wù)器的,沒有MQTT服務(wù)器,客戶端是無法訂閱和發(fā)送消息的。所以在最開始的時(shí)候,我們選擇了開放的云平臺(tái)阿里云作為服務(wù)器,阿里云能夠支持MQTT的接入,并且與MQTT.fx一起使用可以省去很多麻煩。
- 整個(gè)過程需要考慮多種情況,服務(wù)器的連接有兩種情況,發(fā)送端是否滿足發(fā)送的條件,接收端接接收到的是什么樣的報(bào)文等。
- 當(dāng)與服務(wù)器建立連接后并不是能立即發(fā)送數(shù)據(jù),首先需要判斷發(fā)送緩沖區(qū)有數(shù)據(jù),然后是滿足三種情況能開始發(fā)送數(shù)據(jù):連接報(bào)文、訂閱報(bào)文和連接和訂閱均成功。
- 由于室內(nèi)溫濕度處在變化中,而我們接收到的數(shù)據(jù)不能實(shí)時(shí)地顯示變化的溫度濕度,于是我們給數(shù)據(jù)發(fā)送加了定時(shí)器,通過串口控制,每10s鐘發(fā)送一次數(shù)據(jù)。
完整的Word格式文檔51黑下載地址:
基于MQTT技術(shù)的環(huán)境溫濕度可視化系統(tǒng).doc
(1.72 MB, 下載次數(shù): 21)
2020-3-27 13:57 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|