1. 程式人生 > >WiFi-ESP8266入門開發(十七)--MQTT客戶端

WiFi-ESP8266入門開發(十七)--MQTT客戶端

注:對於ESP8266開源技術感興趣的可以加群,我們一起探索交流學習,群號:579932824。群名:ESP8266開源技術交流群。

介紹

MQTT是基於輕量級的基於釋出 - 訂閱的訊息傳遞協議。

  • 它比其他基於請求響應的API(如HTTP)更快(更快)。
  • 它是基於TCP / IP協議開發的。
  • 它允許遠端定位裝置在訊息代理的幫助下連線,訂閱,釋出等到伺服器上的特定主題。
  • MQTT Broker / Message Broker是發件人和收件人之間的一個模組。這是訊息驗證,轉換和路由的一個元素。
  • 經紀人負責將訊息分發給感興趣的客戶(訂閱客戶)。

MQTT經紀人

例如,如果溫度感測器釋出“溫度”主題的溫度資料(訊息),那麼訂購了“溫度”主題的感興趣的客戶就可以獲得如上所示的公佈的溫度資料。

MQTT廣泛應用於物聯網(IoT)嵌入式應用,每個感測器都連線到伺服器,並且可以通過網際網路進行控制。

NodeMCU是一個開源的物聯網平臺。這是一個執行在Espressif Systems的ESP8266 Wi-Fi SoC上的韌體。它具有可用的物聯網應用程式易於構建的無線網路。

NodeMCU的MQTT客戶端模組與MQTT協議版本3.1.1相同。確保您的代理支援3.1.1版,並且已正確配置。讓我們來看NodeMCU上用於MQTT的功能。

MQTT資料包形成

MQTT使用許多資料包格式來連線伺服器,並訂閱或釋出到伺服器上的主題。

請參閱下面的連結獲取MQTT OASIS標準。這將有助於理解MQTT資料包的形成。

編寫Arduino程式將NodeMCU配置為MQTT客戶端

  1. 控制來自遠端位置的LED亮度
  2. 通過POT(電位器)以數字形式傳送電壓到Adafruit儀表板的遠端位置。

這裡我們使用Adafruit伺服器來進行MQTT客戶端演示。

只需註冊並建立儀表板。成功建立儀表板後,我們將獲得AIO金鑰,稍後用於訪問饋送資料。

POT和LED連線到NodeMCU

POT和LED連線到NodeMCU

安裝所需的庫

如果您未在Arduino IDE中安裝NodeMCU板卡包,請先參考先前的博文。

這裡我們使用Adafruit庫作為上面的例子。我們將需要使用Arduino庫管理器來安裝Adafruit IOAdafruit MQTT

ArduinoHttpClient庫。

開啟Arduino IDE並導航到Sketch - > Include Library - > Manage Libraries ...

在Arduino中管理庫選項

庫管理器視窗將彈出。現在在搜尋框中輸入Adafruit IO Arduino,然後點選Adafruit IO Arduino庫選項上的安裝來安裝版本2.6.0或更高版本。

adafruit io arduino圖書館經理

現在,在搜尋框中輸入Adafruit MQTT,然後在Adafruit MQTT庫選項上單擊Install ,安裝版本0.17.0或更高版本。

adafruit mqtt圖書館

現在,在搜尋框中輸入Arduino Http客戶端,在ArduinoHttpClient庫選項中點選Install ,安裝0.3.0或更高版本。

arduino http庫

現在開啟Adafruit mqtt io儀表板的例子。要開啟它,請導航到檔案 - >示例 - > Adafruit MQTT庫 - > mqtt_esp8266

例如arduino esp8266

現在用正確的例子資訊編輯wifi和Adafruit io證書,如下圖所示。

例如mqtt esp8266編輯

我們修改了mqtt_esp8266的例子,如下面的例子

針對MQTT客戶端的Arduino Sketch


#include <ESP8266WiFi.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"

/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "...your SSID..."
#define WLAN_PASS       "...your password..."

/************************* Adafruit.io Setup *********************************/

#define AIO_SERVER      "io.adafruit.com"
#define AIO_SERVERPORT  1883                   // use 8883 for SSL
#define AIO_USERNAME    "...your AIO username (see https://accounts.adafruit.com)..."
#define AIO_KEY         "...your AIO key..."

/************ Global State (you don't need to change this!) ******************/

// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;
// or... use WiFiFlientSecure for SSL
//WiFiClientSecure client;

// Setup the MQTT client class by passing in the WiFi client and MQTT server and login details.
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);

/****************************** Feeds ***************************************/

// Setup a feed called 'potValue' for publishing.
// Notice MQTT paths for AIO follow the form: <username>/feeds/<feedname>
Adafruit_MQTT_Publish potValue = Adafruit_MQTT_Publish(&mqtt, AIO_USERNAME "/feeds/potValue");

