日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Air780EPM通過MQTT上傳溫濕度數(shù)據(jù)

合宙LuatOS ? 2026-05-13 12:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

重要提醒:

1、當(dāng)你安裝配置好 智能體 、規(guī)則和技能后,最終一定要參考驗(yàn)證智能體、規(guī)則和技能是否安裝成功來驗(yàn)證安裝配置是否正確;

2、Trae中內(nèi)置的免費(fèi)大 模型 ,會經(jīng)常排隊,并且性能不可控,容易出問題,所以推薦參考:001 發(fā)送會話請求時,提示排隊,如何解決?的方法,訂閱收費(fèi)的大模型(目前每月40元);這樣可以大大提高AI性能;如果不想使用收費(fèi)模型,在非正常工作時間段內(nèi),使用內(nèi)置的免費(fèi)模型也能勉強(qiáng)湊合;

3、選擇收費(fèi)大模型時,經(jīng)過我們的實(shí)際測試,根據(jù)工作任務(wù)的不同,可以按照如下建議選擇(僅供參考,具體情況還需要根據(jù)你自己的實(shí)際使用情況來定):

代碼開發(fā)任務(wù),優(yōu)先選擇GLM(可能是使用的人數(shù)太多,有時候處理較慢);如果GLM處理太慢,再考慮切換到MiniMax;

其他任務(wù),可以首先選擇ark-code-latest,其次選擇MiniMax,最后選擇GLM(可能是使用的人數(shù)太多,有時候處理較慢);

一、概述

在本文中,我們來演示如何使用 luatos-docs-code 協(xié)助開發(fā) MQTT上傳溫濕度數(shù)據(jù) 項目腳本代碼;

鑒于我們第一次

二、項目功能需求

幫我生成一個 LuatOS 項目代碼,功能需求如下:

硬件模組:Air780EPM

軟件功能需求:

支持 MQTT 長連接,MQTT 服務(wù)器的地址為"lbsmqtt.airm2m.com",端口為 1234

MQTT 連接出現(xiàn)異常后,支持重連

每隔一分鐘讀取 AirSHT30_1000 的溫濕度數(shù)據(jù),將讀取到的溫濕度數(shù)據(jù)上傳到 MQTT 服務(wù)器

軟件代碼設(shè)計要求:

項目腳本要包含 main.lua 和一個或者多個其他具體功能應(yīng)用的 lua 文件,main.lua 文件、其他 lua 文件功能都要模塊化解耦設(shè)計

main.lua 中,要有最基本的項目名,版本號,fota 升級使用說明,errDump 使用說明,require 其他功能應(yīng)用的 lua 文件,sys.run()代碼

代碼存儲路徑:新建一個 mqtt_temprature_humdity 文件夾 ,將項目的腳本文件和資源文件都保存到這個文件夾

三、使用 luatos-docs-code 開發(fā)以及調(diào)試過程

3.1 輸入項目需求,luatos-docs-code 第一次生成代碼

wKgZO2oD9jGAETVcAAZFYHRyMss574.png

添加圖片注釋,不超過 140 字(可選)

3.2 生成的代碼存在的問題

剛才生成的代碼存在以下問題:

3.2.1 main.lua 編程規(guī)范需要改進(jìn)

要遵循 Air780EPM demo 代碼的以下編程規(guī)范

main.lua 中,要有最基本的項目名,版本號,fota 升級使用說明,errDump 使用說明,require 其他功能應(yīng)用的 lua 文件,sys.run()代碼,不需要 require “sys”,請你找一個 demo 目錄下的 main.lua 文件學(xué)習(xí)一下,然后完全遵守 demo 中 main.lua 的格式和規(guī)范,注釋也要詳細(xì)

3.2.2 獲取 4G 模組信號強(qiáng)度的函數(shù)好像不對

請你再修復(fù)一下

3.3 告知 luatos-docs-code 存在的問題,讓它重新生成代碼

3.3.1 修復(fù) main.lua

將第一個問題告知 luatos-docs-code 后,讓它重新生成,交互過程如下

wKgZPGoD9jiAZRikAAY94gh9QGM044.png

添加圖片注釋,不超過 140 字(可選)

這次生成的 main.lua 代碼質(zhì)量就很高了,給他提的這個問題已經(jīng)解決!

3.3.2 修復(fù)獲取 4G 模組信號強(qiáng)度的函數(shù)使用

wKgZO2oD9j2AEMZFAAJBVptnZ1M375.png

添加圖片注釋,不超過 140 字(可選)

3.4 最終生成的項目腳本代碼

3.4.1 項目代碼目錄結(jié)構(gòu)

mqtt\_temprature\_humdity/ ├── main.lua # 項目主入口文件 ├── config.lua # 配置文件 ├── app\_mqtt\_main.lua # MQTT 客戶端主應(yīng)用模塊 ├── app\_mqtt\_sender.lua # MQTT 數(shù)據(jù)發(fā)送模塊 ├── app\_mqtt\_receiver.lua # MQTT 數(shù)據(jù)接收模塊 ├── app\_sht30.lua # 溫濕度傳感器應(yīng)用模塊 └── AirSHT30\_1000.lua # 溫濕度傳感器驅(qū)動文件

3.4.2 main.lua

