0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在Raspberry Pi上安裝和測試MQTT進行IoT通信

科技觀察員 ? 來源:circuitdigest ? 作者:Rishabh Jain ? 2022-09-06 15:14 ? 次閱讀

MQTT是一種用于通過 Internet 發(fā)送和接收消息的協(xié)議。我們之前在物聯(lián)網(wǎng)電表和Raspberry Pi Alexa中使用此協(xié)議在互聯(lián)網(wǎng)上發(fā)布數(shù)據(jù)。在本教程中,我們將更多地了解 MQTT 及其相關(guān)術(shù)語。在這里,我們將使用Raspberry Pi 作為本地 MQTT 代理,并通過 MQTT 應用程序儀表板控制連接到 NodeMCU ESP12E 的 LED。DHT11 傳感器也連接到 NodeMCU,因此我們再次使用 Raspberry Pi 作為本地 MQTT 代理,在 MQTT 儀表板上讀取溫度和濕度。

因此,讓我們從了解 MQTT 及其相關(guān)術(shù)語開始。

什么是 MQTT?

MQTT 代表IBM 設計的 Message Queue Telemetry Transport。該協(xié)議簡單輕量,用于通過互聯(lián)網(wǎng)發(fā)送和接收消息,專為低帶寬使用的設備而設計。如今,該協(xié)議經(jīng)常在物聯(lián)網(wǎng)設備中用于發(fā)送和接收傳感器數(shù)據(jù)。此外,在基于物聯(lián)網(wǎng)的家庭自動化系統(tǒng)中,無需使用大量互聯(lián)網(wǎng)數(shù)據(jù)即可輕松使用此協(xié)議。

在 MQTT 中經(jīng)常使用的術(shù)語很少:

訂閱和發(fā)布

信息

話題

經(jīng)紀人

1.訂閱和發(fā)布:訂閱是從其他設備獲取數(shù)據(jù),發(fā)布是向其他設備發(fā)送數(shù)據(jù)。

poYBAGMW8l2AFmWBAAAbtxc53HA219.png

當 device1 將數(shù)據(jù)發(fā)送到 device2 時,它稱為發(fā)布者,另一個稱為訂閱者,反之亦然。

2. 消息:消息是我們發(fā)送和接收的信息。它可以是數(shù)據(jù)或任何類型的命令。例如,如果我們將溫度數(shù)據(jù)發(fā)布到云端,則此溫度數(shù)據(jù)稱為消息。

3. 主題:這是您注冊對傳入消息感興趣的方式或您如何指定要發(fā)布消息的位置。主題用正斜杠分隔的字符串表示。使用 MQTT 在主題上發(fā)布數(shù)據(jù),然后 MQTT 設備訂閱主題以獲取數(shù)據(jù)。

4. MQTT Broker:這個東西負責接收所有發(fā)布者的消息,過濾消息,然后將消息發(fā)布給感興趣的訂閱者。

pYYBAGMW8lmALKHEAACSOffJaKU455.png

當這個代理托管在云上時,它被稱為 MQTT 云。有許多基于云的 MQTT 服務,例如 Adafruit IO、MQTT.IO、IBM bluemix、Microsoft Azure 等。MQTT 也可以與流行的 Amazon AWS 云一起使用,我們在Amazon AWS 入門教程中對此進行了說明。

我們可以使用 Raspberry Pi 創(chuàng)建自己的 MQTT 代理。這將是本地 MQTT 代理,即您只能在本地網(wǎng)絡上發(fā)送和接收數(shù)據(jù),而不是從任何地方。所以在這里我們將在 Raspberry Pi 中安裝 Mosquitto MQTT 代理,使其成為本地 MQTT 代理,并將溫度數(shù)據(jù)從 NodeMCU 發(fā)送到 MQTT 儀表板應用程序。此外,我們將使用代理控制連接到 NodeMCU 的 LED。

樹莓派上安裝 Mosquitto MQTT 代理

在您的 Raspberry pi 中打開終端并鍵入以下命令以安裝代理

