WiFi-ESP8266入門開發(十七)--MQTT客戶端
注:對於ESP8266開源技術感興趣的可以加群,我們一起探索交流學習,群號:579932824。群名:ESP8266開源技術交流群。
介紹
MQTT是基於輕量級的基於釋出 - 訂閱的訊息傳遞協議。
- 它比其他基於請求響應的API(如HTTP)更快(更快)。
- 它是基於TCP / IP協議開發的。
- 它允許遠端定位裝置在訊息代理的幫助下連線,訂閱,釋出等到伺服器上的特定主題。
- MQTT Broker / Message Broker是發件人和收件人之間的一個模組。這是訊息驗證,轉換和路由的一個元素。
- 經紀人負責將訊息分發給感興趣的客戶(訂閱客戶)。
例如,如果溫度感測器釋出“溫度”主題的溫度資料(訊息),那麼訂購了“溫度”主題的感興趣的客戶就可以獲得如上所示的公佈的溫度資料。
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客戶端
- 控制來自遠端位置的LED亮度
- 通過POT(電位器)以數字形式傳送電壓到Adafruit儀表板的遠端位置。
這裡我們使用Adafruit伺服器來進行MQTT客戶端演示。
只需註冊並建立儀表板。成功建立儀表板後,我們將獲得AIO金鑰,稍後用於訪問饋送資料。
POT和LED連線到NodeMCU
安裝所需的庫
如果您未在Arduino IDE中安裝NodeMCU板卡包,請先參考先前的博文。
這裡我們使用Adafruit庫作為上面的例子。我們將需要使用Arduino庫管理器來安裝Adafruit IO,Adafruit MQTT
開啟Arduino IDE並導航到Sketch - > Include Library - > Manage Libraries ...
庫管理器視窗將彈出。現在在搜尋框中輸入Adafruit IO Arduino,然後點選Adafruit IO Arduino庫選項上的安裝來安裝版本2.6.0或更高版本。
現在,在搜尋框中輸入Adafruit MQTT,然後在Adafruit MQTT庫選項上單擊Install ,安裝版本0.17.0或更高版本。
現在,在搜尋框中輸入Arduino Http客戶端,在ArduinoHttpClient庫選項中點選Install ,安裝0.3.0或更高版本。
現在開啟Adafruit mqtt io儀表板的例子。要開啟它,請導航到檔案 - >示例 - > Adafruit MQTT庫 - > mqtt_esp8266
現在用正確的例子資訊編輯wifi和Adafruit io證書,如下圖所示。
我們修改了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!");
}
支援檔案
原始碼
- NodeMCU MQTT客戶端 下載
119
相關推薦
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
參考大神教程完成阿里雲自建伺服器esp8266和mqtt客戶端成功對接
阿里雲自建伺服器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_
【ESP8266】ESP8266的MQTT客戶端搭建教程(基於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(絕對佈局)