摘要:本期文章採用了4G LTE Cat.1模塊,編程語言用的是lua,實現對華為雲物聯網平臺的設備通信與控制 本文分享自華為雲社區《基於luatos的4G(LTE Cat.1)模組接入華為雲物聯網平臺完成設備通信與控制(Air780e)》,作者:中華小能能。 一、簡介 1、項目介紹 本期文章採用了 ...
摘要:本期文章採用了4G LTE Cat.1模塊,編程語言用的是lua,實現對華為雲物聯網平臺的設備通信與控制
本文分享自華為雲社區《基於luatos的4G(LTE Cat.1)模組接入華為雲物聯網平臺完成設備通信與控制(Air780e)》,作者:中華小能能。
一、簡介
1、項目介紹
本期文章採用了4G LTE Cat.1模塊,編程語言用的是lua,整體來說代碼比較簡潔,實現對華為雲物聯網平臺的設備通信與控制,即採用一個變數作為模擬屬性定時上報,並以一個LED燈作為受控設備進行雲端命令的控制,本期內容為我們在戶外的項目應用中提供一些參考方案,實現手機遠程式控制制戶外設備與數據通信的功能。
準備:
Air780e開發板
usb-typec數據線
4G SIM手機卡(可上網)
2、Air780E模組
Air780E 是LTE Cat.1bis通信模塊,採用移芯EC618平臺,支持4G全網通 支持雙卡單待、支持SPI LCD、支持USB 2.0, 僅CDC功能、支持I2S數字語音介面、支持攝像頭等配置,支持AT指令開發、CSDK開發和luatos的lua腳本語言的多種開發,開發板目前淘寶官網是39.9,性價比還是可以的
3、luatos
Lua可以說是目前嵌入式方案中,資源占用最小、運行效率最高、語法最簡潔的一門腳本語言。對於編程小白來說,它適合作為你的編程入門語言,因為語法簡單。對於會c語言的老手來說,它與c可以完美契合,再加上LuatOS本身就是開源,你可以輕鬆地使用c為其添加一套c庫介面,享受它的高效。在本次教程中,我們便使用lua語言跑luatos實現對華為雲物聯網平臺的設備通信與控制。
4、華為雲物聯網平臺
物聯網平臺的相關配置在這裡就不和大家一一重覆了,創建服務、設備、屬性、命令等過程大家可以參考以前發佈的文章(文末有鏈接),主要需要提前準備的數據有華為雲物聯網平臺的設備三元組、相關MQTT發佈訂閱主題等,參考如下:
local mqtt_host = "iot-mqtts.cn-north-4.myhuaweicloud.com" local mqtt_port = 1883 local mqtt_isssl = false local client_id = "61fb2d7fde9933029bfuniot_esp8266_test01_0_0_2023021710" local user_name = "61fb2d7fde9933029bfuniot_esp8266_test01" local password = "eaff6453a8b5b774b11funiot99aa367b52df8funiot5333funiotf76bea151" local mqtt_hw = nil local devdata_topic="$oc/devices/61fb2d7fde9933029funiot_esp8266_test01/sys/properties/report" --訂閱屬性上報主題 local cmdrec_topic="$oc/devices/61fb2d7fde9933029befuniot_esp8266_test01/sys/commands/#" --訂閱命令下發主題 local service_id="Dev_data" --服務ID local command_name="Control" --控制命令
二、完整開發流程
1.下載軟體包與編譯燒錄工具
1)LuatOS軟體包:Air780e使用LuatOS-SoC@EC618
2)調試與燒錄工具:Luatools
下載鏈接:https://doc.openluat.com/wiki/37?wiki_page_id=4489#LuaTools__9
2. 編寫luatos腳本
-- 獲取更多資料,可以關註公眾號"IOT趣製作" -- LuaTools需要PROJECT和VERSION這兩個信息 PROJECT = "led" VERSION = "1.0.0" -- 引入必要的庫文件(lua編寫), 內部庫不需要require sys = require("sys") log.info("main", "mqtt_huaweiiot") print(_VERSION) if wdt then --添加硬狗防止程式卡死,在支持的設備上啟用這個功能 wdt.init(9000)--初始化watchdog設置為9s sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗 end --用戶代碼開始--------------------------------------------------- --根據自己華為雲物聯網平臺的配置修改以下參數,下列參數僅作參考 local mqtt_host = "iot-mqtts.cn-north-4.myhuaweicloud.com" local mqtt_port = 1883 local mqtt_isssl = false local client_id = "61fb2d7fde9933029bfuniot_esp8266_test01_0_0_2023021710" local user_name = "61fb2d7fde9933029bfuniot_esp8266_test01" local password = "eaff6453a8b5b774b11funiot99aa367b52df8funiot5333funiotf76bea151" local mqtt_hw = nil local devdata_topic="$oc/devices/61fb2d7fde9933029funiot_esp8266_test01/sys/properties/report" --訂閱屬性上報主題 local cmdrec_topic="$oc/devices/61fb2d7fde9933029befuniot_esp8266_test01/sys/commands/#" --訂閱命令下發主題 local service_id="Dev_data" --服務ID local command_name="Control" --控制命令 local LED_PIN=27 --LED引腳編號 gpio.setup(LED_PIN,0, gpio.PULLUP) --設置LED上拉輸出 sys.taskInit(function() while 1 do --網路相關 mobile.simid(2) LED = gpio.setup(27, 0, gpio.PULLUP) device_id = mobile.imei() sys.waitUntil("IP_READY", 30000) --mqtt客戶端創建 mqtt_hw = mqtt.create(nil,mqtt_host, mqtt_port, mqtt_isssl, ca_file) mqtt_hw:auth(client_id,user_name,password) mqtt_hw:keepalive(60) -- 預設值240s mqtt_hw:autoreconn(true, 3000) -- 自動重連機制 --註冊mqtt回調 mqtt_hw:on(function(mqtt_client, event, data, payload) -- 用戶自定義代碼 log.info("mqtt", "event", event, mqtt_client, data, payload) if event == "conack" then --連接響應成功 sys.publish("mqtt_conack")--訂閱主題 mqtt_client:subscribe(pub_devdata_topic) mqtt_client:subscribe(pub_cmdrec_topic) elseif event == "recv" then log.info("mqtt", "downlink", "topic", data, "payload", payload) print("payload:",payload) --解析json --例如:{"paras":{"led":1},"service_id":"Dev_data","command_name":"Control"} local mycmd=json.decode(payload) if mycmd then -- 若解碼失敗, 會返回nil print("service_id :",mycmd["service_id"]) print("command_name is",mycmd["command_name"]) print("paras->led is",mycmd["paras"]["led"]) if mycmd["service_id"]==service_id and mycmd["command_name"]==command_name then if mycmd["paras"]["led"]==1 then print("led turn on") gpio.set(LED_PIN, gpio.HIGH) elseif mycmd["paras"]["led"]==0 then print("led turn off") gpio.set(LED_PIN, gpio.LOW) end end end elseif event == "sent" then log.info("mqtt", "sent", "pkgid", data) -- elseif event == "disconnect" then -- 非自動重連時,按需重啟mqtt_hw -- mqtt_client:connect() end end) --連接mqtt mqtt_hw:connect() sys.waitUntil("mqtt_conack") while true do -- mqtt_hw自動處理重連 local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 30000) if ret then if topic == "close" then break end mqtt_hw:publish(topic, data, qos) end end mqtt_hw:close() mqtt_hw = nil end end) --定時上報屬性 sys.taskInit(function() local topic = devdata_topic --上報的topic local temp=0 --溫度屬性值 local data = "{\"services\":[{\"service_id\":\"Dev_data\",\"properties\":{\"temp\": "..tostring(temp).."}}]}" local qos = 1 local temp=0 while true do sys.wait(5000) if mqtt_hw and mqtt_hw:ready() then -- mqtt_hw:subscribe(topic) local pkgid = mqtt_hw:publish(topic, data, qos) temp=temp+1 data = "{\"services\":[{\"service_id\":\"Dev_data\",\"properties\":{\"temp\": "..tostring(temp).."}}]}" -- 也可以通過sys.publish發佈到指定task去 -- sys.publish("mqtt_pub", topic, data, qos) end end end) -- 用戶代碼已結束--------------------------------------------- -- 結尾總是這一句 sys.run() -- sys.run()之後後面不要加任何語句!!!!!
3.編譯燒錄
打開Luatools,點擊項目管理按鈕,選擇下載好的固件(尾碼名為soc的文件)和編寫好的main.lua文件,勾選USB BOOT下載,點擊下載底層和腳本按鈕下載即可,具體操作流程如下圖所示:
4.運行結果
命令接收的同時開發板的LED燈光會對應的完成開關亮滅
5.Android APP
這裡我們同樣可以採用之前的Android APP完成與物聯網平臺的通信,實現手機遠程式控制制戶外設備與數據通信的功能
鏈接:【華為雲IOT的Android應用開發-詳細教程】:https://bbs.huaweicloud.com/forum/thread-186368-1-1.html
6.其他相關參考文章
【stm32+AT指令+ESP8266接入華為雲物聯網平臺並完成屬性上報與下發的命令處理】https://bbs.huaweicloud.com/forum/thread-195143-1-1.html
【esp8266接入華為雲物聯網平臺完成屬性上報、命令處理】https://bbs.huaweicloud.com/forum/thread-187353-1-1.html