--[[ @module main @summary LuatOS用戶應(yīng)用腳本文件入口,總體調(diào)度應(yīng)用邏輯 @version 1.0 @date 2026.03.15 @author LuatOS @usage 本demo演示的核心功能為: 1. 支持MQTT長連接,MQTT服務(wù)器地址為"lbsmqtt.airm2m.com",端口為1234 2. MQTT連接出現(xiàn)異常后,支持自動重連 3. 每隔一分鐘讀取AirSHT30_1000的溫濕度數(shù)據(jù) 4. 將讀取到的溫濕度數(shù)據(jù)以及4G模組的信號強(qiáng)度上傳到MQTT服務(wù)器 更多說明參考本目錄下的readme.md文件 ]] --[[ 必須定義PROJECT和VERSION變量,Luatools工具會用到這兩個變量,遠(yuǎn)程升級功能也會用到這兩個變量 PROJECT:項目名,ascii string類型 可以隨便定義,只要不使用,就行 VERSION:項目版本號,ascii string類型 如果使用合宙iot.openluat.com進(jìn)行遠(yuǎn)程升級,必須按照"XXX.YYY.ZZZ"三段格式定義: X、Y、Z各表示1位數(shù)字,三個X表示的數(shù)字可以相同,也可以不同,同理三個Y和三個Z表示的數(shù)字也是可以相同,可以不同 因?yàn)闅v史原因,YYY這三位數(shù)字必須存在,但是沒有任何用處,可以一直寫為999 如果不使用合宙iot.openluat.com進(jìn)行遠(yuǎn)程升級,根據(jù)自己項目的需求,自定義格式即可 ]] PROJECT = "MQTT_TEMP_HUMIDITY" VERSION = "001.999.000" log.info("main", "project name is ", PROJECT, "version is ", VERSION) -- 如果內(nèi)核固件支持errDump功能,此處進(jìn)行配置,【強(qiáng)烈建議打開此處的注釋】 -- 因?yàn)榇斯δ苣K可以記錄并且上傳腳本在運(yùn)行過程中出現(xiàn)的語法錯誤或者其他自定義的錯誤信息,可以初步分析一些設(shè)備運(yùn)行異常的問題 -- 以下代碼是最基本的用法,更復(fù)雜的用法可以詳細(xì)閱讀API說明文檔 -- 啟動errDump日志存儲并且上傳功能,600秒上傳一次 -- if errDump then -- errDump.config(true, 600) -- end -- 使用LuatOS開發(fā)的任何一個項目,都強(qiáng)烈建議使用遠(yuǎn)程升級FOTA功能 -- 可以使用合宙的iot.openluat.com平臺進(jìn)行遠(yuǎn)程升級 -- 也可以使用客戶自己搭建的平臺進(jìn)行遠(yuǎn)程升級 -- 遠(yuǎn)程升級的詳細(xì)用法,可以參考fota的demo進(jìn)行使用 -- 啟動一個循環(huán)定時器 -- 每隔3秒鐘打印一次總內(nèi)存,實(shí)時的已使用內(nèi)存,歷史最高的已使用內(nèi)存情況 -- 方便分析內(nèi)存使用是否有異常 -- sys.timerLoopStart(function() -- log.info("mem.lua", rtos.meminfo()) -- log.info("mem.sys", rtos.meminfo("sys")) -- end, 3000) -- 加載配置文件 require "config" -- 加載MQTT客戶端主應(yīng)用模塊 require "app_mqtt_main" -- 加載MQTT客戶端數(shù)據(jù)發(fā)送模塊 require "app_mqtt_sender" -- 加載MQTT客戶端數(shù)據(jù)接收模塊 require "app_mqtt_receiver" -- 加載溫濕度傳感器應(yīng)用模塊 require "app_sht30" -- 用戶代碼已結(jié)束--------------------------------------------- -- 結(jié)尾總是這一句 sys.run() -- sys.run()之后后面不要加任何語句!!!!!

3.4.3 config.lua

--[[ @module config @summary 配置文件 @version 1.0 @date 2026.03.15 @author LuatOS @usage 本文件包含項目的配置信息 ]] local config = {} -- MQTT服務(wù)器配置 config.mqtt = { server_addr = "lbsmqtt.airm2m.com", -- MQTT服務(wù)器地址 server_port = 1234, -- MQTT服務(wù)器端口 client_id = "", -- 客戶端ID,將在運(yùn)行時設(shè)置為IMEI username = "", -- MQTT用戶名 password = "", -- MQTT密碼 keepalive = 120, -- 心跳間隔(秒) qos = 0 -- QoS等級 } -- 溫濕度傳感器配置 config.sht30 = { i2c_id = 0, -- I2C總線ID slave_addr = 0x44 -- 傳感器從機(jī)地址 } -- 數(shù)據(jù)上傳配置 config.data = { upload_interval = 60 * 1000, -- 上傳間隔(毫秒) topic = "/up" -- MQTT上傳主題后綴 } return config

3.4.4 AirSHT30_1000.lua

--[[ @module AirSHT30_1000 @summary AirSHT30_1000應(yīng)用功能模塊 @version 1.0 @date 2026.03.15 @author LuatOS @usage 本文件為AirSHT30_1000驅(qū)動配置文件,核心業(yè)務(wù)邏輯為: 1、打開AirSHT30_1000; 2、讀取溫濕度數(shù)據(jù); 本文件沒有對外接口,直接require "AirSHT30_1000"就可以加載運(yùn)行; ]] -- 本文件中的主機(jī)是指I2C主機(jī),具體指Air780EXX系列每個模組 -- 本文件中的從機(jī)是指I2C從機(jī),具體指AirSHT30_1000配件板上的sht30溫濕度傳感器芯片 local AirSHT30_1000 ={ -- i2c_id:主機(jī)的i2c id; } -- 從機(jī)地址為0x44 local slave_addr = 0x44 -- 計算數(shù)據(jù)表data中所有數(shù)據(jù)元素的crc8校驗(yàn)值 local function crc8(data) local crc = 0xFF for i = 1, #data do crc = bit.bxor(crc, data[i]) for j = 1, 8 do crc = crc * 2 if crc >= 0x100 then crc = bit.band(bit.bxor(crc, 0x31), 0xff) end end end return crc end -- 打開AirSHT30_1000; --i2c_id:number類型; -- 主機(jī)使用的I2C ID,用來控制AirSHT30_1000; -- 取值范圍:僅支持0和1; -- 如果沒有傳入此參數(shù),則默認(rèn)為0; --返回值:成功返回true,失敗返回false function AirSHT30_1000.open(i2c_id) --如果i2c_id為nil,則賦值為默認(rèn)值0 if i2c_id==nil then i2c_id=0 end --檢查參數(shù)的合法性 if not (i2c_id == 0 or i2c_id == 1) then log.error("AirSHT30_1000.open", "invalid i2c_id", i2c_id) return false end AirSHT30_1000.i2c_id = i2c_id --初始化I2C if i2c.setup(i2c_id, i2c.FAST) ~= 1 then log.error("AirSHT30_1000.open", "i2c.setup error", i2c_id) return false end return true end -- 讀取溫濕度數(shù)據(jù); -- 返回值:失敗返回false; -- 成功返回兩個值,第一個為攝氏溫度值(number類型,例如23.6表示23.6攝氏度),第二個為百分比濕度值(number類型,例如67表示67%的濕度) function AirSHT30_1000.read() -- 發(fā)送啟動測量命令(高精度) i2c.send(AirSHT30_1000.i2c_id, slave_addr, {0x24, 0x00}) -- 等待測量完成(SHT30高精度測量需~15ms) sys.wait(20) -- 讀取6字節(jié)數(shù)據(jù)(溫度高/低 + CRC,濕度高/低 + CRC) local data = i2c.recv(AirSHT30_1000.i2c_id, slave_addr, 6) -- 如果沒有讀取到6字節(jié)數(shù)據(jù) if type(data)~="string" or data:len()~=6 then log.error("AirSHT30_1000.read", "i2c.recv error") return false end -- log.info("AirSHT30_1000.read", data:toHex()) --如果校驗(yàn)值正確 if crc8({data:byte(1), data:byte(2)}) == data:byte(3) and crc8({data:byte(4), data:byte(5)}) == data:byte(6) then -- 提取原始溫度值 local temp_raw = (data:byte(1) << 8) | data:byte(2) -- 提取原始濕度值 local hum_raw = (data:byte(4) << 8) | data:byte(5) -- 轉(zhuǎn)換為實(shí)際值(根據(jù)SHT30數(shù)據(jù)手冊公式) local temprature = (-45 + 175 * temp_raw / 65535.0) local humidity = (100 * hum_raw / 65535.0) -- 打印輸出結(jié)果(保留2位小數(shù)) -- log.info("AirSHT30_1000.read", "temprature", string.format("%.2f ℃", temprature)) -- log.info("AirSHT30_1000.read", "temprature", string.format("%.2f %%RH", humidity)) return temprature, humidity else log.error("AirSHT30_1000.read", "crc error", i2c_id) return false end end -- 關(guān)閉AirSHT30_1000; -- 返回值:成功返回true,失敗返回false function AirSHT30_1000.close() --close接口沒有返回值,理論上不會關(guān)閉失敗 i2c.close(AirSHT30_1000.i2c_id) return true end return AirSHT30_1000

