gnss.lua 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. --[[
  2. @module gnss
  3. @summary gnss应用测试功能模块
  4. @version 1.0
  5. @date 2025.07.27
  6. @author 李源龙
  7. @usage
  8. 该文件演示的功能会用到exgnss.lua扩展库
  9. --关于exgnss的三种应用场景:
  10. exgnss.DEFAULT:
  11. --- exgnss应用模式1.
  12. -- 打开gnss后,gnss定位成功时,如果有回调函数,会调用回调函数
  13. -- 使用此应用模式调用exgnss.open打开的“gnss应用”,必须主动调用exgnss.close
  14. -- 或者exgnss.close_all才能关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
  15. -- 通俗点说就是一直打开,除非自己手动关闭掉
  16. exgnss.TIMERORSUC:
  17. --- exgnss应用模式2.
  18. -- 打开gnss后,如果在gnss开启最大时长到达时,没有定位成功,如果有回调函数,
  19. -- 会调用回调函数,然后自动关闭此“gnss应用”
  20. -- 打开gnss后,如果在gnss开启最大时长内,定位成功,如果有回调函数,
  21. -- 会调用回调函数,然后自动关闭此“gnss应用”
  22. -- 打开gnss后,在自动关闭此“gnss应用”前,可以调用exgnss.close或者
  23. -- exgnss.close_all主动关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
  24. -- 通俗点说就是设置规定时间打开,如果规定时间内定位成功就会自动关闭此应用,
  25. -- 如果没有定位成功,时间到了也会自动关闭此应用
  26. exgnss.TIMER:
  27. --- exgnss应用模式3.
  28. -- 打开gnss后,在gnss开启最大时长时间到达时,无论是否定位成功,如果有回调函数,
  29. -- 会调用回调函数,然后自动关闭此“gnss应用”
  30. -- 打开gnss后,在自动关闭此“gnss应用”前,可以调用exgnss.close或者exgnss.close_all
  31. -- 主动关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
  32. -- 通俗点说就是设置规定时间打开,无论是否定位成功,到了时间都会自动关闭此应用,
  33. -- 和第二种的区别在于定位成功之后不会自动关闭,到时间之后才会自动关闭
  34. 本示例主要是展示exgnss库的三种应用模式,然后关闭操作和查询应用是否有效操作,还有关闭全部应用操作,
  35. 以及定位成功之后如何使用exgnss库获取gnss的rmc数据
  36. ]]
  37. local function mode1_cb(tag)
  38. log.info("TAGmode1_cb+++++++++",tag)
  39. log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
  40. end
  41. local function mode2_cb(tag)
  42. log.info("TAGmode2_cb+++++++++",tag)
  43. log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
  44. end
  45. local function mode3_cb(tag)
  46. log.info("TAGmode3_cb+++++++++",tag)
  47. log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
  48. end
  49. local function gnss_fnc()
  50. local gnssotps={
  51. gnssmode=1, --1为卫星全定位,2为单北斗
  52. agps_enable=true, --是否使用AGPS,开启AGPS后定位速度更快,会访问服务器下载星历,星历时效性为北斗1小时,GPS4小时,默认下载星历的时间为1小时,即一小时内只会下载一次
  53. debug=true, --是否输出调试信息
  54. -- uart=2, --使用的串口,780EGH和8000默认串口2
  55. -- uartbaud=115200, --串口波特率,780EGH和8000默认115200
  56. -- bind=1, --绑定uart端口进行GNSS数据读取,是否设置串口转发,指定串口号
  57. -- rtc=false --定位成功后自动设置RTC true开启,flase关闭
  58. ----因为GNSS使用辅助定位的逻辑,是模块下载星历文件,然后把数据发送给GNSS芯片,
  59. ----芯片解析星历文件需要10-30s,默认GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,
  60. ----定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把auto_open设置成false
  61. ----需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理
  62. -- auto_open=false
  63. }
  64. --设置gnss参数
  65. exgnss.setup(gnssotps)
  66. --开启gnss应用
  67. exgnss.open(exgnss.TIMER,{tag="modeTimer",val=60,cb=mode1_cb}) --使用TIMER模式,开启60s后关闭
  68. exgnss.open(exgnss.DEFAULT,{tag="modeDefault",cb=mode2_cb}) --使用DEFAULT模式,开启后一直运行
  69. exgnss.open(exgnss.TIMERORSUC,{tag="modeTimerorsuc",val=60,cb=mode3_cb}) --使用TIMERORSUC模式,开启60s,如果定位成功,则直接关闭
  70. sys.wait(40000)
  71. log.info("关闭一个gnss应用,然后查看下所有应用的状态")
  72. --关闭一个gnss应用
  73. exgnss.close(exgnss.TIMER,{tag="modeTimer"})--关闭tag为modeTimer应用
  74. --查询3个gnss应用状态
  75. log.info("gnss应用状态1",exgnss.is_active(exgnss.TIMER,{tag="modeTimer"}))
  76. log.info("gnss应用状态2",exgnss.is_active(exgnss.DEFAULT,{tag="modeDefault"}))
  77. log.info("gnss应用状态3",exgnss.is_active(exgnss.TIMERORSUC,{tag="modeTimerorsuc"}))
  78. sys.wait(10000)
  79. --关闭所有gnss应用
  80. exgnss.close_all()
  81. --查询3个gnss应用状态
  82. log.info("gnss应用状态1",exgnss.is_active(exgnss.TIMER,{tag="modeTimer"}))
  83. log.info("gnss应用状态2",exgnss.is_active(exgnss.DEFAULT,{tag="modeDefault"}))
  84. log.info("gnss应用状态3",exgnss.is_active(exgnss.TIMERORSUC,{tag="modeTimerorsuc"}))
  85. --查询最后一次定位结果
  86. local loc= exgnss.last_loc()
  87. if loc then
  88. log.info("lastloc", loc.lat,loc.lng)
  89. end
  90. end
  91. sys.taskInit(gnss_fnc)
  92. --GNSS定位状态的消息处理函数:
  93. local function gnss_state(event, ticks)
  94. -- event取值有
  95. -- "FIXED":string类型 定位成功
  96. -- "LOSE": string类型 定位丢失
  97. -- "CLOSE": string类型 GNSS关闭,仅配合使用exgnss.lua有效
  98. -- ticks number类型 是事件发生的时间,一般可以忽略
  99. log.info("exgnss", "state", event)
  100. if event=="FIXED" then
  101. --获取rmc数据
  102. --json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位,本示例保留5位小数
  103. log.info("nmea", "rmc0", json.encode(exgnss.rmc(0),"5f"))
  104. end
  105. end
  106. sys.subscribe("GNSS_STATE",gnss_state)