MQTT??esp8266??node.js??mqtt-spy??broker
閑言碎語
MQTT是一個由IBM整出來的基于tcp/IP的輕量級的發(fā)布/訂閱的通信協(xié)議,特別適用于M2M砌函,有可能成為IOT方面一個重要通信協(xié)議斩披。這里不提mqtt協(xié)議的細節(jié)內(nèi)容,只來說說如何用讹俊,想了解更多MQTT的內(nèi)容垦沉,可以看看其wiki或者在線doc。配合node.js的mqtt模塊,可以玩出不少好玩的東西來,這里有個例子仍劈。
nodeMCU提供了一個mqtt模塊厕倍,可以用來創(chuàng)建mqtt的客戶端,以連接到mqtt的broker贩疙。需確保broker支持3.1.1讹弯。
模塊函數(shù)
mqtt模塊的函數(shù)也是比較少,十只手指都能數(shù)過來这溅。
序號 | 函數(shù)名 | 參數(shù) | 返回值 |
---|---|---|---|
1 | mqtt.Client() | clientid, keepalive, username, password[, cleansession] | client |
2 | mqtt.client:close() | 空 | true / false |
3 | mqtt.client:connect() | host[, port[, secure[, autoreconnect]]][, function(client)[, function(client, reason)]] | true / false |
4 | mqtt.client:lwt() | topic, message[, qos[, retain] | 空 |
5 | mqtt.client:on() | event, function(client[, topic[, message]]) | 空 |
6 | mqtt.client:publish() | topic, payload, qos, retain[, function(client)] | true / false |
7 | mqtt.client:subscribe() | topic, qos[, function(client)] / table[, function(client)] | true / false |
8 | mqtt.client:unsubscribe() | topic[, function(client)] / table[, function(client)] | true / false |
經(jīng)過前面的幾篇文章對nodemcu其他模塊的介紹后组民,我們已經(jīng)可以從模塊的函數(shù)名窺探到上面這8個函數(shù)都有什么用了吧。創(chuàng)建客戶悲靴、連接臭胜、綁定事件回調(diào)、發(fā)布消息、訂閱/取消訂閱耸三,套路就這么簡單乱陡。
實踐一下
直接動手碼幾行代碼感受一下怎么用吧。不過仪壮,在這之前蛋褥,你還需要一個broker。你可以選擇用node.js自己實現(xiàn)一個(看這里)睛驳,亦或者選擇下載一個,這里找咯膜廊。當然乏沸,還有一個在線的可以選擇點我。如果你選擇在線的broker爪瓜,我選了列表中的第一個 iot.eclipse.org蹬跃,你可能需要兩個客戶端才能看到好的通信效果,這里推薦MQTT-SPY铆铆。
mqtt-spy默認有3個broker蝶缀。選擇那個iot.eclipse.com”』酰可能需要輸入你的名字翁都。
接著,添加一個訂閱谅猾。點擊 new柄慰,隨便輸入一個你想要的topic,最好復雜一點税娜,免得和別人重復了坐搔。
準備工作都做好后,就可以開始實踐了敬矩。先來看一個簡單的例子概行。
m = mqtt.Client("Node_MM", 120)
m:connect("iot.eclipse.org",
function(client)
print("connected")
m:publish("MyNode", "Hello World", 0, 0)
end,
function(client, reason)
print("fail reason" .. reason)
end
)
首先,創(chuàng)建一個客戶端弧岳,超時120秒凳忙,用戶名密碼,這里放空禽炬,函數(shù)的最后一個參數(shù)如果傳入0消略,client和server會保留對話,或者重新創(chuàng)建一個對話瞎抛,默認為1艺演。
然后,連接到iot.eclipse.com,端口號不填胎撤,默認1883晓殊,不加密,不自動連接伤提。凡是不知道干嘛用的可選參數(shù)巫俺,那就默認吧。:connect函數(shù)還有兩個回調(diào)函數(shù)肿男,一個是連接成功的時候回調(diào)介汹;一個是失敗的時候回調(diào),此時會傳入失敗原因舶沛,具體失敗原因看這里嘹承。
當連接成功的時候,publish一條topic為MyNode如庭,內(nèi)容為Hello World的消息出去叹卷。
趕緊send到nodeMCU里面看看吧。正常的話坪它,mqtt-spy會收到一條消息骤竹。也有可能因為網(wǎng)絡問題,導致沒有收到信息往毡。如果這樣的話蒙揣,那就自己手動publish一條吧~
再來看一個小例子抹竹,
m = mqtt.Client("Node_MM", 30)
m:lwt("node_mm", "lwt", 0, 0)
m:on("connect", function(client)
m:publish("node_mm", "online", 0, 0)
m:subscribe("pc_mm", 0, function(client)
print("subscribe success")
end)
end)
m:on("offline", function(client)
print("offline")
end)
m:on("message", function(client, topic, data)
print(topic .. ": ")
if data ~= nil then
print(data)
end
end)
m:connect("iot.eclipse.org")
函數(shù):lwt可以讓broker在設備掉線后廣播一條消息告訴其他客戶端今瀑,比如說設備沒電了后掉線。實驗的時候役拴,可以先斷開nodemcu的wifi連接惩阶。
然后用:on綁定事件挎狸,這里有"connect"、"offline"断楷、"message"锨匆。這里在"connect"事件回調(diào)中發(fā)布一條上線的消息,并訂閱topic冬筒。:on的"connect"和:connect函數(shù)的"connect"是指向同一個回調(diào)函數(shù)的恐锣,如果后面使用了:connect并設置了回調(diào)函數(shù),會使前面的回調(diào)失效舞痰。
"offline"是設備掉線時候的回調(diào)土榴。"message"則是接收到topic時的回調(diào)。
send或者save到nodeMCU响牛,看看mqtt-spy有什么反應吧~
一點擴展思路
上面的兩個例子也許并不能很好的展示MQTT的魅力玷禽。不過赫段,我們可以在"message"的回調(diào)中根據(jù)topic執(zhí)行一個不同的操作,比如說點亮一盞燈矢赁∨大希或者有多個設備的時候,可以來做設備間的聯(lián)動撩银,例如說另一個設備上線后點亮一盞燈给涕,或者說根據(jù)另一個設備上的光敏電阻值來點亮一盞燈怎么來來去去都是燈o(╯□╰)o,總之额获,發(fā)揮自己的腦洞吧够庙。
更多內(nèi)容
1、nodeMCU學習筆記–快速上手
2抄邀、nodeMCU學習筆記–tmr模塊
3耘眨、nodeMCU學習筆記–gpio模塊
4、nodeMCU學習筆記–pwm模塊
5撤摸、nodeMCU學習筆記–uart(附透傳例子)
6、nodeMCU學習筆記–wifi模塊·上
7褒纲、nodeMCU學習筆記–wifi模塊·中
8准夷、nodeMCU學習筆記–wifi模塊·下
9、nodeMCU學習筆記–net模塊
10莺掠、nodeMCU學習筆記--ws2812模塊