3.4.5 app_sht30.lua

--[[ @module app_sht30 @summary 溫濕度傳感器應(yīng)用模塊 @version 1.0 @date 2026.03.15 @author LuatOS @usage 本文件為溫濕度傳感器應(yīng)用模塊,核心業(yè)務(wù)邏輯為: 1、初始化AirSHT30_1000傳感器; 2、每分鐘讀取一次溫濕度數(shù)據(jù); 3、讀取4G模組的信號強(qiáng)度; 4、將數(shù)據(jù)打包成JSON格式并上傳到MQTT服務(wù)器; 本文件沒有對外接口,直接在main.lua中require "app_sht30"就可以加載運(yùn)行; ]] -- 加載配置文件 local config = require "config" -- 加載AirSHT30_1000驅(qū)動 local AirSHT30_1000 = require "AirSHT30_1000" -- 主題前綴:IMEI號 local TOPIC_PREFIX = mobile.imei() -- 數(shù)據(jù)發(fā)送結(jié)果回調(diào)函數(shù) local function send_data_cbfunc(result) log.info("app_sht30", "send data result", result) end -- 讀取并上傳溫濕度數(shù)據(jù)的任務(wù)函數(shù) local function sht30_task() -- 打開AirSHT30_1000傳感器 local open_result = AirSHT30_1000.open(config.sht30.i2c_id) if not open_result then log.error("app_sht30", "AirSHT30_1000 open failed") return end -- 啟動MQTT長連接 sys.publish("MQTT_CLIENT_RUN_REQ", true) while true do -- 讀取溫濕度數(shù)據(jù) local temperature, humidity = AirSHT30_1000.read() if temperature and humidity then -- 讀取4G信號強(qiáng)度 local csq = mobile.csq() -- 構(gòu)建JSON數(shù)據(jù) local data = { temperature = temperature, humidity = humidity, signal = csq, timestamp = os.time() } local json_data = json.encode(data) log.info("app_sht30", "read data", json_data) -- 發(fā)送數(shù)據(jù)到MQTT服務(wù)器 sys.publish("SEND_DATA_REQ", "sht30", TOPIC_PREFIX .. config.data.topic, json_data, config.mqtt.qos, {func = send_data_cbfunc}) else log.error("app_sht30", "read data failed") end -- 等待指定的上傳間隔 sys.wait(config.data.upload_interval) end end -- 啟動溫濕度傳感器任務(wù) sys.taskInit(sht30_task)

3.4.6 app_mqtt_main.lua

