소스 검색

添加mqtt和。lora超过30字符测试

xuxinyi 3 달 전
부모
커밋
132f25e9ea
5개의 변경된 파일172개의 추가작업 그리고 2개의 파일을 삭제
  1. 1 1
      drv_periph/radio.lua
  2. 1 1
      main.lua
  3. 29 0
      mqttConnect/mqttInMsg.lua
  4. 70 0
      mqttConnect/mqttOutMsg.lua
  5. 71 0
      mqttConnect/mqttTask.lua

+ 1 - 1
drv_periph/radio.lua

@@ -34,7 +34,7 @@ sys.taskInit(function()
         sx126x_driver.sentString(string111)
         -- log.info("Radio", "测试接收数据中。。。")
         -- sx126x_driver.RadioRx(0)
-        sx126x_driver.SX126xWakeup()
+        -- sx126x_driver.SX126xWakeup()
         sys.wait(1000)
         -- sx126x_driver.RadioRx(0)
     end

+ 1 - 1
main.lua

@@ -67,7 +67,7 @@ errDump.request("udp://dev_msg1.openluat.com:12425", nil, true)
 -- require "Drv_spi"
 require "radio"
 require "Air530zGPS"
-
+require "mqttTask"
 
 --启动系统框架
 sys.init(0, 0)

+ 29 - 0
mqttConnect/mqttInMsg.lua

@@ -0,0 +1,29 @@
+--- 模块功能:MQTT客户端数据接收处理
+-- @author openLuat
+-- @module mqtt.mqttInMsg
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.28
+
+module(...,package.seeall)
+
+--- MQTT客户端数据接收处理
+-- @param mqttClient,MQTT客户端对象
+-- @return 处理成功返回true,处理出错返回false
+-- @usage mqttInMsg.proc(mqttClient)
+function proc(mqttClient)
+    local result,data
+    while true do
+        result,data = mqttClient:receive(60000,"APP_SOCKET_SEND_DATA")
+        --接收到数据
+        if result then
+            log.info("mqttInMsg.proc",data.topic,string.toHex(data.payload))
+                
+            --TODO:根据需求自行处理data.payload
+        else
+            break
+        end
+    end
+	
+    return result or data=="timeout" or data=="APP_SOCKET_SEND_DATA"
+end

+ 70 - 0
mqttConnect/mqttOutMsg.lua

@@ -0,0 +1,70 @@
+--- 模块功能:MQTT客户端数据发送处理
+-- @author openLuat
+-- @module mqtt.mqttOutMsg
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.28
+
+
+module(...,package.seeall)
+
+--数据发送的消息队列
+local msgQueue = {}
+
+local function insertMsg(topic,payload,qos,user)
+    table.insert(msgQueue,{t=topic,p=payload,q=qos,user=user})
+    sys.publish("APP_SOCKET_SEND_DATA")
+end
+
+local function pubQos0TestCb(result)
+    log.info("mqttOutMsg.pubQos0TestCb",result)
+    if result then sys.timerStart(pubQos0Test,10000) end
+end
+
+function pubQos0Test()
+    insertMsg("/qos0topic","你好",0,{cb=pubQos0TestCb})
+end
+
+local function pubQos1TestCb(result)
+    log.info("mqttOutMsg.pubQos1TestCb",result)
+    if result then sys.timerStart(pubQos1Test,20000) end
+end
+
+function pubQos1Test()
+    insertMsg("/中文qos1topic","中文qos1data",1,{cb=pubQos1TestCb})
+end
+
+--- 初始化“MQTT客户端数据发送”
+-- @return 无
+-- @usage mqttOutMsg.init()
+function init()
+    pubQos0Test()
+    -- pubQos1Test()
+end
+
+--- 去初始化“MQTT客户端数据发送”
+-- @return 无
+-- @usage mqttOutMsg.unInit()
+function unInit()
+    sys.timerStop(pubQos0Test)
+    sys.timerStop(pubQos1Test)
+    while #msgQueue>0 do
+        local outMsg = table.remove(msgQueue,1)
+        if outMsg.user and outMsg.user.cb then outMsg.user.cb(false,outMsg.user.para) end
+    end
+end
+
+
+--- MQTT客户端数据发送处理
+-- @param mqttClient,MQTT客户端对象
+-- @return 处理成功返回true,处理出错返回false
+-- @usage mqttOutMsg.proc(mqttClient)
+function proc(mqttClient)
+    while #msgQueue>0 do
+        local outMsg = table.remove(msgQueue,1)
+        local result = mqttClient:publish(outMsg.t,outMsg.p,outMsg.q)
+        if outMsg.user and outMsg.user.cb then outMsg.user.cb(result,outMsg.user.para) end
+        if not result then return end
+    end
+    return true
+end

+ 71 - 0
mqttConnect/mqttTask.lua

@@ -0,0 +1,71 @@
+--- 模块功能:MQTT客户端处理框架
+-- @author openLuat
+-- @module mqtt.mqttTask
+-- @license MIT
+-- @copyright openLuat
+-- @release 2018.03.28
+
+module(...,package.seeall)
+
+require"misc"
+require"mqtt"
+require"mqttOutMsg"
+require"mqttInMsg"
+
+local ready = false
+
+--- MQTT连接是否处于激活状态
+-- @return 激活状态返回true,非激活状态返回false
+-- @usage mqttTask.isReady()
+function isReady()
+    return ready
+end
+
+--启动MQTT客户端任务
+sys.taskInit(
+    function()
+        local retryConnectCnt = 0
+        while true do
+            if not socket.isReady() then
+                retryConnectCnt = 0
+                --等待网络环境准备就绪,超时时间是5分钟
+                sys.waitUntil("IP_READY_IND",300000)
+            end
+            
+            if socket.isReady() then
+                local imei = misc.getImei()
+                --创建一个MQTT客户端
+                local mqttClient = mqtt.client(imei,600,"user","password")
+                --阻塞执行MQTT CONNECT动作,直至成功
+                --如果使用ssl连接,打开mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"}),根据自己的需求配置
+                --mqttClient:connect("lbsmqtt.airm2m.com",1884,"tcp_ssl",{caCert="ca.crt"})
+                if mqttClient:connect("14.103.101.132",1883,"tcp") then
+                    retryConnectCnt = 0
+                    ready = true
+                    --订阅主题
+                    if mqttClient:subscribe({["/event0"]=0, ["/中文event1"]=1}) then
+                        mqttOutMsg.init()
+                        --循环处理接收和发送的数据
+                        while true do
+                            if not mqttInMsg.proc(mqttClient) then log.error("mqttTask.mqttInMsg.proc error") break end
+                            if not mqttOutMsg.proc(mqttClient) then log.error("mqttTask.mqttOutMsg proc error") break end
+                        end
+                        mqttOutMsg.unInit()
+                    end
+                    ready = false
+                else
+                    retryConnectCnt = retryConnectCnt+1
+                end
+                --断开MQTT连接
+                mqttClient:disconnect()
+                if retryConnectCnt>=5 then link.shut() retryConnectCnt=0 end
+                sys.wait(5000)
+            else
+                --进入飞行模式,20秒之后,退出飞行模式
+                net.switchFly(true)
+                sys.wait(20000)
+                net.switchFly(false)
+            end
+        end
+    end
+)