psm+_power.lua 4.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. --[[
  2. @module psm+_power
  3. @summary psm+超低功耗模式主应用功能模块
  4. @version 1.0
  5. @date 2025.07.01
  6. @author 陈取德
  7. @usage
  8. 本文件为psm+超低功耗模式主应用功能模块,核心业务逻辑为:
  9. 1、进入低功耗模式
  10. 2、判断是否在低功耗模式下连接网络和发送平台心跳包
  11. 使用前请根据需要,变更功能变量。条件不同,功耗体现不同。
  12. 本文件没有对外接口,直接在main.lua中require "psm+_power"就可以加载运行;
  13. ]] --
  14. ----是否需要连接WIFI,测试连接网络状态下功耗--------------------------------------
  15. local wifi_mode = true -- true 需要 --false 不需要
  16. -------------------------------------------------------------------------------
  17. -----是否需要保持服务器心跳------------------------------------------------------
  18. local tcp_mode = true -- true 需要,设置下方心跳包。 --false 不需要,不需要设置心跳包。
  19. local tcp_heartbeat = 5 -- PSM+模式心跳包,单位(分钟),输入 1 为 一分钟一次心跳包。
  20. local heart_data = string.rep("1234567890", 3) -- 心跳包数据内容,可自定义。
  21. -------------------------------------------------------------------------------
  22. -- 定义send_result函数用于获取tcp_client_sender中的信息发送是否成功
  23. function send_result(a1, b1)
  24. log.info("发送状态 :", a1, b1)
  25. -- 获取tcp_client_sender发送状态后推送信息解除psm_power_func()的sys.waitUntil挂起状态。并返回发送状态a1。
  26. sys.publish("send_result", a1, b1)
  27. end
  28. -- 定义一个表,将回调函数放在表中,因为tcp_client_sender处理回调函数时考虑到带参执行,所以要将函数和参数都放在表里
  29. local send_result_func = {
  30. func = send_result
  31. }
  32. function psm_power_func()
  33. log.info("开始测试PSM+模式功耗。")
  34. -- 判断是否连接WIFI,请注意WIFI账号密码是否正确。
  35. if wifi_mode then
  36. -- 导入WIFI_app功能,自动运行连接WIFI。
  37. require "wifi_app"
  38. -- 判断是否连接TCP平台。
  39. if tcp_mode then
  40. -- 导入tcp客户端收发功能模块,运行tcp客户端连接,自动处理TCP收发消息。
  41. require "tcp_client_main"
  42. while not socket.adapter(socket.dft()) do
  43. log.warn("tcp_client_main_task_func", "wait IP_READY")
  44. -- 在此处阻塞等待WIFI连接成功的消息"IP_READY",避免联网过快,丢失了"IP_READY"信息而导致一直被卡住。
  45. -- 或者等待30秒超时退出阻塞等待状态
  46. sys.waitUntil("IP_READY", 30000)
  47. end
  48. -- 推送"SEND_DATA_REQ"消息,该消息为tcp_client_sender的接口,带上tag和信息还有回调函数,可以实现自动发送和发送状态获取。
  49. sys.publish("SEND_DATA_REQ", "timer", heart_data, send_result_func)
  50. -- 通过变量获取回调函数在tcp_client_sender中获取的发送状态。
  51. -- 第一个值为sys.waitUntil的结果,是否信息唤醒。
  52. -- 第二个值为发送是否成功
  53. -- 第三个值为回调函数带的参数
  54. local _, a, b = sys.waitUntil("send_result")
  55. -- 通过发送状态判断发送是否成功,并打印变量 a 的赋值
  56. if a then
  57. log.info("发送成功!", a)
  58. else
  59. log.info("发送失败!", a)
  60. end
  61. -- 进入PSM+前需要手动断开AP链接,不然无法正常进入PSM+
  62. wlan.disconnect()
  63. -- 等待断网事件确定已经断开AP
  64. sys.waitUntil("IP_LOSE", 5000)
  65. -- 判断完有没有发送成功后都进入PSM+模式,减少功耗损耗。
  66. -- 配置dtimerStart唤醒定时器,根据预设时间唤醒Air8101上传心跳信息。
  67. pm.dtimerStart(0, tcp_heartbeat * 60 * 1000)
  68. -- 定完定时器即可进入PSM+,执行到这条代码后,CPU关机,后续代码不会执行。
  69. pm.power(pm.WORK_MODE, 3)
  70. else
  71. -- 进入PSM+前需要手动断开AP链接,不然无法正常进入PSM+
  72. wlan.disconnect()
  73. -- 等待断网事件确定已经断开AP
  74. sys.waitUntil("IP_LOSE", 5000)
  75. -- 执行到这条代码后,CPU关机,后续代码不会执行。
  76. pm.power(pm.WORK_MODE, 3)
  77. end
  78. else
  79. -- 判断不需要连WIFI,直接进入PSM+
  80. -- 执行到这条代码后,CPU关机,后续代码不会执行。
  81. pm.power(pm.WORK_MODE, 3)
  82. end
  83. end
  84. sys.taskInit(psm_power_func)