--[[ @module app_mqtt_main @summary MQTT客戶端主應(yīng)用模塊 @version 1.0 @date 2026.03.15 @author LuatOS @usage 本文件為MQTT客戶端主應(yīng)用模塊,核心業(yè)務(wù)邏輯為: 1、創(chuàng)建MQTT客戶端,連接服務(wù)器; 2、處理連接/訂閱/取消訂閱/異常邏輯,出現(xiàn)異常后執(zhí)行重連動作; 3、調(diào)用mqtt_receiver的外部接口mqtt_receiver.proc,對接收到的publish數(shù)據(jù)進(jìn)行處理; 4、調(diào)用sys.sendMsg接口,發(fā)送"CONNECT OK"、"PUBLISH OK"和"DISCONNECTED"三種類型的"MQTT_EVENT"消息到mqtt_sender的task,控制publish數(shù)據(jù)發(fā)送邏輯; 5、收到MQTT心跳應(yīng)答后,執(zhí)行sys.publish("FEED_NETWORK_WATCHDOG") 對網(wǎng)絡(luò)環(huán)境檢測看門狗功能模塊進(jìn)行喂狗; 本文件沒有對外接口,直接在main.lua中require "app_mqtt_main"就可以加載運(yùn)行; ]] -- 加載配置文件 local config = require "config" -- 加載mqtt client數(shù)據(jù)接收功能模塊 local mqtt_receiver = require "app_mqtt_receiver" -- 加載mqtt client數(shù)據(jù)發(fā)送功能模塊 local mqtt_sender = require "app_mqtt_sender" -- mqtt服務(wù)器地址和端口 local SERVER_ADDR = config.mqtt.server_addr local SERVER_PORT = config.mqtt.server_port -- mqtt_main的任務(wù)名 local TASK_NAME = mqtt_sender.TASK_NAME_PREFIX.."main" -- mqtt主題的前綴:IMEI號 local TOPIC_PREFIX = mobile.imei() -- mqtt client的事件回調(diào)函數(shù) local function mqtt_client_event_cbfunc(mqtt_client, event, data, payload, metas) log.info("mqtt_client_event_cbfunc", mqtt_client, event, data, payload, json.encode(metas)) -- mqtt連接成功 if event == "conack" then sys.sendMsg(TASK_NAME, "MQTT_EVENT", "CONNECT", true) -- 訂閱單主題 -- 第二個參數(shù)表示qos,取值范圍為0,1,2,如果不設(shè)置,默認(rèn)為0 -- if not mqtt_client:subscribe(TOPIC_PREFIX .. "/down") then -- sys.sendMsg(TASK_NAME, "MQTT_EVENT", "SUBSCRIBE", false, -1) -- end -- 訂閱多主題,如果有需要,打開注釋 -- 表中的每一個訂閱主題的格式為[topic]=qos -- if not mqtt_client:subscribe( -- { -- [(TOPIC_PREFIX .. "/data"]=0, -- [(TOPIC_PREFIX .. "/cmd"]=1 -- } -- ) then -- sys.sendMsg(TASK_NAME, "MQTT_EVENT", "SUBSCRIBE", false, -1) -- end -- 訂閱結(jié)果 -- data:訂閱應(yīng)答結(jié)果,true為成功,false為失敗 -- payload:number類型;成功時表示qos,取值范圍為0,1,2;失敗時表示失敗碼,一般是0x80 elseif event == "suback" then -- 發(fā)送消息通知 mqtt main task sys.sendMsg(TASK_NAME, "MQTT_EVENT", "SUBSCRIBE", data, payload) -- 取消訂閱成功 elseif event == "unsuback" then -- 發(fā)送消息通知 mqtt main task sys.sendMsg(TASK_NAME, "MQTT_EVENT", "UNSUBSCRIBE", true) -- 接收到服務(wù)器下發(fā)的publish數(shù)據(jù) -- data:string類型,表示topic -- payload:string類型,表示payload -- metas:table類型,數(shù)據(jù)內(nèi)容如下 -- { -- qos: number類型,取值范圍0,1,2 -- retain:number類型,取值范圍0,1 -- dup:number類型,取值范圍0,1 -- message_id: number類型 -- } elseif event == "recv" then -- 對接收到的publish數(shù)據(jù)處理 mqtt_receiver.proc(data, payload, metas) -- 發(fā)送成功publish數(shù)據(jù) -- data:number類型,表示message id elseif event == "sent" then -- 發(fā)送消息通知 mqtt sender task sys.sendMsg(mqtt_sender.TASK_NAME, "MQTT_EVENT", "PUBLISH_OK", data) -- 服務(wù)器斷開mqtt連接 elseif event == "disconnect" then -- 發(fā)送消息通知 mqtt main task sys.sendMsg(TASK_NAME, "MQTT_EVENT", "DISCONNECTED", false) -- 收到服務(wù)器的心跳應(yīng)答 elseif event == "pong" then -- 接收到數(shù)據(jù),通知網(wǎng)絡(luò)環(huán)境檢測看門狗功能模塊進(jìn)行喂狗 sys.publish("FEED_NETWORK_WATCHDOG") -- 嚴(yán)重異常,本地會主動斷開連接 -- data:string類型,表示具體的異常,有以下幾種: -- "connect":tcp連接失敗 -- "tx":數(shù)據(jù)發(fā)送失敗 -- "conack":mqtt connect后,服務(wù)器應(yīng)答CONNACK鑒權(quán)失敗,失敗碼為payload(number類型) -- "other":其他異常 elseif event == "error" then if data == "connect" or data == "conack" then -- 發(fā)送消息通知 mqtt main task,連接失敗 sys.sendMsg(TASK_NAME, "MQTT_EVENT", "CONNECT", false) elseif data == "other" or data == "tx" then -- 發(fā)送消息通知 mqtt main task,出現(xiàn)異常 sys.sendMsg(TASK_NAME, "MQTT_EVENT", "ERROR") end end end -- mqtt main task 的任務(wù)處理函數(shù) -- auto_reconnect:短連接還是長連接;長連接為true,表示斷開連接后會自動重連;短連接為false,表示斷開連接后,不會自動重連 local function mqtt_client_main_task_func(auto_reconnect) local mqtt_client local result, msg while true do -- 如果當(dāng)前時間點(diǎn)設(shè)置的默認(rèn)網(wǎng)卡還沒有連接成功,一直在這里循環(huán)等待 while not socket.adapter(socket.dft()) do log.warn("mqtt_client_main_task_func", "wait IP_READY", socket.dft()) -- 在此處阻塞等待默認(rèn)網(wǎng)卡連接成功的消息"IP_READY" -- 或者等待1秒超時退出阻塞等待狀態(tài); -- 注意:此處的1000毫秒超時不要修改的更長; -- 因?yàn)楫?dāng)使用exnetif.set_priority_order配置多個網(wǎng)卡連接外網(wǎng)的優(yōu)先級時,會隱式的修改默認(rèn)使用的網(wǎng)卡 -- 當(dāng)exnetif.set_priority_order的調(diào)用時序和此處的socket.adapter(socket.dft())判斷時序有可能不匹配 -- 此處的1秒,能夠保證,即使時序不匹配,也能1秒鐘退出阻塞狀態(tài),再去判斷socket.adapter(socket.dft()) sys.waitUntil("IP_READY", 1000) end -- 檢測到了IP_READY消息 log.info("mqtt_client_main_task_func", "recv IP_READY", socket.dft()) -- 清空此task綁定的消息隊列中的未處理的消息 sys.cleanMsg(TASK_NAME) -- 創(chuàng)建mqtt client對象 mqtt_client = mqtt.create(nil, SERVER_ADDR, SERVER_PORT) -- 如果創(chuàng)建mqtt client對象失敗 if not mqtt_client then log.error("mqtt_client_main_task_func", "mqtt.create error") goto EXCEPTION_PROC end -- 配置mqtt client對象的client id,username,password和clean session標(biāo)志 result = mqtt_client:auth(TASK_NAME..mobile.imei(), config.mqtt.username, config.mqtt.password, true) -- 如果配置失敗 if not result then log.error("mqtt_client_main_task_func", "mqtt_client:auth error") goto EXCEPTION_PROC end -- 注冊mqtt client對象的事件回調(diào)函數(shù) mqtt_client:on(mqtt_client_event_cbfunc) -- 設(shè)置mqtt keepalive時間 mqtt_client:keepalive(config.mqtt.keepalive) -- 設(shè)置遺囑消息,有需要的話,可以打開注釋 -- mqtt_client:will(TOPIC_PREFIX .. "/status", "offline") -- 連接server result = mqtt_client:connect() -- 如果連接server失敗 if not result then log.error("mqtt_client_main_task_func", "mqtt_client:connect error") goto EXCEPTION_PROC end -- 連接、斷開連接、訂閱、取消訂閱、異常等各種事件的處理調(diào)度邏輯 while true do -- 等待"MQTT_EVENT"消息 msg = sys.waitMsg(TASK_NAME, "MQTT_EVENT") log.info("mqtt_client_main_task_func waitMsg", msg[2], msg[3], msg[4]) -- connect連接結(jié)果 -- msg[3]表示連接結(jié)果,true為連接成功,false為連接失敗 if msg[2] == "CONNECT" then -- mqtt連接成功 if msg[3] then log.info("mqtt_client_main_task_func", "connect success") -- 通知mqtt sender數(shù)據(jù)發(fā)送應(yīng)用模塊的task,MQTT連接成功 sys.sendMsg(mqtt_sender.TASK_NAME, "MQTT_EVENT", "CONNECT_OK", mqtt_client) -- mqtt連接失敗 else log.info("mqtt_client_main_task_func", "connect error") -- 退出循環(huán),發(fā)起重連 break end -- subscribe訂閱結(jié)果 -- msg[3]表示訂閱結(jié)果,true為訂閱成功,false為訂閱失敗 elseif msg[2] == "SUBSCRIBE" then -- 訂閱成功 if msg[3] then log.info("mqtt_client_main_task_func", "subscribe success", "qos: "..(msg[4] or "nil")) -- 訂閱失敗 else log.error("mqtt_client_main_task_func", "subscribe error", "code", msg[4]) -- 主動斷開mqtt client連接 mqtt_client:disconnect() -- 發(fā)送disconnect之后,此處延時1秒,給數(shù)據(jù)發(fā)送預(yù)留一點(diǎn)兒時間,發(fā)送到服務(wù)器; -- 即使1秒的時間不足以發(fā)送給服務(wù)器也沒關(guān)系;對服務(wù)器來說,mqtt客戶端只是沒有優(yōu)雅的斷開,不影響什么實(shí)質(zhì)功能; sys.wait(1000) break end -- unsubscribe取消訂閱成功 elseif msg[2] == "UNSUBSCRIBE" then log.info("mqtt_client_main_task_func", "unsubscribe success") -- 需要主動關(guān)閉mqtt連接 -- 用戶需要主動關(guān)閉mqtt連接時,可以調(diào)用sys.sendMsg(TASK_NAME, "MQTT_EVENT", "CLOSE") elseif msg[2] == "CLOSE" then -- 主動斷開mqtt client連接 mqtt_client:disconnect() -- 發(fā)送disconnect之后,此處延時1秒,給數(shù)據(jù)發(fā)送預(yù)留一點(diǎn)兒時間,發(fā)送到服務(wù)器; -- 即使1秒的時間不足以發(fā)送給服務(wù)器也沒關(guān)系;對服務(wù)器來說,mqtt客戶端只是沒有優(yōu)雅的斷開,不影響什么實(shí)質(zhì)功能; -- sys.wait(1000) break -- 被動關(guān)閉了mqtt連接 -- 被網(wǎng)絡(luò)或者服務(wù)器斷開了連接 elseif msg[2] == "DISCONNECTED" then break -- 出現(xiàn)了其他異常 elseif msg[2] == "ERROR" then break end end -- 出現(xiàn)異常 ::EXCEPTION_PROC:: -- 清空此task綁定的消息隊列中的未處理的消息 sys.cleanMsg(TASK_NAME) -- 通知mqtt sender數(shù)據(jù)發(fā)送應(yīng)用模塊的task,MQTT連接已經(jīng)斷開 sys.sendMsg(mqtt_sender.TASK_NAME, "MQTT_EVENT", "DISCONNECTED") -- 如果存在mqtt client對象 if mqtt_client then -- 關(guān)閉mqtt client,并且釋放mqtt client對象 mqtt_client:close() mqtt_client = nil end -- 根據(jù)是否需要自動重連標(biāo)志,決定后續(xù)執(zhí)行的動作 if auto_reconnect then -- 5秒后跳轉(zhuǎn)到循環(huán)體開始位置,自動發(fā)起重連 sys.wait(5000) else sys.publish("MQTT_CLIENT_CLOSE_RSP") log.warn("mqtt_client_main_task_func", "exit") break end end -- 清除此task對應(yīng)的管理表資源 sys.taskDel(TASK_NAME) end local function mqtt_client_run_req(connection_type) --創(chuàng)建并且啟動一個task --運(yùn)行這個task的處理函數(shù)mqtt_client_main_task_func sys.taskInitEx(mqtt_client_main_task_func, TASK_NAME, nil, connection_type) end local function mqtt_client_close_req() sys.sendMsg(TASK_NAME, "MQTT_EVENT", "CLOSE") end sys.subscribe("MQTT_CLIENT_RUN_REQ", mqtt_client_run_req) sys.subscribe("MQTT_CLIENT_CLOSE_REQ", mqtt_client_close_req)