// Setup a feed called 'ledBrightness' for subscribing to changes.
Adafruit_MQTT_Subscribe ledBrightness = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/ledBrightness");

/*************************** Sketch Code ************************************/

// Bug workaround for Arduino 1.6.6, it seems to need a function declaration
// for some reason (only affects ESP8266, likely an arduino-builder bug).
void MQTT_connect();

uint8_t ledPin = D6;
uint16_t potAdcValue = 0;
uint16_t ledBrightValue = 0;

void setup() {
  Serial.begin(9600);
  delay(10);

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

  // Connect to WiFi access point.
  Serial.println(); Serial.println();
  Serial.print("Connecting to ");
  Serial.println(WLAN_SSID);

  WiFi.begin(WLAN_SSID, WLAN_PASS);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.println("WiFi connected");
  Serial.println("IP address: "); Serial.println(WiFi.localIP());

  // Setup MQTT subscription for ledBrightness feed.
  mqtt.subscribe(&ledBrightness);
}

void loop() {
  // Ensure the connection to the MQTT server is alive (this will make the first
  // connection and automatically reconnect when disconnected).  See the MQTT_connect
  // function definition further below.
  MQTT_connect();

  // this is our 'wait for incoming subscription packets' busy subloop
  // try to spend your time here

  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(200))) {
    if (subscription == &ledBrightness) {
      Serial.print(F("Got LED Brightness : "));
      ledBrightValue = atoi((char *)ledBrightness.lastread);
      Serial.println(ledBrightValue);
      analogWrite(ledPin, ledBrightValue);
    }
  }

  // Now we can publish stuff!
  uint16_t AdcValue = analogRead(A0);
  if((AdcValue > (potAdcValue + 7)) || (AdcValue < (potAdcValue - 7))){
    potAdcValue = AdcValue;
    Serial.print(F("Sending pot val "));
    Serial.print(potAdcValue);
    Serial.print("...");
    if (! potValue.publish(potAdcValue)) {
      Serial.println(F("Failed"));
    } else {
      Serial.println(F("OK!"));
    }
  }
  // ping the server to keep the mqtt connection alive
  // NOT required if you are publishing once every KEEPALIVE seconds
  /*
  if(! mqtt.ping()) {
    mqtt.disconnect();
  }
  */
}

// Function to connect and reconnect as necessary to the MQTT server.
// Should be called in the loop function and it will take care if connecting.
void MQTT_connect() {
  int8_t ret;

  // Stop if already connected.
  if (mqtt.connected()) {
    return;
  }

  Serial.print("Connecting to MQTT... ");

  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) { // connect will return 0 for connected
       Serial.println(mqtt.connectErrorString(ret));
       Serial.println("Retrying MQTT connection in 5 seconds...");
       mqtt.disconnect();
       delay(5000);  // wait 5 seconds
       retries--;
       if (retries == 0) {
         // basically die and wait for WDT to reset me
         while (1);
       }
  }
  Serial.println("MQTT Connected!");
}

支援檔案

原始碼

相關推薦

WiFi-ESP8266入門開發()--MQTT客戶

注:對於ESP8266開源技術感興趣的可以加群,我們一起探索交流學習,群號:579932824。群名:ESP8266開源技術交流群。 介紹 MQTT是基於輕量級的基於釋出 - 訂閱的訊息傳遞協議。 它比其他基於請求響應的API(如HTTP)更快(更快)。 它是基於TC

WiFi-ESP8266入門開發(五)-HTTP客戶

注:對於ESP8266開源技術感興趣的可以加群,我們一起探索交流學習,群號:579932824。群名:ESP8266開源技術交流群。 介紹 HTTP(超文字傳輸​​協議)是標準的應用協議,用作客戶端和伺服器之間的請求 - 響應協議。 HTTP客戶端有助於傳送HTTP請求

WiFi-ESP8266入門開發(一)-使用PWM

注:對於ESP8266開源技術感興趣的可以加群,我們一起探索交流學習,群號:579932824。群名:ESP8266開源技術交流群。 介紹 脈寬調製(Pulse Width Modulation,PWM)是在保持波的頻率不變的同時改變脈寬的技術。 PWM生成

WiFi-ESP8266入門開發(九)--手機APP控制和透傳

注:對於ESP8266開源技術感興趣的可以加群,我們一起探索交流學習,群號:579932824。群名:ESP8266開源技術交流群。 1.手機控制         通過上一篇我們使用了電腦tcp除錯軟體來控制繼電器,今天我們使用手機來控制繼電器,這裡同樣是使用手機除錯

WiFi-ESP8266入門開發(十三)-使用SPI

注:對於ESP8266開源技術感興趣的可以加群,我們一起探索交流學習,群號:579932824。群名:ESP8266開源技術交流群。 介紹 序列外設介面(SPI)是摩托羅拉公司最初啟動的匯流排介面連線協議。 SPI介面使用四根線進行通訊。因此也被稱為四線序列通訊協議。

