Forráskód Böngészése

add: 为air302添加uart与udp结合的demo, 演示透传

Wendal Chen 5 éve
szülő
commit
c2d4a46ee6
1 módosított fájl, 76 hozzáadás és 0 törlés
  1. 76 0
      bsp/air302/demo/udp_uart/main.lua

+ 76 - 0
bsp/air302/demo/udp_uart/main.lua

@@ -0,0 +1,76 @@
+
+-- LuaTools需要PROJECT和VERSION这两个信息
+PROJECT = "udpuart"
+VERSION = "1.0.0"
+
+--[[
+    这个demo演示一个简易的DTU功能, 数据的两端分别是UDP服务器器和UART
+]]
+
+-- sys库是标配
+_G.sys = require("sys")
+
+
+-- 把串口配置好
+sys.subscribe("uart_write", function(data)
+    uart.write(2, data)
+end)
+
+uart.on(2, "receive", function(id, len)
+    local data = uart.read(id, 1024)
+    log.info("uart", "receive", data)
+    sys.publish("uart_recv", data) -- 对应socket任务里面的sys.waitUntil
+end)
+uart.setup(2, 115200)
+
+-- socket任务
+sys.taskInit(function()
+    while 1 do
+        -- 先判断是否联网
+        if socket.isReady() then
+            sys.wait(1000) -- 稍微等一下,成功率高
+            local netc = socket.udp() -- 如果改成socket.tcp() 这就是TCP的demo了,写法没什么区别
+            -- 服务器信息, 使用域名的话还需要进行解析,有概率失败, 推荐使用ip
+            netc:host("nutz.cn") -- 必须是公网域名/公网ip, 内网ip是连不上的!!!!
+            netc:port(17888)
+            -- 监听连接成功的事件, udp并未真正的连接建立过程, 所以通常都会成功
+            netc:on("connect", function(id, re)
+                log.info("udp", "connect ok", id, re)
+                if re then
+                    netc:send("reg," .. nbiot.imei() .. "," .. nbiot.iccid()) -- 加个前缀方便服务器识别数据,非必须
+                end
+            end)
+            -- 监听数据接收的事件, 服务器需要下发数据
+            netc:on("recv", function(id, data)
+                log.info("udp", "recv", #data, data)
+                sys.publish("uart_write", data) -- 发布消息, 对应UART函数里面的 sys.subscribe("uart_write", function()...)
+            end)
+            -- 监听事件配好了,开始真正的连接(udp无连接过程,但还是需要启动一下)
+            if netc:start() == 0 then
+                -- 一直循环, 直至连接中断
+                while netc:closed() == 0 do
+                    -- 监听  连接关闭, 或者uart数据接收,或者超时
+                    local re, data = sys.waitUntil({"NETC_END_" .. netc:id(), "uart_recv"}, 30000)
+                    if netc:closed() == 0 then
+                        -- 仅uart数据接收时会有data数据,且类型为string
+                        if type(data) == "string" then
+                            netc:send("data," .. nbiot.imei() .. "," .. data) -- 这里加前缀"data," 只是为了方便识别.非必须
+                        end
+                    end
+                end
+            end
+            -- 必须清理连接上下文,确保关闭和清理掉系统资源
+            netc:clean()
+            netc:close()
+            log.info("udp", "all close, sleep 30s")
+            sys.wait(30000) -- 毕竟是NBIOT, 断开后建议休眠长一些
+        else
+            sys.wait(1000) -- 等联网
+        end
+    end
+end)
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!