3.4.7 app_mqtt_sender.lua

--[[ @module app_mqtt_sender @summary MQTT客戶端數(shù)據(jù)發(fā)送應(yīng)用模塊 @version 1.0 @date 2026.03.15 @author LuatOS @usage 本文件為MQTT客戶端數(shù)據(jù)發(fā)送應(yīng)用模塊,核心業(yè)務(wù)邏輯為: 1、sys.subscribe("SEND_DATA_REQ", send_data_req_proc_func)訂閱"SEND_DATA_REQ"消息,將其他應(yīng)用模塊需要發(fā)送的數(shù)據(jù)存儲到隊列send_queue中; 2、mqtt sender task接收"CONNECT OK"、"PUBLISH_REQ"、"PUBLISH OK"三種類型的"MQTT_EVENT"消息,遍歷隊列send_queue,逐條發(fā)送數(shù)據(jù)到server; 3、mqtt sender task接收"DISCONNECTED"類型的"MQTT_EVENT"消息,丟棄掉隊列send_queue中未發(fā)送的數(shù)據(jù); 4、任何一條數(shù)據(jù)無論發(fā)送成功還是失敗,只要這條數(shù)據(jù)有回調(diào)函數(shù),都會通過回調(diào)函數(shù)通知數(shù)據(jù)發(fā)送方; 本文件的對外接口有1個: 1、sys.subscribe("SEND_DATA_REQ", send_data_req_proc_func):訂閱"SEND_DATA_REQ"消息; 其他應(yīng)用模塊如果需要發(fā)送數(shù)據(jù),直接sys.publish這個消息即可,將需要發(fā)送的topic,payload和qos以及回調(diào)函數(shù)和回調(diào)參數(shù)一起publish出去; ]] local mqtt_sender = {} --[[ 數(shù)據(jù)發(fā)送隊列,數(shù)據(jù)結(jié)構(gòu)為: { [1] = {topic="topic1", payload="payload1", qos=0, cb={func=callback_function1, para=callback_para1}}, [2] = {topic="topic2", payload="payload2", qos=1, cb={func=callback_function2, para=callback_para2}}, [3] = {topic="topic3", payload="payload3", qos=2, cb={func=callback_function3, para=callback_para3}}, } topic的內(nèi)容為publish的主題,string類型,必須存在; payload的內(nèi)容為publish的負(fù)載數(shù)據(jù),string類型,必須存在; qos的內(nèi)容為publish的質(zhì)量等級,number類型,取值范圍0,1,2,可選,如果用戶沒有指定,默認(rèn)為0; cb.func的內(nèi)容為數(shù)據(jù)發(fā)送結(jié)果的用戶回調(diào)函數(shù),可以不存在; cb.para的內(nèi)容為數(shù)據(jù)發(fā)送結(jié)果的用戶回調(diào)函數(shù)的回調(diào)參數(shù),可以不存在; ]] local send_queue = {} -- mqtt client的任務(wù)名前綴 mqtt_sender.TASK_NAME_PREFIX = "mqtt_" -- mqtt_client_sender的任務(wù)名 mqtt_sender.TASK_NAME = mqtt_sender.TASK_NAME_PREFIX.."sender" -- "SEND_DATA_REQ"消息的處理函數(shù) local function send_data_req_proc_func(tag, topic, payload, qos, cb) -- 將原始數(shù)據(jù)增加前綴,然后插入到發(fā)送隊列send_queue中 table.insert(send_queue, {topic=topic, payload=payload, qos=qos or 0, cb=cb}) -- 發(fā)送消息通知 mqtt sender task,有新數(shù)據(jù)等待發(fā)送 sys.sendMsg(mqtt_sender.TASK_NAME, "MQTT_EVENT", "PUBLISH_REQ") end -- 按照順序發(fā)送send_queue中的數(shù)據(jù) -- 如果調(diào)用publish接口成功,則返回當(dāng)前正在發(fā)送的數(shù)據(jù)項 -- 如果調(diào)用publish接口失敗,通知回調(diào)函數(shù)發(fā)送失敗后,繼續(xù)發(fā)送下一條數(shù)據(jù) local function publish_item(mqtt_client) local item -- 如果發(fā)送隊列中有數(shù)據(jù)等待發(fā)送 while #send_queue>0 do -- 取出來第一條數(shù)據(jù)賦值給item -- 同時從隊列send_queue中刪除這一條數(shù)據(jù) item = table.remove(send_queue, 1) -- publish數(shù)據(jù) -- result表示調(diào)用publish接口的同步結(jié)果,返回值有以下幾種: -- 如果失敗,返回nil -- 如果成功,number類型,qos為0時直接返回0;qos為1或者2時返回publish報文的message id result = mqtt_client:publish(item.topic, item.payload, item.qos) -- publish接口調(diào)用成功 if result then return item -- publish接口調(diào)用失敗 else -- 如果當(dāng)前發(fā)送的數(shù)據(jù)有用戶回調(diào)函數(shù),則執(zhí)行用戶回調(diào)函數(shù) if item.cb and item.cb.func then item.cb.func(false, item.cb.para) end end end end local function publish_item_cbfunc(item, result) if item then -- 如果當(dāng)前發(fā)送的數(shù)據(jù)有用戶回調(diào)函數(shù),則執(zhí)行用戶回調(diào)函數(shù) if item.cb and item.cb.func then item.cb.func(result, item.cb.para) end end end -- mqtt client sender的任務(wù)處理函數(shù) local function mqtt_client_sender_task_func() local mqtt_client local send_item local result, msg while true do -- 等待"MQTT_EVENT"消息 msg = sys.waitMsg(mqtt_sender.TASK_NAME, "MQTT_EVENT") -- mqtt連接成功 -- msg[3]表示mqtt client對象 if msg[2] == "CONNECT_OK" then mqtt_client = msg[3] -- 發(fā)送send_queue中的數(shù)據(jù) send_item = publish_item(mqtt_client) -- mqtt publish數(shù)據(jù)請求 elseif msg[2] == "PUBLISH_REQ" then -- 如果mqtt client對象存在,并且沒有正在等待發(fā)送結(jié)果的發(fā)送數(shù)據(jù)項 if mqtt_client and not send_item then -- 發(fā)送send_queue中的數(shù)據(jù) send_item = publish_item(mqtt_client) end -- mqtt publish數(shù)據(jù)成功 elseif msg[2] == "PUBLISH_OK" then -- publish成功,執(zhí)行回調(diào)函數(shù)通知發(fā)送方 publish_item_cbfunc(send_item, true) -- publish成功,通知網(wǎng)絡(luò)環(huán)境檢測看門狗功能模塊進(jìn)行喂狗 sys.publish("FEED_NETWORK_WATCHDOG") -- 發(fā)送send_queue中的數(shù)據(jù) send_item = publish_item(mqtt_client) -- mqtt斷開連接 elseif msg[2] == "DISCONNECTED" then -- 清空mqtt client對象 mqtt_client = nil -- 如果存在正在等待發(fā)送結(jié)果的發(fā)送項,執(zhí)行回調(diào)函數(shù)通知發(fā)送方失敗 publish_item_cbfunc(send_item, false) -- 如果發(fā)送隊列中有數(shù)據(jù)等待發(fā)送 while #send_queue>0 do -- 取出來第一條數(shù)據(jù)賦值給send_item -- 同時從隊列send_queue中刪除這一條數(shù)據(jù) send_item = table.remove(send_queue,1) -- 執(zhí)行回調(diào)函數(shù)通知發(fā)送方失敗 publish_item_cbfunc(send_item, false) end -- 當(dāng)前沒有正在等待發(fā)送結(jié)果的發(fā)送項 send_item = nil end end end -- 訂閱"SEND_DATA_REQ"消息; -- 其他應(yīng)用模塊如果需要發(fā)送數(shù)據(jù),直接sys.publish這個消息即可,將需要發(fā)送的數(shù)據(jù)以及回調(diào)函數(shù)和回調(diào)參數(shù)一起publish出去; sys.subscribe("SEND_DATA_REQ", send_data_req_proc_func) --創(chuàng)建并且啟動一個task --運(yùn)行這個task的處理函數(shù)mqtt_client_sender_task_func sys.taskInitEx(mqtt_client_sender_task_func, mqtt_sender.TASK_NAME) return mqtt_sender

