簡(jiǎn)介
Air780EP 是合宙的低功耗4G模組之一,支持LuatOS的腳本二次開發(fā),即使是不太懂技術(shù)的老板,也能輕松使用 Air780EP開發(fā)產(chǎn)品。
本文應(yīng)各位大佬邀請(qǐng),詳細(xì)講解了Air780EP 的MQTT的應(yīng)用教程!
MQTT協(xié)議具有長連接、低帶寬、高可靠性的優(yōu)勢(shì),非常適合物聯(lián)網(wǎng)設(shè)備的通信需求。
除了MQTT,Air780EP還提供了TCP、UDP、HTTP、WebSocket、FTP、NTP等多種網(wǎng)絡(luò)協(xié)議的支持,使得設(shè)備可以靈活地接入不同的網(wǎng)絡(luò)環(huán)境和平臺(tái)。
實(shí)用場(chǎng)景:需要服務(wù)器下發(fā)消息給設(shè)備,需要及時(shí)收到。例如,遠(yuǎn)程開關(guān),充電樁等
合宙支持LuatOS功能的模組型號(hào),除本文介紹的Air780EP外, 還有Air780EPA、Air780E、Air780EX、Air201、Air780EPT、Air780EPS等型號(hào), 本文介紹的MQTT應(yīng)用流程,同樣也適用于這些型號(hào)。
材料準(zhǔn)備
需要用到的材料和工具:
780EP開發(fā)板一套,包括天線SIM卡,USB線
PC電腦,以及登錄官方IOT后臺(tái) https://iot.openluat.com/
固件和DEMO下載地址 LuatOS軟件包
名詞解析:
user_name用戶名,password密碼,client_id用戶標(biāo)識(shí),MQTT可以通過前兩個(gè)參數(shù)保證連接的安全,通過client_id確保設(shè)備唯一性。
QOS表示消息質(zhì)量,分為0,1,2三個(gè)等級(jí),分別表示只發(fā)一次,至少收到一次和只收到一次,通過QOS可以根據(jù)數(shù)據(jù)的重要性靈活選擇發(fā)送方式以節(jié)省帶寬和保證數(shù)據(jù)可靠。
關(guān)于publish時(shí)QOS值的說明
QOS為0時(shí),壓入底層TCP發(fā)送堆棧,視為成功
QOS為1時(shí),收到服務(wù)器回應(yīng)PUBACK,視為成功
QOS為2時(shí),收到服務(wù)器響應(yīng)PUBREC,立即上行PUBCOMP壓入TCP發(fā)送隊(duì)列,視為成功
mqtt_host主機(jī),mqtt_port端口,MQTT需要連接的服務(wù)器參數(shù)。mqtt_host可以說是ip或者域名。
topic主題,根據(jù)主題區(qū)別消息類型和來源,主要用來分類數(shù)據(jù)。同時(shí)mqtt是發(fā)布訂閱模型,topic是發(fā)布和訂閱者通信的重要通道。
payload消息內(nèi)容,發(fā)布和訂閱的具體數(shù)據(jù)。
retain保留消息,保留消息是一條將保留標(biāo)志(retained flag)置為true的普通MQTT消息。
broker會(huì)針對(duì)主題依照QoS級(jí)別保留最后一條保留消息,當(dāng)訂閱者訂閱主題時(shí)會(huì)立即收到保留消息。broker僅為每個(gè)主題保留一條保留消息。
API說明:
API接口 | 描述 |
---|---|
mqtt.create() | 創(chuàng)建一個(gè)mqtt client實(shí)例 |
mqttc:connect() | 連接mqtt服務(wù)器 |
mqttc:subscribe() | 訂閱主題 |
mqttc:unsubscribe() | 取消訂閱主題 |
mqttc:publish() | 發(fā)布消息 |
mqttc:disconnect() | 斷開與服務(wù)器的連接 |
實(shí)現(xiàn)流程
1. 創(chuàng)建一個(gè)Task協(xié)程
接口
? sys.taskInit(func, arg1, arg2, argN)
參數(shù)
傳入值類型 | 解釋 |
---|---|
function | 待執(zhí)行的函數(shù),可以是匿名函數(shù), 也可以是local或全局函數(shù) |
any | 需要傳遞的參數(shù)1,可選 |
any | 需要傳遞的參數(shù)2,可選 |
any | 需要傳遞的參數(shù)N,可選 |
返回值
返回值類型 | 解釋 |
---|---|
task | 協(xié)程對(duì)象 |
2. 等待網(wǎng)絡(luò)就緒
3. 創(chuàng)建一個(gè)mqtt實(shí)例
接口
? mqtt.create(adapter,host,port,ssl,isipv6)
參數(shù)
傳入值類型 | 解釋 |
---|---|
int | 適配器序號(hào), 只能是socket.ETH0, socket.STA, socket.AP,如果不填,會(huì)選擇平臺(tái)自帶的方式,然后是最后一個(gè)注冊(cè)的適配器 |
string | 服務(wù)器地址,可以是域名, 也可以是ip |
int | 端口號(hào) |
bool/table | 是否為ssl加密連接,默認(rèn)不加密,true為無證書最簡(jiǎn)單的加密,table為有證書的加密 server_cert 服務(wù)器ca證書數(shù)據(jù) client_cert 客戶端證書數(shù)據(jù) client_key 客戶端私鑰加密數(shù)據(jù) client_password 客戶端私鑰口令數(shù)據(jù) verify 是否強(qiáng)制校驗(yàn) 0不校驗(yàn)/1可選校驗(yàn)/2強(qiáng)制校驗(yàn) 默認(rèn)2 |
bool/table | bool 是否為ipv6,默認(rèn)不是 table mqtt擴(kuò)展參數(shù), ipv6 是否為ipv6, rxSize 接收緩沖區(qū)大小 |
返回值
返回值類型 | 解釋 |
---|---|
userdata | 若成功會(huì)返回mqtt客戶端實(shí)例,否則返回nil |
4. 連接服務(wù)器
接口: mqttc:connect()
參數(shù):
返回值
返回值類型 | 解釋 |
---|---|
boolean | 發(fā)起成功返回true, 否則返回false |
注意:本函數(shù)僅代表發(fā)起成功, 后續(xù)仍需根據(jù)ready函數(shù)判斷mqtt是否連接正常
5. 訂閱主題
接口
? mqttc:subscribe(topic, qos)
參數(shù)
傳入值類型 | 解釋 |
---|---|
string/table | 主題 |
int | topic為string時(shí)生效 0/1/2 默認(rèn)0 |
返回值
返回值類型 | 解釋 |
---|---|
int | 消息id,當(dāng)qos為1/2時(shí)有效, 若底層返回失敗,會(huì)返回nil |
6. 發(fā)布消息
接口:mqttc:publish(topic, data, qos, retain)
參數(shù)
傳入值類型 | 解釋 |
---|---|
string | 主題,必填 |
string | 消息,必填,但長度可以是0 |
int | 消息級(jí)別 0/1 默認(rèn)0 |
int | 是否存檔, 0/1,默認(rèn)0 |
返回值
返回值類型 | 解釋 |
---|---|
int | 消息id, 當(dāng)qos為1或2時(shí)會(huì)有效值. 若底層返回是否, 會(huì)返回nil |
7. 接收消息
8. 斷開服務(wù)器的連接
接口:? mqttc:disconnect()
參數(shù):無
返回值
返回值類型 | 解釋 |
---|---|
boolean | 發(fā)起成功返回true, 否則返回false |
示例
本文以demo_luaLuatOSdemomqtt這個(gè)demo為例作為演示,以MQTTX工具來測(cè)試MQTT運(yùn)行狀況
1.在MQTTX軟件上建立連接
2.在MQTTX軟件上添加訂閱
注意:訂閱主題格式要求默認(rèn)為 /luatos/pub/ 加模塊的IMEI號(hào),例如 /luatos/pub/868488076506128
3.設(shè)置MQTTX軟件上發(fā)布消息的主題
? 注意:格式要求默認(rèn)為 /luatos/sub/ 加模塊的IMEI號(hào),例如 /luatos/sub/868488076506128
4.燒錄腳本,上電開機(jī)后模塊會(huì)自動(dòng)向服務(wù)器發(fā)送消息,這是代碼默認(rèn)設(shè)置的,若不需要可以刪掉
5.模塊向服務(wù)器發(fā)送消息,通過Luatools軟件可以看到
MQTT單鏈接示例
在代碼開頭部分,可根據(jù)自己的服務(wù)器修改指定的參數(shù)
注意:user_name、password在有些服務(wù)器上是可以不傳入的,或者是對(duì)傳入的值沒有要求限制。要根據(jù)實(shí)際服務(wù)器要求來填寫
--根據(jù)自己的服務(wù)器修改以下參數(shù) local mqtt_host = "lbsmqtt.airm2m.com" local mqtt_port = 1884 local mqtt_isssl = false local client_id = "abc" local user_name = "user" local password = "password" local pub_topic = "/luatos/pub/" .. (mcu.unique_id():toHex()) -- 該變量在下方代碼有重新賦值,根據(jù)實(shí)際應(yīng)用場(chǎng)景,可自行修改腳本邏輯 local sub_topic = "/luatos/sub/" .. (mcu.unique_id():toHex()) -- 該變量在下方代碼有重新賦值,根據(jù)實(shí)際應(yīng)用場(chǎng)景,可自行修改腳本邏輯
此task實(shí)現(xiàn)的是mqtt的連接、訂閱消息、發(fā)布消息的流程。
要先等待網(wǎng)絡(luò)就緒之后才可進(jìn)行mqtt后續(xù)操作
待網(wǎng)絡(luò)就緒之后,根據(jù)代碼編寫情況此時(shí)client_id、pub_topic和sub_topic會(huì)發(fā)生變化,會(huì)覆蓋掉代碼開頭部分時(shí)的配置,這點(diǎn)需要注意。device_id為模塊的IMEI號(hào)
sys.taskInit(function() -- 等待聯(lián)網(wǎng) local ret, device_id = sys.waitUntil("net_ready") -- 下面的是mqtt的參數(shù)均可自行修改 -- client_id = device_id pub_topic = "/luatos/pub/" .. device_id sub_topic = "/luatos/sub/" .. device_id -- 打印一下上報(bào)(pub)和下發(fā)(sub)的topic名稱 -- 上報(bào): 設(shè)備 ---> 服務(wù)器 -- 下發(fā): 設(shè)備 --- 服務(wù)器 -- 可使用mqtt.x等客戶端進(jìn)行調(diào)試 log.info("mqtt", "pub", pub_topic) log.info("mqtt", "sub", sub_topic) -- 打印一下支持的加密套件, 通常來說, 固件已包含常見的99%的加密套件 -- if crypto.cipher_suites then -- log.info("cipher", "suites", json.encode(crypto.cipher_suites())) -- end if mqtt == nil then while 1 do sys.wait(1000) log.info("bsp", "本bsp未適配mqtt庫, 請(qǐng)查證") end end ------------------------------------- -------- MQTT 演示代碼 -------------- ------------------------------------- mqttc = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, ca_file) mqttc:auth(client_id,user_name,password) -- client_id必填,其余選填 -- mqttc:keepalive(240) -- 默認(rèn)值240s mqttc:autoreconn(true, 3000) -- 自動(dòng)重連機(jī)制 mqttc:on(function(mqtt_client, event, data, payload) -- 用戶自定義代碼 log.info("mqtt", "event", event, mqtt_client, data, payload) if event == "conack" then -- 聯(lián)上了 sys.publish("mqtt_conack") mqtt_client:subscribe(sub_topic)--單主題訂閱 -- mqtt_client:subscribe({[topic1]=1,[topic2]=1,[topic3]=1})--多主題訂閱 elseif event == "recv" then log.info("mqtt", "downlink", "topic", data, "payload", payload) sys.publish("mqtt_payload", data, payload) elseif event == "sent" then -- log.info("mqtt", "sent", "pkgid", data) -- elseif event == "disconnect" then -- 非自動(dòng)重連時(shí),按需重啟mqttc -- mqtt_client:connect() end end) -- mqttc自動(dòng)處理重連, 除非自行關(guān)閉 mqttc:connect() sys.waitUntil("mqtt_conack") while true do -- 演示等待其他task發(fā)送過來的上報(bào)信息 local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 300000) if ret then -- 提供關(guān)閉本while循環(huán)的途徑, 不需要可以注釋掉 if topic == "close" then break end mqttc:publish(topic, data, qos) end -- 如果沒有其他task上報(bào), 可以寫個(gè)空等待 --sys.wait(60000000) end mqttc:close() mqttc = nil end)
此task的功能為模塊每3秒向服務(wù)器發(fā)送一次數(shù)據(jù)
-- 這里演示在另一個(gè)task里上報(bào)數(shù)據(jù), 會(huì)定時(shí)上報(bào)數(shù)據(jù),不需要就注釋掉 sys.taskInit(function() sys.wait(3000) local data = "123," local qos = 1 -- QOS0不帶puback, QOS1是帶puback的 while true do sys.wait(3000) if mqttc and mqttc:ready() then local pkgid = mqttc:publish(pub_topic, data .. os.date(), qos) -- local pkgid = mqttc:publish(topic2, data, qos) -- local pkgid = mqttc:publish(topic3, data, qos) end end end)
此代碼可實(shí)現(xiàn)mqtt-uart透?jìng)鳎么诠ぞ呓o服務(wù)器發(fā)消息或者接收來著服務(wù)器的消息
注意要使用串口1,且波特率為9600
-- 以下是演示與uart結(jié)合, 簡(jiǎn)單的mqtt-uart透?jìng)鲗?shí)現(xiàn),不需要就注釋掉 local uart_id = 1 uart.setup(uart_id, 9600) uart.on(uart_id, "receive", function(id, len) local data = "" while 1 do local tmp = uart.read(uart_id) if not tmp or #tmp == 0 then break end data = data .. tmp end log.info("uart", "uart收到數(shù)據(jù)長度", #data) sys.publish("mqtt_pub", pub_topic, data) end) sys.subscribe("mqtt_payload", function(topic, payload) log.info("uart", "uart發(fā)送數(shù)據(jù)長度", #payload) uart.write(1, payload) end)
MQTT多鏈接示例
多鏈接的核心,就是要?jiǎng)?chuàng)建兩個(gè)mqtt客戶端的對(duì)象,通過不同的變量控制,代碼部分如下:
--------------------第一個(gè)mqtt客戶端-------------------- mqttc1 = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, ca_file) -- 創(chuàng)建的第一個(gè)mqtt對(duì)象 mqttc1:auth(client1_id,user_name,password) -- client_id必填,其余選填 -- mqttc1:keepalive(240) -- 默認(rèn)值240s mqttc1:autoreconn(true, 3000) -- 自動(dòng)重連機(jī)制 mqttc1:on(function(mqtt_client, event, data, payload) -- 用戶自定義代碼 log.info("mqtt", "event", event, mqtt_client, data, payload) if event == "conack" then -- 聯(lián)上了 sys.publish("mqtt_conack") mqtt_client:subscribe(sub_topic_client)--單主題訂閱 -- mqtt_client:subscribe({[topic1]=1,[topic2]=1,[topic3]=1})--多主題訂閱 elseif event == "recv" then -- 客戶端1 接收數(shù)據(jù) log.info("mqtt", "downlink", "topic", data, "payload", payload) sys.publish("mqtt_payload", data, payload) elseif event == "sent" then -- log.info("mqtt", "sent", "pkgid", data) -- elseif event == "disconnect" then -- 非自動(dòng)重連時(shí),按需重啟mqttc -- mqtt_client:connect() end~ end) --------------------第二個(gè)mqtt客戶端-------------------- mqttc2 = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, ca_file) -- 創(chuàng)建的第二個(gè)mqtt對(duì)象 mqttc2:auth(client2_id,user_name,password) -- client_id必填,其余選填 -- mqttc2:keepalive(240) -- 默認(rèn)值240s mqttc2:autoreconn(true, 3000) -- 自動(dòng)重連機(jī)制 mqttc2:on(function(mqtt_client, event, data, payload) -- 用戶自定義代碼 log.info("mqtt", "event", event, mqtt_client, data, payload) if event == "conack" then -- 聯(lián)上了 sys.publish("mqtt_conack") mqtt_client:subscribe(sub_topic_client) -- 主題訂閱 -> 訂閱主題可以額外自定義 -- mqtt_client:subscribe({[topic1]=1,[topic2]=1,[topic3]=1})--多主題訂閱 elseif event == "recv" then -- 客戶端2 接收數(shù)據(jù) log.info("mqtt", "downlink", "topic", data, "payload", payload) sys.publish("mqtt_payload", data, payload) elseif event == "sent" then -- log.info("mqtt", "sent", "pkgid", data) -- elseif event == "disconnect" then -- 非自動(dòng)重連時(shí),按需重啟mqttc -- mqtt_client:connect() end end) -- 客戶端1 發(fā)送數(shù)據(jù) mqttc1:publish(topic, data, qos) -- 發(fā)布topic主題可以自定義,可以不相同 -- 客戶端2 發(fā)送數(shù)據(jù) mqttc2:publish(topic, data, qos) -- 發(fā)布topic主題可以自定義,可以不相同
常見問題:
Q: 模組支持MQTT最新的版本是多少?
A: MQTT_V3.1.1版本
Q: 模組最多支持幾路鏈接?
A: mqtt/tcp/udp的鏈接公用8路通道
好啦,通過以上步驟,你就能夠?qū)崿F(xiàn)設(shè)備到MQTT服務(wù)器的連接與數(shù)據(jù)交互了。
評(píng)論區(qū)討論下你遇到的問題吧~
審核編輯 黃宇
-
服務(wù)器
+關(guān)注
關(guān)注
13文章
9717瀏覽量
87374 -
MQTT
+關(guān)注
關(guān)注
5文章
672瀏覽量
23514
發(fā)布評(píng)論請(qǐng)先 登錄
合宙Air780EP模塊——AT指令MQTT接入OneNET開發(fā)指南

合宙低功耗4G模組Air780EP——硬件設(shè)計(jì)01

FTP應(yīng)用看這篇!合宙Air780EP低功耗4G模組AT開發(fā)示例

合宙LuatOS新版發(fā)布

合宙 | Air780EP首版LuatOS固件發(fā)布,新品模組內(nèi)測(cè)搶先體驗(yàn)

合宙 Air780E/Air780EP/Air780EQ/Air201模塊遇到死機(jī)問題如何分析

合宙LuatOS開發(fā)板Core_Air780EP使用說明

RNDIS網(wǎng)卡應(yīng)用看這篇!合宙Air780EP低功耗4G模組AT開發(fā)示例

MQTT應(yīng)用:Air780EP低功耗4G模組AT開發(fā)

評(píng)論