【ESP8266】ESP8266的MQTT客戶端搭建教程

前言

MQTT是IBM開發(fā)的一個(gè)即時(shí)通訊協(xié)議,面向M2M和物聯(lián)網(wǎng)的連接,采用輕量級(jí)發(fā)布和訂閱消息傳輸機(jī)制,并且有可能成為物聯(lián)網(wǎng)的重要組成部分。

ESP8266是一款物美價(jià)廉的Wi-Fi芯片,集成Tensilica L106 鉆石系列的32 位處理器和片上SRAM,多達(dá)17 個(gè)GPIO口,并擁有IIC、IIS、UART、PWM、IR遙控等片上資源。

ESP8266還提供官方的軟件開發(fā)開發(fā)包(SDK),目前最新版本是「ESP8266 NONOS SDK V2.0.0」。

這篇文章主要講解如何使用ESP8266作為MQTT客戶端,并連上在本地電腦搭建的MQTT服務(wù)器。

開發(fā)環(huán)境

首先簡(jiǎn)單說明一下博主的開發(fā)環(huán)境:

  • ESP8266開發(fā)環(huán)境:ESP8266 IDE 2.0
  • ESP8266 SDK版本:esp8266_nonos_sdk_v2.0.0_16_08_10_0
  • MQTT服務(wù)器:Apollo 1.7.1(本地搭建)
  • 操作系統(tǒng):64位 Win10系統(tǒng)
  • ESP8266開發(fā)板:NodeMCU(4MB Flash)

導(dǎo)入工程

如果讀者和博主使用的開發(fā)環(huán)境一樣,那么步驟1~4就好理解了,不是的話直接看圖片和步驟5:

  1. 在IDE環(huán)境中通過「File」->「Import」;
  2. 彈窗中選擇「C/C++」->「Existing Code as Makefile project」;
  3. 下一步「Browse...」,編譯器選擇「Cygwin GCC」;
  4. 之后導(dǎo)入的工程目錄如上圖,其中給「dirver_lib」文件下面的Makeflie添加bak后綴或刪除掉,免得編譯通不過。
  5. 從「example」文件夾中拷貝esp_mqtt_proj文件夾到主目錄,點(diǎn)擊編譯按鈕,如果成功就完成這一步驟了。
工程目錄

工程目錄圖

代碼分析

mqtt例程目錄

示例工程中最重要的是這兩個(gè)文件:user目錄下的user_main.c和inlcude目錄下的mqtt_config.h

其中user_main.c不用說了,玩過ESP8266的朋友都知道這是放主代碼的地方,其中user_init函數(shù)是SDK提供開發(fā)者放置初始化代碼的地方。下面主要分析mqtt_config.h。

mqtt_config.h代碼清單

#ifndef __MQTT_CONFIG_H__
#define __MQTT_CONFIG_H__

#define CFG_HOLDER  0x00FF55A4  /* Change this value to load default configurations */
#define CFG_LOCATION    0x79    /* Please don't change or if you know what you doing */
#define MQTT_SSL_ENABLE

/*DEFAULT CONFIGURATIONS*/

#define MQTT_HOST           "192.168.1.100" //or "mqtt.yourdomain.com"
#define MQTT_PORT           1883
#define MQTT_BUF_SIZE       1024
#define MQTT_KEEPALIVE      120  /*second*/

#define MQTT_CLIENT_ID      "DVES_%08X"
#define MQTT_USER           "DVES_USER"
#define MQTT_PASS           "DVES_PASS"

#define STA_SSID "DVES_HOME"
#define STA_PASS "yourpassword"
#define STA_TYPE AUTH_WPA2_PSK

#define MQTT_RECONNECT_TIMEOUT  5   /*second*/

#define DEFAULT_SECURITY    0
#define QUEUE_BUFFER_SIZE               2048

#define PROTOCOL_NAMEv31    /*MQTT version 3.1 compatible with Mosquitto v0.15*/
//PROTOCOL_NAMEv311         /*MQTT version 3.11 compatible with https://eclipse.org/paho/clients/testing/*/

#endif // __MQTT_CONFIG_H__

在這個(gè)文件中,有幾個(gè)宏定義可能需要修改的

  • MQTT_HOST,MQTT服務(wù)器地址
  • MQTT_PORT,MQTT服務(wù)器端口
  • MQTT_USER,MQTT服務(wù)器用戶名
  • MQTT_PASS,MQTT服務(wù)器密碼
  • STA_SSID,WI-FI帳號(hào)
  • STA_PASS,WI-FI密碼

還有一個(gè)最重要的宏定義——CFG_HOLDER,因?yàn)檫@個(gè)MQTT示例在ESP8266運(yùn)行過一次后會(huì)把這些信息保存到FLASH中,如果要繼續(xù)修改這些信息,記得要修改CFG_HOLDER這個(gè)宏定義,改成另一個(gè)數(shù)值即可。

CFG_HOLDER作的用是:在CFG_Load函數(shù)中,如果發(fā)現(xiàn)從FLASH讀取出來的CFG_HOLDER數(shù)值和宏定義的不一樣,則會(huì)更新這些信息,并保存到FLASH中。不修改CFG_HOLDER的話可能會(huì)發(fā)覺明明用戶名和密碼都正確但是就是連接不上去。

修改代碼及測(cè)試

修改代碼