sudo apt update 
sudo apt install -y mosquitto mosquitto-clients

等待安裝完成。現(xiàn)在,要在啟動樹莓派時啟動代理,請鍵入以下命令

sudo systemctl 啟用 mosquitto.service

就是這樣,我們都準備好啟動我們的 MQTT 代理了。要檢查它是否安裝正確,請輸入以下命令

蚊子-v

此命令將為您提供 MQTT 代理的版本。它應該是 1.4.x 或更高版本。

測試 Raspberry Pi Mosquitto Broker

1. 使用以下命令在后臺運行 Mosquitto 代理

蚊子-d

2. 現(xiàn)在,我們將使用以下命令在 exampleTopic 中訂閱一個主題

mosquitto_sub -d -t exampleTopic

3. 現(xiàn)在,我們將發(fā)布一些消息到 exampleTopic

mosquitto_pub -d -t exampleTopic -m "Hello world!"

您將收到 Hello World!用戶終端中的消息。

pYYBAGMW8lOAL1UkAAPrhFV1P-A527.png

現(xiàn)在,在我們使用 NodeMCU 和MQTT 儀表板應用程序的案例中,是時候控制和從另一臺設備獲取數(shù)據(jù)了。

首先,我們將通過使用 App 發(fā)送命令來控制 LED,因此在這種情況下,NodeMCU 表現(xiàn)為訂閱者,而 App 表現(xiàn)為發(fā)布者。

然后 ESP12E 還連接了 DHT11 傳感器,并將此溫度讀數(shù)發(fā)送到 Mobile MQTT 應用程序,因此在這種情況下,移動設備將成為訂閱者,NodeMCU 將成為發(fā)布者。為了在各自的主題上轉(zhuǎn)發(fā)這些消息,使用了 Mosquitto MQTT 代理。

電路原理

pYYBAGMW8k-AXkE7AADSfc0AfOo702.png

如圖所示連接電路。這里 DHT11 用于溫度讀數(shù),但也可以使用LM35 溫度傳感器。

讓我們開始編寫 NodeMCU 的代碼來訂閱和發(fā)布數(shù)據(jù)。

pYYBAGMW8kuABPEAAAG15-OAC18767.png

代碼和解釋

在這里,我們將使用 Adafruit MQTT 庫模板,并將更改代碼中所需的內(nèi)容。只需更改一些內(nèi)容,即可使用相同的代碼將數(shù)據(jù)發(fā)布和訂閱到 Adafruit IO 云。

為此,從Sketch -》 Include Library -》 Manage Libraries 下載 Adafruit MQTT 庫。搜索 Adafruit MQTT 并安裝它。安裝庫后。轉(zhuǎn)到 示例-》 Adafruit mqtt 庫-》 mqtt_esp8266

poYBAGMW8keAFBlYAAN1gotwK3g701.png

然后根據(jù)我們的 Raspberry Pi IP 地址和 Wi-Fi 憑據(jù)編輯此代碼。

包括 ESP8266WIFI 和 Adafruit MQTT 的所有庫。

#include  
#include "Adafruit_MQTT.h" 
#include "Adafruit_MQTT_Client.h" 
#include "DHT.h"

然后為您想要連接 ESP-12e 的 Wi-Fi 定義 SSID 和密碼。確保您的 RPi 和 NodeMCU 連接到同一個網(wǎng)絡。

#define WLAN_SSID "xxxxxxxx" 
#define WLAN_PASS "xxxxxxxxxxx"

本節(jié)定義 Adafruit 服務器,在本例中是您的 Raspberry Pi 的 IP 地址和服務器端口。

#define AIO_SERVER "你的 Pi 的 IP 地址" 
#define AIO_SERVERPORT 1883                  

下面的字段將保持空白,因為我們沒有使用 Adafruit 云。

#define AIO_USERNAME "" 
#define AIO_KEY ""

然后創(chuàng)建一個 ESP8266 WiFiClient 類來連接到 MQTT 服務器。

WiFiClient客戶端;

