psm.lua 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. --[[
  2. @module psm
  3. @summary gnss使用psm测试功能模块
  4. @version 1.0
  5. @date 2025.07.27
  6. @author 李源龙
  7. @usage
  8. 使用Air780EGH核心板,外接GPS天线,开启定位,获取到定位发送到服务器上面,然后启动一个60s的定时器唤醒PSM+模式
  9. 模块开启定位,然后定位成功获取到经纬度发送到服务器上面,然后进入PSM+模式,等待唤醒
  10. ]]
  11. gnss=require("gnss")
  12. pm.power(pm.WORK_MODE, 0)
  13. local lat,lng
  14. local server_ip = "112.125.89.8"
  15. local server_port = 47523 -- 换成自己的
  16. local period = 3 * 60 * 60 * 1000 -- 3小时唤醒一次
  17. local reason, slp_state = pm.lastReson() -- 获取唤醒原因
  18. log.info("wakeup state", pm.lastReson())
  19. local libnet = require "libnet"
  20. local d1Name = "D1_TASK"
  21. local function netCB(msg)
  22. log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
  23. end
  24. local function testTask(ip, port)
  25. local txData
  26. if reason == 0 then
  27. txData = "normal wakeup,"..string.format('{"lat":%5f,"lng":%5f}', lat, lng)
  28. elseif reason == 1 then
  29. txData = "timer wakeup,"..string.format('{"lat":%5f,"lng":%5f}', lat, lng)
  30. elseif reason == 2 then
  31. txData = "pad wakeup,"..string.format('{"lat":%5f,"lng":%5f}', lat, lng)
  32. elseif reason == 3 then
  33. txData = "uart1 wakeup,"..string.format('{"lat":%5f,"lng":%5f}', lat, lng)
  34. end
  35. if slp_state > 0 then
  36. mobile.flymode(0, false) -- 退出飞行模式,进入psm+前进入飞行模式,唤醒后需要主动退出
  37. end
  38. local netc, needBreak
  39. local result, param, is_err
  40. netc = socket.create(nil, d1Name)
  41. socket.debug(netc, false)
  42. socket.config(netc)
  43. local retry = 0
  44. while retry < 3 do
  45. log.info(rtos.meminfo("sys"))
  46. result = libnet.waitLink(d1Name, 0, netc)
  47. result = libnet.connect(d1Name, 5000, netc, ip, port)
  48. if result then
  49. log.info("服务器连上了")
  50. result, param = libnet.tx(d1Name, 15000, netc, txData)
  51. if not result then
  52. log.info("服务器断开了", result, param)
  53. break
  54. else
  55. needBreak = true
  56. end
  57. else
  58. log.info("服务器连接失败")
  59. end
  60. libnet.close(d1Name, 5000, netc)
  61. retry = retry + 1
  62. if needBreak then
  63. break
  64. end
  65. end
  66. uart.setup(1, 9600) -- 配置uart1,外部唤醒用
  67. -- 配置GPIO以达到最低功耗的目的
  68. -- gpio.close(23) --此脚为gnss备电脚,功能是热启动和保存星历文件,关掉会没有热启动,常开功耗会增高
  69. pm.dtimerStart(3, period) -- 启动深度休眠定时器
  70. mobile.flymode(0, true) -- 启动飞行模式,规避可能会出现的网络问题
  71. pm.power(pm.WORK_MODE, 3) -- 进入极致功耗模式
  72. sys.wait(15000) -- demo演示唤醒时间是三十分钟,如果15s后模块重启,则说明进入极致功耗模式失败,
  73. log.info("进入极致功耗模式失败,尝试重启")
  74. rtos.reboot()
  75. end
  76. local function mode1_cb(tag)
  77. log.info("TAGmode1_cb+++++++++",tag)
  78. local rmc=gnss.getRmc(0)
  79. log.info("nmea", "rmc", json.encode(gnss.getRmc(0)))
  80. lat,lng=rmc.lat,rmc.lng
  81. sysplus.taskInitEx(testTask, d1Name, netCB, server_ip, server_port)
  82. end
  83. local function gnss_fnc()
  84. log.info("gnss_fnc111")
  85. local gnssotps={
  86. gnssmode=1, --1为卫星全定位,2为单北斗
  87. agps_enable=true, --是否使用AGPS,开启AGPS后定位速度更快,会访问服务器下载星历,星历时效性为北斗1小时,GPS4小时,默认下载星历的时间为1小时,即一小时内只会下载一次
  88. -- debug=true, --是否输出调试信息
  89. -- uart=2, --使用的串口,780EGH和8000默认串口2
  90. -- uartbaud=115200, --串口波特率,780EGH和8000默认115200
  91. -- bind=1, --绑定uart端口进行GNSS数据读取,是否设置串口转发,指定串口号
  92. -- rtc=false --定位成功后自动设置RTC true开启,flase关闭
  93. }
  94. gnss.setup(gnssotps)
  95. gnss.open(gnss.TIMERORSUC,{tag="MODE1",val=60,cb=mode1_cb})
  96. end
  97. sys.taskInit(gnss_fnc)