根據(jù)上面分析,下面我們就可以修改示例代碼:

  1. STA_SSIDSTA_PASS修改為自己的WiFI名和密碼;
  2. 修改MQTT_USERMQTT_PASS為對(duì)應(yīng)的MQTT服務(wù)器的用戶名和密碼,Apollo服務(wù)器默認(rèn)是adminpassword;
  3. 修改MQTT_HOSTMQTT_PORT為MQTT服務(wù)器IP和PORT,目前是使用本地的MQTT服務(wù)器,所以是修改為自己電腦的IP和61613端口,PORT是整型值;
  4. 根據(jù)MQTT服務(wù)器的協(xié)議不同,可能需要使用MQTT v3.1.1版本,所以把PROTOCOL_NAMEv31注釋掉,使用PROTOCOL_NAMEv311。源碼的PROTOCOL_NAMEv311前面沒有#define,自己加上就行。
  5. 最后,修改CFG_HOLDER,以讓這些配置生效,直接給原來CFG_HOLDER定義的數(shù)值加1即可。
修改示例配置

編譯下載

編譯,查看Console窗口,如果輸出

編譯信息

那說明代碼已經(jīng)編譯成功。另外要注意,ESP8266 SDK v2.0版本生成的eagle.irom0text.bin燒寫起始地址是0x10000,而之前的版本燒寫地址是0x40000;eagle.flash.bin還是0x00000。由于博主使用的是4MB Flash的ESP8266,所以也建議讀者先確定手頭的ESP8266是不是4MB Flash(即32Mbit Flash,注意單位!4MB=32Mbit,F(xiàn)lash一般是以bit計(jì)算!)

另外如果Problems窗口報(bào)Errors的,只要Console窗口編譯通過,就可以不用管。

下載配置參考圖片:


下載配置

提醒:blank.bin和default.bin燒寫一次就行,另外也要留意不同的Flash大小,blank.bin和default.bin燒寫地址也不同。

上電測(cè)試

如果前面一切順利,打開串口,設(shè)置波特率為115200,上電后前面的亂碼不用管,之后串口打印信息如下,省略了一部分信息:

load ...
default configuration
MQTT_InitConnection
MQTT_InitClient

WIFI_INIT

……(省略)

connected with [你的WiFi名], channel 6
dhcp client start...
STATION_IDLE
STATION_IDLE
ip:[WiFi分配給ESP8266的IP],mask:255.255.255.0,gw:[WiFi網(wǎng)關(guān)IP]
TCP: Connect to ip [MQTT服務(wù)器IP:PORT]
MQTT: Connected to broker [MQTT服務(wù)器IP:PORT]
MQTT: Sending, type: 1, id: 0000
TCP: Sent
TCP: data received 4 bytes
MQTT: Connected to [MQTT服務(wù)器IP:PORT]
MQTT: Connected
MQTT: queue subscribe, topic"/mqtt/topic/0", id: 1
MQTT: queue subscribe, topic"/mqtt/topic/1", id: 2
MQTT: queue subscribe, topic"/mqtt/topic/2", id: 3
MQTT: queuing publish, length: 23, queue size(66/2048)
MQTT: queuing publish, length: 25, queue size(91/2048)
MQTT: queuing publish, length: 25, queue size(118/2048)
……

其中加粗帶方括號(hào)的字段根據(jù)測(cè)試環(huán)境不同而不同。

同時(shí)看源碼和串口信息可知,ESP8266向MQTT服務(wù)器訂閱了三個(gè)主題,假設(shè)使用的是本地搭建的MQTT服務(wù)器,那么查看MQTT服務(wù)器后臺(tái)就可以看到:


ESP8266MQTT示例代碼訂閱

同時(shí)在后臺(tái)的Connects頁面也可以看到ESP8266的鏈接:

ESP8266后臺(tái)鏈接

MQTT本地服務(wù)器搭建教程Windows版鏈接在后面。

另外博主已經(jīng)用ESP8266的MQTT連接上了OneNET云,連接該云需要注釋掉下面這條語句,在user_init函數(shù)下。

MQTT_InitLWT(&mqttClient, "/lwt", "offline", 0, 0);

原因是OneNET不支持,否則連接不上。

其他


本文首發(fā)于CSDN:http://blog.csdn.net/yannanxiu/article/details/53088534

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,836評(píng)論 18 139
  • 導(dǎo)語 翻譯自iot in five days 8.2 MQTT是什么?MQTT(formerly MQ Telem...
    happy1993閱讀 6,560評(píng)論 1 14
  • iOS開發(fā)中,關(guān)于MQTT的三方庫主要有兩種。 基于C實(shí)現(xiàn)的Mosquitto庫。當(dāng)然直接去調(diào)用C的接口并不是特別...
    Noskthing閱讀 24,563評(píng)論 20 22
  • 備份轉(zhuǎn)載金總的Note 概述 本文描述了對(duì) example broker 進(jìn)行性能測(cè)試時(shí), 客戶端所需進(jìn)行配置的相...
    Shaman閱讀 4,986評(píng)論 0 1
  • 這里主要大致講解一下mqtt與xmpp的知識(shí)歸納點(diǎn),以及倆者的一些區(qū)別。不喜勿噴。 1:MQTT(消息隊(duì)列遙測(cè)傳輸...
    icc_tips閱讀 7,133評(píng)論 1 3