通過傳入 WiFi 客戶端和 MQTT 服務器以及登錄詳細信息來設置 MQTT 客戶端類。

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

設置一個名為“溫度”的提要來發(fā)布溫度。

Adafruit_MQTT_Publish 溫度 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

設置一個名為“l(fā)ed1”的提要來訂閱更改。

Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/led");

在setup函數(shù)中,我們聲明了要在其上獲得輸出的 NodeMCU 的 PIN。然后,將 NodeMCU 連接到 Wi-fi 接入點。

無效設置() { 
  Serial.begin(115200);
  延遲(10);
  pinMode(LED,輸出);
  Serial.println(F("Adafruit MQTT demo")); 
  // 連接到 WiFi 接入點。
  序列號.println(); 序列號.println(); 
  Serial.print("正在連接"); 
  Serial.println(WLAN_SSID); 
  WiFi.開始(WLAN_SSID,WLAN_PASS);
  而 (WiFi.status() != WL_CONNECTED) { 
.... 
…… 
…
為 led 提要設置 MQTT 訂閱。
  mqtt.subscribe(&led1); 
}

在循環(huán)函數(shù)中,我們將使用 MQTT_connect() 確保與 MQTT 服務器的連接處于活動狀態(tài);功能。

無效循環(huán)() { 
  MQTT_connect();

現(xiàn)在,訂閱 'led' 提要并從 MQTT 代理獲取字符串,并使用atoi() 將此字符串轉(zhuǎn)換為數(shù)字;函數(shù)并使用digitalWrite()將此數(shù)字寫入 LED 引腳;功能。

Adafruit_MQTT_Subscribe *訂閱;

  while ((subscription = mqtt.readSubscription(20000))) { 
    if (subscription == &led1) { 
      Serial.print(F("Got: ")); 
      Serial.println((char *)led1.lastread); 
      int led1_State = atoi((char *)led1.lastread); 
      數(shù)字寫入(LED,led1_State);
    }

現(xiàn)在,獲取變量中的溫度并使用Temperature.publish(t)函數(shù)發(fā)布該值。

浮動 t = dht.readTemperature(); 
… 
..

  if (!Temperature.publish(t)) { 
    Serial.println(F("Failed")); 
  } else { 
    Serial.println(F("OK!")); 
  }


#include

#include "Adafruit_MQTT.h"

#include "Adafruit_MQTT_Client.h"

#include "DHT.h"


#define LED D5

#define DHTPIN D4


#define WLAN_SSID "awesome"

#define WLAN_PASS "awesome12"


#define AIO_SERVER "192.168.43.177" //RPi的IP地址

#define AIO_SERVERPORT 1883

#define AIO_USERNAME ""

#define AIO_KEY ""


WiFiClient客戶端;

Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

Adafruit_MQTT_Publish 溫度 = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/temperature");

Adafruit_MQTT_Subscribe led1 = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/led");

#define DHTTYPE DHT11 // DHT 11


DHT dht(DHTPIN, DHTTYPE);

uint32_t 延遲時間;



/****************************** 草圖代碼 ************************ ******************/


無效 MQTT_connect();


無效設置() {

Serial.begin(115200);


延遲(10);

pinMode(LED,輸出);

Serial.println(F("Adafruit MQTT demo"));


// 連接到 WiFi 接入點。

序列號.println(); 序列號.println();

Serial.print("正在連接");

Serial.println(WLAN_SSID);


WiFi.開始(WLAN_SSID,WLAN_PASS);

而(WiFi.status()!= WL_CONNECTED){

延遲(500);

Serial.print(".");

}

Serial.println();


Serial.println("WiFi 連接");

Serial.println("IP地址:"); Serial.println(WiFi.localIP());



//設置 DHT 傳感器

dht.begin();


// 為 onoff feed 設置 MQTT 訂閱。

mqtt.subscribe(&led1);



}


uint32_t x = 0;


void loop() {

// 確保與 MQTT 服務器的連接處于活動狀態(tài)(這將建立第一個

// 連接并在斷開連接時自動重新連接)。請參閱下面的 MQTT_connect

// 函數(shù)定義。

MQTT_connect();

// 這是我們的“等待收到的訂閱數(shù)據(jù)包”繁忙的子循環(huán)

// 試著把你的時間花在這里


Adafruit_MQTT_Subscribe *訂閱;

while ((subscription = mqtt.readSubscription(20000))) {

if (subscription == &led1) {

Serial.print(F("Got: "));

Serial.println((char *)led1.lastread);

int led1_State = atoi((char *)led1.lastread);

數(shù)字寫入(LED,led1_State);

Serial.println("onnn");

}



}


// 以攝氏度讀取溫度(默認)

float t = dht.readTemperature();

// 檢查是否有任何讀取失敗并提前退出(重試)。

if (isnan(t)) {

Serial.println("讀取 DHT 傳感器失??!");

返回;

}

if (! Temperature.publish(t)) {

Serial.println(F("Failed"));

} else {

Serial.println(F("OK!"));

}


}


// 根據(jù)需要連接和重新連接到 MQTT 服務器的函數(shù)。

// 應該在循環(huán)函數(shù)中調(diào)用,如果連接會小心。

無效 MQTT_connect() {

int8_t ret;


// 如果已經(jīng)連接則停止。

if (mqtt.connected()) {

返回;

}


Serial.print("正在連接 MQTT...");

uint8_t 重試次數(shù) = 3;

while ((ret = mqtt.connect()) != 0) { // connect 將返回 0 連接

Serial.println(mqtt.connectErrorString(ret));

Serial.println("5 秒后重試 MQTT 連接...");

mqtt.disconnect();

延遲(5000);// 等待 5 秒

重試--;

if (retries == 0) {

// 基本上死了,等待 WDT 重置我

while (1);

}

}

Serial.println("MQTT 已連接!");

}

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • led
    led
    +關(guān)注

    關(guān)注

    240

    文章

    23001

    瀏覽量

    655028
  • IOT
    IOT
    +關(guān)注

    關(guān)注

    186

    文章

    4142

    瀏覽量

    195701
  • NODEMCU
    +關(guān)注

    關(guān)注

    13

    文章

    289

    瀏覽量

    21238
  • MQTT
    +關(guān)注

    關(guān)注

    5

    文章

    641

    瀏覽量

    22362
收藏 人收藏

    評論

    相關(guān)推薦

    如何在Raspberry Pi安裝TensorFlow

     本教程中,我們將學習如何在 Raspberry Pi 安裝 TensorFlow,并將展示一些
    發(fā)表于 09-01 16:35 ?2137次閱讀
    如何在<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b><b class='flag-5'>上</b><b class='flag-5'>安裝</b>TensorFlow

    Raspberry Pi 開發(fā)板優(yōu)化設計

    Raspbian,這是針對 Raspberry Pi 開發(fā)板優(yōu)化的 GNU/Linux 操作系統(tǒng) (OS) 版本。開發(fā)人員可以將含有 Raspbian 安裝程序 NOOBS 的 SD 卡插入
    發(fā)表于 07-16 09:54

    Raspberry Pi 3和3 b +的Android Pie 9.0

    Raspberry Pi 3和3 b +的Android Pie 9.0Raspberry Pi
    發(fā)表于 09-29 14:28

    安裝Raspberry Pi Clock Hat的教程分享

    Raspbian 的所有風格,例如 Raspbian OS、Retro Pi、Kodi 等。安裝:對于安裝,您需要做的就是按照項目git 存儲庫中提到的步驟進行操作。啟用樹莓派 SP
    發(fā)表于 07-05 06:01

    如何在Raspberry安裝TensorFlow

    Raspberry Pi安裝TensorFlow曾經(jīng)是一項令人沮喪的任務。但是,隨著Raspberr
    的頭像 發(fā)表于 07-30 14:30 ?5081次閱讀
    如何在<b class='flag-5'>Raspberry</b><b class='flag-5'>上</b><b class='flag-5'>安裝</b>TensorFlow

    如何安裝Quad Boot Raspberry Pi

    運行Raspberry Pi安裝程序,我們將在其中選擇要安裝的操作系統(tǒng)。在這種情況下,我們將選擇RasPlex,Openelec,Raspbian和RetroPie
    的頭像 發(fā)表于 11-13 16:22 ?1287次閱讀

    用于Raspberry Pi的DIN導軌安裝

    電子發(fā)燒友網(wǎng)站提供《用于Raspberry Pi的DIN導軌安裝.zip》資料免費下載
    發(fā)表于 08-03 10:09 ?1次下載
    用于<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>的DIN導軌<b class='flag-5'>安裝</b>

    Raspberry Pi安裝RetroPie的教程

    RetroPie是一個用于 Raspberry Pi 模擬復古視頻游戲的軟件庫。本教程中,我們將在
    的頭像 發(fā)表于 08-26 15:26 ?3862次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b><b class='flag-5'>上</b><b class='flag-5'>安裝</b>RetroPie的教程

    使用Adafruit IO作為MQTT控制Raspberry Pi GPIO的AC設備

    本教程中,我們將使用 Adafruit IO 作為 MQTT 代理來控制連接到 Raspberry Pi GPIO 的 AC 設備。
    的頭像 發(fā)表于 09-01 16:30 ?2496次閱讀
    使用Adafruit IO作為<b class='flag-5'>MQTT</b>控制<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> GPIO的AC設備

    Raspberry Pi安裝Android的方法

    Raspberry Pi 中使用的流行操作系統(tǒng)是 Raspbian,它是一個基于 linux 的 Raspberry Pi 官方操作系統(tǒng),我們使用它構(gòu)建了許多
    的頭像 發(fā)表于 09-05 15:10 ?1.8w次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b><b class='flag-5'>上</b><b class='flag-5'>安裝</b>Android的方法

    使用Raspberry Pi的OpenCV庫構(gòu)建人臉識別系統(tǒng)

    本教程中,我們將學習如何使用 Raspberry Pi 的 OpenCV 庫構(gòu)建我們自己的人臉識別系統(tǒng)。將此系統(tǒng)安裝在便攜式
    發(fā)表于 09-07 15:48 ?1157次閱讀
    使用<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b><b class='flag-5'>上</b>的OpenCV庫構(gòu)建人臉識別系統(tǒng)

    如何在Raspberry Pi 3安裝OpenCV4庫

    今天我們將學習如何在 Raspberry Pi 3 安裝 OpenCV4 庫,以便我們可以將其用于計算機視覺應用程序。這將允許 OpenCV
    的頭像 發(fā)表于 09-08 16:09 ?1553次閱讀
    如何在<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b> 3<b class='flag-5'>上</b><b class='flag-5'>安裝</b>OpenCV4庫

    Raspberry Pi安裝Cam Web界面

    電子發(fā)燒友網(wǎng)站提供《Raspberry Pi安裝Cam Web界面.zip》資料免費下載
    發(fā)表于 01-03 11:00 ?0次下載
    <b class='flag-5'>在</b><b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>零<b class='flag-5'>上</b><b class='flag-5'>安裝</b>Cam Web界面

    Raspberry Pi模擬Commodore Amiga

    現(xiàn)在,您只要使用一個Raspberry Pi就可以輕松實現(xiàn)對Amiga的探索!本項目中,您可以使用任意Pi,但是為了獲得更好的性能,Raspber
    的頭像 發(fā)表于 02-25 17:29 ?978次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b><b class='flag-5'>上</b>模擬Commodore Amiga

    Windows IoTRaspberry Pi:讀取按鈕

    電子發(fā)燒友網(wǎng)站提供《Windows IoTRaspberry Pi:讀取按鈕.zip》資料免費下載
    發(fā)表于 07-10 11:13 ?0次下載
    Windows <b class='flag-5'>IoT</b>和<b class='flag-5'>Raspberry</b> <b class='flag-5'>Pi</b>:讀取按鈕