WiFi-ESP8266入門開發(一)-Arduino環境搭建

對於ESP8266開源技術感興趣的可以加群,我們一起探索交流學習,群號:579932824。群名:ESP8266開源技術交流群。 這一章將描述ESP8266的效能與指標,以及開發環境的搭建。 ESP8266是2015年推出的一款Wifi模組,準確來說是集成了Wifi功能的

Spring入門第二

url cati urn ksh base stock XML repo study 聲明式事務 直接上代碼: db.properties jdbc.user=root jdbc.password=logan123 jdbc.driverClass=com.mysql.j

WiFi-ESP8266入門http(3-1)網頁認證上網-post請求(原教程)

nts 時空 logo 全能 targe work sig html urn 教程:http://geek-workshop.com/thread-37484-1-1.html 源碼:鏈接:https://pan.baidu.com/s/1yuYYqsM-WSOb0Aby

MyBatis基礎入門》動態SQL

MyBatis基礎入門《十七》動態SQL 描述:   >> 完成多條件查詢等邏輯實現   >> 用於實現動態SQL的元素主要有:     > if     > trim     > where     > set     > choose(

C語言入門)之指標的基本概念

如何定義指標變數      普通變數:      資料型別 變數名稱;            指標變數:  &nb

嵌入式Linux開發——()Linux裝置驅動開發

一、字元裝置驅動程式 1)應用程式、庫、核心、驅動程式的關係 2)Linux驅動程式的分類和開發步驟     ①Linux的外設可分為3類:字元裝置(character device)、塊裝置(block device)、網路介面(network interfa

參考大神教程完成阿里雲自建伺服器esp8266mqtt客戶成功對接

阿里雲自建伺服器esp8266和mqtt客戶端成功對接 阿里雲伺服器部分參考esp8266嵌入式大神資料:大神部落格 最近組建了一個小群,感興趣的可以加入一起玩:476840321 微控制器也是很簡單的,用的esp8266最小系統。 過程中間遇到了

Window XP驅動開發() 晶片韌體程式設計 (程式碼實現,針對USB2.0 晶片CY7C68013A)

 一、韌體的修改 1、修改VID、PID 1、1   修改hex檔案中的VID與PID 在韌體工程下的dscr.a51檔案中修改。 1、2  修改EEPROM中的VID、PID 其中IIC_Hdr結構體中存放預設的VID、PID:    IIC_HDR IIC_

ESP8266ESP8266MQTT客戶搭建教程(基於NONS_SDK_v2.0)

前言 MQTT是IBM開發的一個即時通訊協議,面向M2M和物聯網的連線,採用輕量級釋出和訂閱訊息傳輸機制,並且有可能成為物聯網的重要組成部分。 ESP8266是一款物美價廉的Wi-Fi晶片,整合Tensilica L106 鑽石系列的32 位處理器和片上S

VS2010/MFC入門程式設計(多執行緒的建立,包括工作執行緒和使用者介面執行緒)

1.MFC多執行緒簡介 MFC對多執行緒進行了一層簡單的封裝,在Visual C++中每個執行緒都是從CWinThread類繼承而來的。每一個應用程式的執行都有一個主執行緒,這個主執行緒也是從CWinThread類繼承而來的。可以利用CWinThread物件建立應用程式執行的其它執行緒。 MFC用CW

【Android遊戲開發】讓玩家自定義手勢玩轉Android遊戲!—Android Gesture之【輸入法手勢技術】

原創,轉載務必在明顯處註明:轉載自 原文連結: http://www.himigame.com/android-game/340.html很多童鞋說我的程式碼執行後,點選home或者back後會程式異常,如果你也這樣遇到過,那麼你肯定沒有仔細讀完Himi的博文,第十九篇Him

ESP8266與NodeMCU開發(三)客戶

這一節將講解如何將ESP8266程式設計設定為一個網頁客戶端,訪問www.example.com,傳送請求並獲取返回資料,通過串列埠打印出來 流程如下: 1.首先需要連線上路由器或者任意AP,從而獲得能訪問外網的途徑,這一點在上一章節中已經說明。 相關程式碼: #def

unity3D遊戲開發之NGUI四

接下來我們講解下UIGrid,UIGrid是用來輕鬆的排列眾多widget到固定大小格子的指令碼。 編輯時和執行時都可以使用。如果想使用可變的格子單元大小,你可以使用UITable,屬性如下圖: Arrangement的值決定了子節點的擺放位置。Horizonta讓子節點

Android入門教程之 LinearLayout(線性佈局)

本節開始講Android中的佈局,Android中有六大布局,分別是: LinearLayout(線性佈局),RelativeLayout(相對佈局),TableLayout(表格佈局) FrameLayout(幀佈局),AbsoluteLayout(絕對佈局)