?
今天我們學習Air780E快速入門之通過MQTT連接實現遠程控制,伙伴們,學起來!
一、修改代碼
1.1 準備工具
Air780E開發板
Air780E開發板設計資料
LuatOS-Air780E使用MQTT遠程控制程序源碼demo
API使用說明
mqtt測試工具
本demo中使用的測試工具是MQTTX,下載鏈接如下:MQTTX:全功能 MQTT 客戶端工具
下載后的安裝程序:
?
雙擊后點擊下一步安裝就可以了
?
1.2 程序詳解
1.2.1 概念 首先我們先來了解一些mqtt的基本原理。訂閱者訂閱了一個主題后,能夠接收到對這個主題發布的消息。基本原理如下圖:
?
本源碼程序demo實現流程圖如下:
?
關于sys.subscribe()和mqtt_client:subscribe()的區別:sys.subscribe()是luatOS內部的訂閱,接收sys.public()發布的消息,而mqtt_client:subscribe()訂閱的是mqtt服務器發布消息,接收來自mqtt_client:public()發布的消息。
1.2.2 程序分步詳解
第一步:等待聯網
第二步:獲取本設備的id,本demo中用來給MQTT服務器創建主題時當做Client ID號。因為MQTT服務器創建時的Client ID必須是唯一的,設備id也是唯一的,所以正好可以拿來使用。
-- 獲取設備的imei號
local device_id = mcu.unique_id():toHex()
-- 下面的是mqtt的參數均可自行修改
client_id = device_id
--發布消息的主題內容
pub_topic = "/luatos/pub/" .. device_id
--要訂閱的主題內容
sub_topic = "/luatos/sub/" .. device_id
第三步:創建一個mqtt實例,用來進行mqtt連接、訂閱、發布消息等操作。
--提前定義的參數,用來創建mqtt實例,根據自己的服務器修改以下參數
local mqtt_host = "lbsmqtt.airm2m.com"
local mqtt_port = 1884
local mqtt_isssl = false
local mqttc = nil
--[[
@param1 適配器序號,不填會選擇平臺自帶的
@param2 服務器地址,域名或ip都可
@param3 端口號
@param4 是否為ssl加密連接
@param5 是否為ipv6
]]
mqttc = mqtt.create(nil, mqtt_host, mqtt_port, mqtt_isssl, ca_file)
第四步:配置連接mqtt服務器的參數,有mqtt設置的Client ID,賬號,密碼等。
local client_id = "mqttx_b55c41b7"
local user_name = "user"
local password = "password"
--[[配置mqtt連接服務器的參數
@param1 設備id
@param2 賬號[可選]
@param3 密碼[可選]
@param4 清除session,默認true[可選]
]]
mqttc:auth(client_id,user_name,password) -- client_id必填,其余選填
第五步:設置mqtt掉線自動重連機制
--[[
@param1 是否自動重連
@param2 自動重連機制,單位ms
]]
mqttc:autoreconn(true, 3000) -- 自動重連機制
第六步:在mqtt的事件回調函數中編寫邏輯
--[[mqtt事件回調函數,其中事件包括
conack:連接成功事件。
recv:接收服務器下發數據的事件
sent:發送完成事件
disconnect:斷開連接事件
]]
--[[回調函數參數:
@param1 mqtt的句柄
@param2 事件
@param3 傳入的數據
]]
mqttc:on(function(mqtt_client, event, data, payload)
-- 用戶自定義代碼
log.info("mqtt", "event", event, mqtt_client, data, payload)
if event == "conack" then
-- 觸發mqtt連接服務器成功事件,
-- 在luat內部發布一條消息。
sys.publish("mqtt_conack")
--訂閱一個mqtt主題
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)
elseif event == "sent" then
--觸發發送數據事件
end
end)
第七步:連接mqtt服務器
mqttc:connect()
第八步:等待連接成功的luat內部的消息,此消息的發布在連接成功事件中
sys.waitUntil("mqtt_conack")
第九步:循環等待上報數據
while true do
-- 演示等待其他task發送過來的上報信息
local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 300000)
if ret then
-- 當接收到的tpoic是字符串close時,就跳出等待其他task發過來的上報消息的循環
if topic == "close" then break end
mqttc:publish(topic, data, qos)
end
end
第十步:關閉mqtt連接
mqttc:close()
第十一步:定時上報數據演示
sys.taskInit(function()
sys.wait(3000)
--定義要定時上報的數據
local data = "123test,"
--發送的數據質量
local qos = 0 -- QOS0不帶puback, QOS1是帶puback的
while true do
sys.wait(3000)
--如果mqttc實例存在,并且mqtt客戶端就緒
if mqttc and mqttc:ready() then
--發布一個mqtt消息,這個消息的訂閱,在mqtt服務器上,后面會介紹如何在mqtt服務器上訂閱
local pkgid = mqttc:publish(pub_topic, data .. os.date(), qos)
end
end
end)
二、燒錄代碼到硬件
2.1 正確連接電腦和4G模組電路板
使用帶有數據通信功能的數據線,不要使用僅有充電功能的數據線;
2.2 識別4G模組的boot引腳
在下載之前,要用模組的boot引腳觸發下載, 也就是說,要把4G模組的boot引腳拉到 1.8v,或者直接把boot引腳和VDD_EXT引腳相連。我們要在按下BOOT按鍵時讓模塊開機,就可以進入下載模式了。
具體到 Air780E開發板,
2.2.1 當我們模塊沒開機時,按著BOOT鍵然后長按PWR開機。
2.2.2 當我們模塊開機時,按著BOOT鍵然后點按重啟鍵即可。
?
2.3 識別電腦的正確端口
判斷是否進入BOOT模式:模塊上電,此時在電腦的設備管理器中,查看串口設備, 會出現一個端口表示進入了boot下載模式,如下圖所示:
?
當設備管理器出現了3個連續數字的com端口,并且每個數字都大于4,這時候, 硬件連接上就緒狀態,恭喜你,可以進行燒錄了!
2.4 新建項目
首先,確保你的 LuaTools 的版本,上大于 2.2.13 版本的。
在 LuaTools 的左上角上有版本顯示的,如圖所示:
?
LuaTools 版本沒問題的話, 就點擊 LuaTOols 右上角的“項目管理測試”按鈕,如下圖所示:
?
這時會彈出項目管理和燒錄管理的對話框,如下圖:
新建一個項目
注意:這里截圖使用的hello world項目的燒錄教程,燒錄的時候要將腳本換成本次demo的。
?
2.5 開始燒錄
選擇780E板子對應的底層core和剛改的main.lua腳本文件。下載到板子中。
?
?
點擊下載后,我們需要進入boot模式才能正常下載,在(3)(4)小節已經介紹了如何進入boot模式。
?
三、驗證功能
3.1 配置MQTTX服務器
3.1.1 打開MQTTX工具后,添加一個連接
?
?
3.1.2 添加一個訂閱,在MQTTX工具中填寫和程序中對應的連接參數:
?
訂閱成功后界面如下:
?
3.2 訂閱和發布消息
3.2.1 此時給開發板開機運行,即可看到我們之前寫的自動發送測試的數據。
?
3.2.2 MQTTX發布消息,主題是開發板訂閱的主題,開發板可以接收到MQTTX發布的消息。
?
?
四、常見問題
Q: 模組支持MQTT最新的版本是多少?
A: 支持MQTT_V3.1、MQTT_V3.1.1版本
Q: 模組最多支持幾路鏈接?
A: mqtt/tcp/udp的鏈接公用8路通道
Q: client id是否允許重復
A: client id不允許重復,要保證唯一性,如果在已經有一個該id的鏈接情況下,另外一個設備也用了相同的clientid接入,會把另一個在連鏈接擠掉。
Q: Qos0、1、2如何選擇
A: 應用允許的情況下,建議使用Qos0,Qos1和Qos2會加重網絡負擔。
Q: 為什么mqtt ssl訪問失敗
A: 檢查服務器是否支持模塊支持的加密套件,用模塊程序中的三元組和證書,在mqttx或者mqttfx客戶端工具上嘗試是否可以成功鏈接。
Q: 排查是否設備單體問題:如果同一地點,某些設備正常,某些設備異常,按照如下幾種情況分析
A:
分析正常設備和異常設備的使用環境是否相同:如果不同,例如異常設備固定在鋼制墻壁上,正常設備放置在桌子上,鋼制墻壁可能對天線射頻有干擾,將異常設備和正常設備放置在同樣的使用環境中,再對比測試。如果相同,參考第2步。分析正常和異常的設備,駐留的小區是否相同:如果相同,重點排查異常設備的天線射頻部分。如同不同,多測試幾次,確認下,是不是在異常小區內很容易出問題,如果異常小區很容易出問題,可能就是小區擁堵造成的。
五、修改代碼
在本demo中,我們實現了數據的上傳和下發,你可以將溫濕度數據上傳到MQTT服務器,也可以用下發的數據進行控制燈的開關。
以上就是合宙Air780E快速入門之通過MQTT連接實現遠程控制的所有內容,伙伴們,學會了嗎?
?審核編輯 黃宇
-
4G
+關注
關注
15文章
5507瀏覽量
118800 -
服務器
+關注
關注
12文章
9021瀏覽量
85183 -
遠程控制
+關注
關注
4文章
620瀏覽量
34903 -
低功耗
+關注
關注
10文章
2362瀏覽量
103594 -
MQTT
+關注
關注
5文章
649瀏覽量
22435
發布評論請先 登錄
相關推薦
評論