Luat模块应用手册-示例-Luat DEMO-长连接超低功耗方案

如何用开发板实现 低功耗长连接 功能

简介

socket是物联网中最常用的功能,本文介绍如何用Air724开发板,和PC端搭建一个TCP服务器进行socket数传的功能演示。

材料准备

  1. EVB_Air724UG_A13开发板一套,包括天线SIM卡,USB线。
  2. PC电脑,以及官方TCP测试web页面:http://tcplab.openluat.com/
  3. luat开发环境:环境搭建方法
    图片.png

步骤

实现代码

在实现TCP 长连接之前,有几个参数需要做交代:

  1. 服务器IP和端口,以及准备工作
bool flag_conned=false --服务器是否已连接
local tip,  tport  = "106.13.6.X", "6640"
--向TCP服务端发送普通数据或心跳数据
function send_tcp_request(pdata)
    sys.publish("T_SOCKET_SEND_DATA",pdata)
end
  1. 参与测试的串口收发代码(并非必需,这里是为了测试才加上的),用户可以把串口1和服务器之间通过TCP 做透传
local UART1_ID, recvQueue = 1, {}
local uartimeout, recvReady,RECV_MAXCNT = 2000, "UART_RECV_ID",1024

---这里使用uart1 连接电脑来和服务器进行数据交互
local function uart1_write(data)
    for i = 1, #data, 1460 do
        uart.write(UART1_ID, data:sub(i, i + 1460 - 1))
    end
end
---配置串口的参数
uart.setup(UART1_ID, 115200, 8, uart.PAR_NONE, uart.STOP_1)
---通过注册回调函数来收串口数据
uart.on(UART1_ID, "receive", function(uid)
    local str_recv = uart.read(uid, RECV_MAXCNT)
    log.info("uart recv <---------", str_recv)
    send_tcp_request( str_recv)
    uart1_write("OK\r\n")
end)
  1. TCP 工作线程
sys.taskInit(function()
    local r, s, p
    local result,  unProcData=false,""
    while true do
        local count = 0
        flag_conned=false
        while not socket.isReady() do--等联网
            count = count + 1
            log.info("check net",count)
            sys.wait(1000)
            if count > 60 then  --如果太长时间连不上,则进入飞行模式重连(属小概率事件)
                net.switchFly(true)
                sys.wait(5000)
                net.switchFly(false)
                count = 0
            end
        end
        log.info("+++++++++++++++ socket ready+++++++++++++++")
        -- 找到网络后发出下面两个指令,优化休眠。
       ril.request("AT+WAKETIM=1\r\n")
        sys.timerStart(function() 
              ril.request("AT*RTIME=2\r\n")
        end,1000)
        local c = socket.tcp()
        if c:connect(tip, tport) then
            flag_conned=true
            ---每次重新连接TCP服务器都要做一次登录操作
            while true do
                local r, s, p = c:recv(120000, "T_SOCKET_SEND_DATA")
                if r then
                    if  s and  #s >0 then
                        --假定用户用串口1 和TCP 进行透传,则把从服务器收到的内容转发到串口1
                        uart1_write(s)
                    end
                elseif s == "T_SOCKET_SEND_DATA" then
                   log.info("socket send----->", p)
                   if not c:send(p,10) then break end
                elseif s == "timeout" then
                    --注意#B,如果是网络通信TIMEOUT 保活,这里可以发送保活数据包
                    --send_tcp_request("heartdata")
                else
                    log.info("loop exit r,s,p",r,s,p)
                    break
                end
            end
        end
        flag_conned=false
        r,s,p = nil,nil,nil
        c:close()
        link.shut()
    end
end)
  1. 如果是固定周期保活的,则TCP 工作线程中的 timout (–注意#B的地方)就不需要发送心跳了,而是开一个循环定时器,如下 120秒上报一次心跳:
sys.timerLoopStart(function() 
    if flag_conned then
        send_tcp_request("heartdata")
    end
end, 12000)

常见问题

1,在进行CTA/GCF等测试认证的时候需要关闭该功能。
2,如果心跳包比较频繁,比如10秒一次,那就不建议开启这个功能,极端情况下可能会导致设备断网。
3,如果数传是基于UDP这种非可靠传输,打开这个功能后,丢包概率会变大。

4 LUAT 的底包在应用层不做任何休眠调度时,默认是启用休眠的。休眠会让部分外设停止工作,比如彩屏的SPI ,CAT1的串口2 和串口3 等,如果要对外设进行控制,建议主动唤醒模块 pm.wake(“flagxxx”), 当需要进入休眠了,就调用 pm.sleep(“flagxxx”), 应用逻辑上,要这两个操作是成对的。
5.关于休眠的测量,建议使用高精度的电流测试仪器,测试条件定义为连上服务器后首次电流数字持续跌落 到几个毫安的时候开始, 测量时间越长平均功耗越准确,总测量时长最少要超过半小时。

相关资料以及购买链接

SOCKETAPI说明
源代码 : JLF_TEST.lua

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值