第四課 MQTT的使用
寫在前面的話:個人學習筆記,拋磚引玉,希望有興趣的人加入QQ羣415469069一起討論,歡迎有共同愛好的人。
本教程以ESP-12N,CP2102開發板爲例進行講解。
- 代碼。下載地址
分爲兩個文件:mqtt_test.lua和close_mqtt.lua。羣文件可以下載。
--mqtt_test.lua myClient = mqtt.Client("test_mqqt_20180123_mcu",120) myClient:connect("iot.eclipse.org", function(client) print("connected") end) myClient:lwt("mcu_to_pc_topic20180123","mcu is closed") myClient:on("connect", function(clinet) if(myClient:publish("mcu_to_pc_topic20180123","online",0,0))then print("pc connected mcu") end if(myClient:subscribe("pc_to_mcu_topic20180123",0))then print("subscribe is success.") end end) myClient:on("offline", function(client) myClient:publish("mcu_to_pc_topic20180123","offline",0,0) end) myClient:on("message", function(client , topic , message) print(“get a message.\n”) print(topic..":"..message) end) |
--mqtt_close.lua if(myClient:close()) then print("mqtt is closed.") else print("closed is failed.") end |
工作流程。
首先我們需要一個broker,這裏提供一些免費的服務器供參考。https://github.com/mqtt/mqtt.github.io/wiki/public_brokers。
爲了測試效果,我們需要另一個客戶端軟件,這裏我們選擇一個電腦端的mqtt客戶端(mqtt-spy-1.0.0),可以在羣文件(羣主教程工具)中下載。打開mqtt-spy-1.0.0.jar(需要安裝java環境,參考第一課)。按下圖操作。
在打開的窗口中,左側第一個就是我們要使用的,選擇它,在右側的窗口中紅框部分輸入我們的客戶端名稱。最好複雜一點,避免與其他人的重複。然後點擊應用設置(Apply),最後點擊打開連接。
此時,會在主界面上多出一個選項,點擊它
然後就是新建我們要監聽的主題(topic)。
至此,我們的電腦端的客戶端就配置完成了。然後我們開始建立我們的ESP上的客戶端。首先,看一下工作流程圖,如下:
然後複製代碼,上傳到ESP中執行。然後去看一下電腦端的客戶端,會監聽到一條消息。
接着我們從電腦端的客戶端發送一條消息,讓ESP去接收。topic的名稱要跟ESP訂閱的topic的一致。填好Topic和Data之後,點擊Publish。然後去看ESP的後臺。我們已經成功接收到消息。
如何關閉電腦端和ESP端的客戶端與broker的連接,如圖:
三、說明。
1、創建一個客戶端。
句法:mqtt.Client(clientid, keepalive[, username, password, cleansession]) 參數: clientid 客戶端ID keepalive 保持秒 username 用戶名 password 用戶密碼 cleansession 0/1爲false/ true。默認值是1(true)。 返回: MQTT client |
2、連接broker。
句法:mqtt:connect(host[, port[, secure[, autoreconnect]]][, function(client)[, function(client, reason)]]) 參數: host 主機,域或IP(字符串) port 經紀人端口(號碼),默認1883 secure 0/1 for false/ true,默認爲0.注意net模塊中記錄的約束條件。 autoreconnect 0/1爲false/ true,默認爲0.此選項已棄用。 function(client) 當連接建立時的回調函數 function(client, reason)當無法建立連接時回調函數。不應該調用進一步的回調。 返回: true,false |
3、監聽事件。
句法:mqtt:on(event, function(client[, topic[, message]])) 參數: event 可以是“connect”,“message”或“offline” function(client[, topic[, message]])回調函數。第一個參數是客戶端。如果事件是“消息”,則第二和第三參數被接收話題和消息(字符串)。 |
4、發佈消息。
句法:mqtt:publish(topic, payload, qos, retain[, function(client)]) 參數: topic要發佈的主題(主題字符串) message 要發佈的消息(緩衝區或字符串) qos QoS等級 retain 保留標記 function(client)收到PUBACK時觸發可選的回調。注意:當多次調用publish()時,定義的最後一個回調函數將被調用用於ALL發佈命令。 返回:true,false |
- 訂閱主題。
句法:mqtt:subscribe(topic, qos[, function(client)])mqtt:subscribe(table[, function(client)]) 參數: topic一個主題字符串 qos QoS訂閱級別,默認爲0 table qos'對的數組來訂閱 function(client)訂閱成功時觸發可選的回調。注意:當多次調用subscribe()時,將爲所有訂閱命令調用定義的最後一個回調函數。 返回: true,false |
- 取消訂閱。
句法: mqtt:unsubscribe(topic[, function(client)]) mqtt:unsubscribe(table[, function(client)]) 參數 topic一個主題字符串 table “主題,任何對”的數組成對來取消訂閱 function(client)取消訂閱成功時觸發可選的回調。注意:當多次調用unsubscribe()時,將會爲所有取消訂閱命令調用定義的最後一個回調函數。 返回: true,false |
7、設置遺囑lwt。
句法:mqtt:lwt(topic, message[, qos[, retain]]) 參數: topic 將要發佈的主題(字符串) message 要發佈的消息(緩衝區或字符串) qos QoS級別,默認爲0 retain 保留標誌,默認爲0 |
8、關閉。
句法:mqtt:close() 參數: 無。 返回: true,false |