3.4.8 app_mqtt_receiver.lua

--[[ @module app_mqtt_receiver @summary MQTT客戶端數(shù)據(jù)接收應(yīng)用模塊 @version 1.0 @date 2026.03.15 @author LuatOS @usage 本文件為MQTT客戶端數(shù)據(jù)接收應(yīng)用模塊,核心業(yè)務(wù)邏輯為: 1、提供mqtt_receiver.proc接口,對接收到的publish數(shù)據(jù)進(jìn)行處理; 本文件的對外接口有1個: 1、mqtt_receiver.proc(data, payload, metas):處理接收到的publish數(shù)據(jù); data:string類型,表示topic; payload:string類型,表示payload; metas:table類型,表示消息的元數(shù)據(jù); ]] local mqtt_receiver = {} -- 處理接收到的publish數(shù)據(jù) -- data:string類型,表示topic -- payload:string類型,表示payload -- metas:table類型,數(shù)據(jù)內(nèi)容如下 -- { -- qos: number類型,取值范圍0,1,2 -- retain:number類型,取值范圍0,1 -- dup:number類型,取值范圍0,1 -- message_id: number類型 -- } function mqtt_receiver.proc(data, payload, metas) -- 打印接收到的數(shù)據(jù) log.info("mqtt_receiver.proc", "topic:", data, "payload:", payload, "metas:", json.encode(metas)) -- 這里可以根據(jù)實(shí)際需求處理接收到的數(shù)據(jù) -- 例如:解析命令、控制設(shè)備等 end return mqtt_receiver

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • AI
    AI
    +關(guān)注

    關(guān)注

    91

    文章

    41689

    瀏覽量

    302922
  • MQTT
    +關(guān)注

    關(guān)注

    5

    文章

    744

    瀏覽量

    25289
  • 溫濕度顯示
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    1282
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何使用paho-mqtt框架實(shí)現(xiàn)溫濕度數(shù)據(jù)的實(shí)時顯示?

    如何使用paho-mqtt實(shí)框架現(xiàn)溫濕度數(shù)據(jù)的實(shí)時顯示?
    發(fā)表于 10-08 09:12

    如何通過NodeMCU和DHT11收集溫濕度

    使用 NodeMCU 和 DHT11 傳感器通過 MQTT 上傳溫濕度數(shù)據(jù)簡介本示例將演示如何通過 NodeMCU, DHT11 收集
    發(fā)表于 11-24 08:08

    SIM800C實(shí)現(xiàn)溫濕度數(shù)據(jù)上傳平臺(MQTT協(xié)議)

    SIM800C_ONENET_MQTT_接入文檔 一、實(shí)現(xiàn)的功能:用SIM800C模塊實(shí)現(xiàn)DHT11采集的溫濕度數(shù)據(jù)上傳ONENET平臺(MQTT協(xié)議) 二、硬件平臺:SIM800C
    發(fā)表于 12-04 14:56 ?49次下載
    SIM800C實(shí)現(xiàn)<b class='flag-5'>溫濕度數(shù)據(jù)</b><b class='flag-5'>上傳</b>平臺(<b class='flag-5'>MQTT</b>協(xié)議)

    使用 NodeMCU 和 DHT11 傳感器通過 MQTT 上傳溫濕度數(shù)據(jù)

    使用 NodeMCU 和 DHT11 傳感器通過 MQTT 上傳溫濕度數(shù)據(jù)簡介本示例將演示如何通過 NodeMCU, DHT11 收集
    發(fā)表于 11-16 10:06 ?29次下載
    使用 NodeMCU 和 DHT11 傳感器<b class='flag-5'>通過</b> <b class='flag-5'>MQTT</b> <b class='flag-5'>上傳</b><b class='flag-5'>溫濕度數(shù)據(jù)</b>

    低功耗4G模組Air780E快速入門:使用文件系統(tǒng)存儲溫濕度數(shù)據(jù)

    ? 伙伴們,今天我們來學(xué)習(xí)合宙低功耗4G模組Air780E快速入門之使用文件系統(tǒng)存儲溫濕度數(shù)據(jù)。 一、 編寫腳本 1.1 準(zhǔn)備資料 780E開發(fā)板購買鏈接 780E開發(fā)板設(shè)計資料
    的頭像 發(fā)表于 10-19 21:34 ?1467次閱讀
    低功耗4G模組<b class='flag-5'>Air780</b>E快速入門:使用文件系統(tǒng)存儲<b class='flag-5'>溫濕度數(shù)據(jù)</b>

    關(guān)于Air780E:使用文件系統(tǒng)存儲溫濕度數(shù)據(jù)怎么操作?

    ?伙伴們,今天我們來學(xué)習(xí)合宙低功耗4G模組Air780E快速入門之使用文件系統(tǒng)存儲溫濕度數(shù)據(jù)。 一、 編寫腳本 1.1 硬件及資料準(zhǔn)備 780E開發(fā)板 LuatOS-Air780E-文
    的頭像 發(fā)表于 10-31 07:26 ?1252次閱讀
    關(guān)于<b class='flag-5'>Air780</b>E:使用文件系統(tǒng)存儲<b class='flag-5'>溫濕度數(shù)據(jù)</b>怎么操作?

    Air780EPM 模塊串口電路設(shè)計硬件指導(dǎo)

    串口作為Air780EPM模塊的核心通信接口,承擔(dān)著設(shè)備控制、數(shù)據(jù)傳輸及外設(shè)交互等關(guān)鍵功能,在物聯(lián)網(wǎng)終端、智能設(shè)備、工業(yè)自動化等場景中不可或缺。 一、概述 ? 串口作為 Air780EPM 模塊最最
    的頭像 發(fā)表于 03-07 17:56 ?931次閱讀
    <b class='flag-5'>Air780EPM</b> 模塊串口電路設(shè)計硬件指導(dǎo)

    手把手教你!4G模組Air780EPM——GPIO的設(shè)計說明

    4G模組Air780EPM作為廣和通推出的高性能Cat.1bis無線通信模塊,憑借其低功耗、高集成度及豐富的外設(shè)接口,在工業(yè)物聯(lián)網(wǎng)、智能終端、車載設(shè)備等領(lǐng)域展現(xiàn)出卓越的適配性。 一、概述
    的頭像 發(fā)表于 03-17 16:07 ?1331次閱讀
    手把手教你!4G模組<b class='flag-5'>Air780EPM</b>——GPIO的設(shè)計說明

    解鎖Air780EPM:N種GPIO操控LED的實(shí)戰(zhàn)技巧!

    在物聯(lián)網(wǎng)項目中,靈活使用Air780EPM的GPIO控制LED至關(guān)重要。本文將展示實(shí)現(xiàn)方式,涵蓋硬件配置與軟件編程,滿足不同場景需求。 今天特別分享基于Air780EPM的GPIO控制LED實(shí)現(xiàn)方案
    的頭像 發(fā)表于 05-28 16:56 ?1107次閱讀
    解鎖<b class='flag-5'>Air780EPM</b>:N種GPIO操控LED的實(shí)戰(zhàn)技巧!

    優(yōu)化你的設(shè)計:Air780EPM場景化ADC硬件電路指南!

    提升ADC性能需從場景需求出發(fā)。本文針對Air780EPM數(shù)據(jù)采集中的常見挑戰(zhàn),如噪聲抑制、動態(tài)范圍適配等,提供場景化的優(yōu)化方案與電路設(shè)計建議,助力打造高性價比的硬件系統(tǒng)。 最近有工程師朋友問
    的頭像 發(fā)表于 06-13 18:02 ?1084次閱讀
    優(yōu)化你的設(shè)計:<b class='flag-5'>Air780EPM</b>場景化ADC硬件電路指南!

    Air780EPM — ADC硬件電路設(shè)計:場景化優(yōu)化與實(shí)踐!

    不同應(yīng)用場景對ADC電路的要求差異明顯,Air780EPM的設(shè)計需針對性優(yōu)化。本文通過實(shí)例解析電源濾波、信號隔離等關(guān)鍵技術(shù),闡述如何根據(jù)具體場景需求打造高性能的硬件電路方案。 最近有工程師朋友問
    的頭像 發(fā)表于 06-11 14:40 ?825次閱讀
    <b class='flag-5'>Air780EPM</b> — ADC硬件電路設(shè)計:場景化優(yōu)化與實(shí)踐!

    Air8101多網(wǎng)融合戰(zhàn)略升級:Air780EPM模塊助力4G聯(lián)網(wǎng)落地

    在物聯(lián)網(wǎng)通信技術(shù)持續(xù)迭代的背景下,Air8101通過戰(zhàn)略級模塊外掛——Air780EPM,正式邁入4G聯(lián)網(wǎng)時代。多網(wǎng)融合架構(gòu)的完善,使設(shè)備在復(fù)雜環(huán)境中仍能保持高速、穩(wěn)定的數(shù)據(jù)傳輸性能,
    的頭像 發(fā)表于 06-23 16:53 ?751次閱讀
    <b class='flag-5'>Air</b>8101多網(wǎng)融合戰(zhàn)略升級:<b class='flag-5'>Air780EPM</b>模塊助力4G聯(lián)網(wǎng)落地

    Air780EPM嵌入式開發(fā):LuatOS下的MQTT通信實(shí)踐

    通過LuatOS腳本在Air780EPM開發(fā)板上實(shí)現(xiàn)MQTT通信,是物聯(lián)網(wǎng)設(shè)備開發(fā)中高效且便捷的解決方案。 一、MQTT 協(xié)議詳解 ? 1.1 什么是
    的頭像 發(fā)表于 09-30 16:11 ?2036次閱讀
    <b class='flag-5'>Air780EPM</b>嵌入式開發(fā):LuatOS下的<b class='flag-5'>MQTT</b>通信實(shí)踐

    實(shí)戰(zhàn)Air780EPM:構(gòu)建4G共享網(wǎng)關(guān),服務(wù)WiFi與有線設(shè)備!

    通過Air780EPM開發(fā)板,我們可以輕松實(shí)現(xiàn)4G網(wǎng)絡(luò)作為數(shù)據(jù)出口,為周邊的WiFi設(shè)備和以太網(wǎng)設(shè)備提供互聯(lián)網(wǎng)共享,適用于移動辦公、遠(yuǎn)程部署等場景。 一、多網(wǎng)融合概述 ? Air780EPM
    的頭像 發(fā)表于 09-30 16:03 ?1513次閱讀
    實(shí)戰(zhàn)<b class='flag-5'>Air780EPM</b>:構(gòu)建4G共享網(wǎng)關(guān),服務(wù)WiFi與有線設(shè)備!

    LuatOS嵌入式開發(fā)實(shí)戰(zhàn):Air780EPMMQTT通信

    ?本教程聚焦于LuatOS在Air780EPM開發(fā)板上的應(yīng)用,演示如何通過腳本實(shí)現(xiàn)MQTT協(xié)議通信,助力物聯(lián)網(wǎng)設(shè)備快速聯(lián)網(wǎng)。 一、MQTT 協(xié)議詳解 ? 1.1 什么是
    的頭像 發(fā)表于 09-29 18:10 ?710次閱讀
    LuatOS嵌入式開發(fā)實(shí)戰(zhàn):<b class='flag-5'>Air780EPM</b>與<b class='flag-5'>MQTT</b>通信
    正蓝旗| 英吉沙县| 襄垣县| 灵宝市| 大石桥市| 平顶山市| 内丘县| 晋江市| 兴文县| 夏津县| 方山县| 寻甸| 芦山县| 绥棱县| 河池市| 安陆市| 林西县| 永兴县| 黎城县| 南澳县| 天祝| 满洲里市| 晋宁县| 元朗区| 宁陵县| 澄迈县| 华蓥市| 奉新县| 岳阳市| 凤台县| 赣榆县| 新巴尔虎左旗| 武穴市| 建昌县| 大姚县| 高安市| 佛山市| 岳池县| 会理县| 长白| 阿克苏市|