low_power.lua 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. -- netlab.luatos.com上打开TCP 有测试服务器
  2. local server_ip = "112.125.89.8"
  3. local server_port = 43890
  4. local is_udp = false --用户根据自己实际情况选择
  5. --是UDP服务器就赋值为true,是TCP服务器就赋值为flase
  6. --UDP服务器比TCP服务器功耗低
  7. --如果用户对数据的丢包率有极为苛刻的要求,最好选择TCP
  8. local Heartbeat_interval = 5 -- 发送数据的间隔时间,单位分钟
  9. -- 配置GPIO达到最低功耗
  10. gpio.setup(24, 0) -- 关闭三轴电源
  11. -- 数据内容
  12. local heart_data = string.rep("1234567890", 10)
  13. local rxbuf = zbuff.create(8192)
  14. local function netCB(netc, event, param)
  15. if param ~= 0 then
  16. sys.publish("socket_disconnect")
  17. return
  18. end
  19. if event == socket.LINK then
  20. elseif event == socket.ON_LINE then
  21. -- 链接上服务器以后发送的第一包数据是 hello,luatos
  22. socket.tx(netc, "hello,luatos!")
  23. elseif event == socket.EVENT then
  24. socket.rx(netc, rxbuf)
  25. socket.wait(netc)
  26. if rxbuf:used() > 0 then
  27. log.info("收到", rxbuf:toStr(0, rxbuf:used()), "数据长度", rxbuf:used())
  28. end
  29. rxbuf:del()
  30. elseif event == socket.TX_OK then
  31. socket.wait(netc)
  32. log.info("发送完成")
  33. elseif event == socket.CLOSED then
  34. sys.publish("socket_disconnect")
  35. end
  36. end
  37. local function socketTask()
  38. local netc = socket.create(nil, netCB) --创建一个链接
  39. socket.debug(netc, true)--开启socket层的debug日志,方便寻找问题
  40. socket.config(netc, nil, is_udp, nil, 300, 5, 6) --配置TCP链接的参数,开启保活,防止长时间无数据交互服务器踢掉模块
  41. while true do
  42. --真正去链接服务器
  43. local succ, result = socket.connect(netc, server_ip, server_port)
  44. --链接成功后循环发送数据
  45. while succ do
  46. local Heartbeat_interval = Heartbeat_interval * 60 * 1000
  47. sys.wait(Heartbeat_interval)
  48. socket.tx(netc, heart_data)
  49. end
  50. --链接不成功5S重连一次
  51. if not succ then
  52. log.info("未知错误,5秒后重连")
  53. uart.write(1, "未知错误,5秒后重连")
  54. else
  55. local result, msg = sys.waitUntil("socket_disconnect")
  56. end
  57. log.info("服务器断开了,5秒后重连")
  58. uart.write(1, "服务器断开了,5秒后重连")
  59. socket.close(netc)
  60. sys.wait(5000)
  61. end
  62. end
  63. local function sleep_handle()
  64. pm.power(pm.WORK_MODE, 1, 1)
  65. pm.power(pm.WORK_MODE, 1)
  66. end
  67. -- 收取数据会触发回调, 这里的"receive" 是固定值
  68. uart.on(1, "receive", function(id, len)
  69. local s = ""
  70. pm.power(pm.WORK_MODE, 0) -- 进入极致功耗模式
  71. repeat
  72. s = uart.read(id, 128)
  73. if #s > 0 then -- #s 是取字符串的长度
  74. -- 关于收发hex值,请查阅 https://doc.openluat.com/article/583
  75. log.info("uart", "receive", id, #s, s)
  76. uart.write(1, "recv:" .. s)
  77. -- log.info("uart", "receive", id, #s, s:toHex()) --如果传输二进制/十六进制数据, 部分字符不可见, 不代表没收到
  78. end
  79. sys.timerStart(sleep_handle,1500) -- 延迟一段时间,不然无法打印日志,如果不考虑打印日志,可以直接进入休眠
  80. until s == ""
  81. end)
  82. function socketDemo()
  83. sys.wait(2000)
  84. uart.setup(1, 9600) -- 配置uart1,外部唤醒用
  85. uart.write(1, "test lowpower")
  86. log.info("开始测试低功耗模式")
  87. sys.wait(2000)
  88. --配置GPIO以达到最低功耗的目的
  89. gpio.setup(23, nil)
  90. gpio.close(33) -- 如果功耗偏高,开始尝试关闭WAKEUPPAD1
  91. gpio.close(35) -- 这里pwrkey接地才需要,不接地通过按键控制的不需要
  92. --关闭USB以后可以降低约150ua左右的功耗,如果不需要USB可以关闭
  93. pm.power(pm.USB, false)
  94. --进入低功耗长连接模式
  95. -- WiFi模组进入低功耗模式
  96. pm.power(pm.WORK_MODE, 1, 1)
  97. -- 同时4G进入低功耗模式
  98. pm.power(pm.WORK_MODE, 1)
  99. sys.wait(20)
  100. -- 暂停airlink通信,进一步降低功耗
  101. airlink.pause(1)
  102. sys.taskInit(socketTask)
  103. end
  104. sys.taskInit(socketDemo)