main.lua 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "gnss"
  3. VERSION = "1.0.0"
  4. --[[
  5. 本demo是演示定位数据处理的. script/turnkey目录有更完整的应用.
  6. 本demo需要V1103及以上的固件!!
  7. 注意: 室内无信号!! 无法定位!!! 到室外去, 起码天线要在室外.
  8. 窗口只有少许信号, 无法保证定位成功
  9. 这个demo需要的流量很多,可以注释这行
  10. sys.publish("mqtt_pub", "/gnss/" .. mobile.imei() .. "/up/nmea", data, 1)
  11. ]]
  12. -- sys库是标配
  13. local sys = require("sys")
  14. require("sysplus")
  15. local gps_uart_id = 2
  16. local mqttc = nil
  17. libgnss.clear() -- 清空数据,兼初始化
  18. uart.setup(gps_uart_id, 115200)
  19. function exec_agnss()
  20. if http then
  21. -- AGNSS 已调通
  22. while 1 do
  23. local code, headers, body = http.request("GET", "http://download.openluat.com/9501-xingli/HXXT_GPS_BDS_AGNSS_DATA.dat").wait()
  24. -- local code, headers, body = http.request("GET", "http://nutzam.com/6228.bin").wait()
  25. log.info("gnss", "AGNSS", code, body and #body or 0)
  26. if code == 200 and body and #body > 1024 then
  27. -- uart.write(gps_uart_id, "$reset,0,h01\r\n")
  28. -- sys.wait(200)
  29. -- uart.write(gps_uart_id, body)
  30. for offset=1,#body,512 do
  31. log.info("gnss", "AGNSS", "write >>>", #body:sub(offset, offset + 511))
  32. uart.write(gps_uart_id, body:sub(offset, offset + 511))
  33. -- sys.waitUntil("UART2_SEND", 100)
  34. sys.wait(100) -- 等100ms反而更成功
  35. end
  36. -- sys.waitUntil("UART2_SEND", 1000)
  37. io.writeFile("/6228.bin", body)
  38. break
  39. end
  40. sys.wait(60*1000)
  41. end
  42. end
  43. sys.wait(20)
  44. -- "$AIDTIME,year,month,day,hour,minute,second,millisecond"
  45. local date = os.date("!*t")
  46. if date.year > 2022 then
  47. local str = string.format("$AIDTIME,%d,%d,%d,%d,%d,%d,000",
  48. date["year"], date["month"], date["day"], date["hour"], date["min"], date["sec"])
  49. log.info("gnss", str)
  50. uart.write(gps_uart_id, str .. "\r\n")
  51. sys.wait(20)
  52. end
  53. -- 读取之前的位置信息
  54. local gnssloc = io.readFile("/gnssloc")
  55. if gnssloc then
  56. str = "$AIDPOS," .. gnssloc
  57. log.info("POS", str)
  58. uart.write(gps_uart_id, str .. "\r\n")
  59. str = nil
  60. gnssloc = nil
  61. else
  62. -- TODO 发起基站定位
  63. uart.write(gps_uart_id, "$AIDPOS,3432.70,N,10885.25,E,1.0\r\n")
  64. end
  65. end
  66. function upload_stat()
  67. if mqttc == nil or not mqttc:ready() then return end
  68. local stat = {
  69. csq = mobile.csq(),
  70. rssi = mobile.rssi(),
  71. rsrq = mobile.rsrq(),
  72. rsrp = mobile.rsrp(),
  73. --iccid = mobile.iccid(),
  74. snr = mobile.snr()
  75. }
  76. sys.publish("mqtt_pub", "/gnss/" .. mobile.imei() .. "/up/stat", (json.encode(stat)), 1)
  77. end
  78. sys.timerLoopStart(upload_stat, 60*1000)
  79. sys.taskInit(function()
  80. -- Air780EG工程样品的GPS的默认波特率是9600, 量产版是115200,以下是临时代码
  81. log.info("GPS", "start")
  82. pm.power(pm.GPS, true)
  83. -- 绑定uart,底层自动处理GNSS数据
  84. -- 第二个参数是转发到虚拟UART, 方便上位机分析
  85. libgnss.bind(gps_uart_id, uart.VUART_0)
  86. libgnss.on("raw", function(data)
  87. -- 默认不上报, 需要的话自行打开
  88. data = data:split("\r\n")
  89. if data == nil then
  90. return
  91. end
  92. for k, v in pairs(data) do
  93. if v and v:startsWith("$GNRMC") then
  94. sys.publish("mqtt_pub", "/gnss/" .. mobile.imei() .. "/up/nmea", v, 0)
  95. end
  96. end
  97. end)
  98. sys.wait(200) -- GPNSS芯片启动需要时间
  99. -- 调试日志,可选
  100. libgnss.debug(true)
  101. -- 显示串口配置
  102. -- uart.write(gps_uart_id, "$CFGPRT,1\r\n")
  103. -- sys.wait(20)
  104. -- 增加显示的语句
  105. uart.write(gps_uart_id, "$CFGMSG,0,1,1\r\n") -- GLL
  106. sys.wait(20)
  107. uart.write(gps_uart_id, "$CFGMSG,0,5,1\r\n") -- VTG
  108. sys.wait(20)
  109. uart.write(gps_uart_id, "$CFGMSG,0,6,1\r\n") -- ZDA
  110. sys.wait(20)
  111. -- 定位成功后,使用GNSS时间设置RTC, 暂不可用
  112. -- libgnss.rtcAuto(true)
  113. exec_agnss()
  114. end)
  115. sys.taskInit(function()
  116. while 1 do
  117. sys.wait(5000)
  118. -- 6228CI, 查询产品信息, 可选
  119. -- uart.write(gps_uart_id, "$PDTINFO,*62\r\n")
  120. -- uart.write(gps_uart_id, "$AIDINFO\r\n")
  121. -- sys.wait(100)
  122. -- uart.write(gps_uart_id, "$CFGSYS\r\n")
  123. -- uart.write(gps_uart_id, "$CFGMSG,6,4\r\n")
  124. log.info("RMC", json.encode(libgnss.getRmc(2) or {}))
  125. -- log.info("GGA", libgnss.getGga(3))
  126. -- log.info("GLL", json.encode(libgnss.getGll(2) or {}))
  127. -- log.info("GSA", json.encode(libgnss.getGsa(2) or {}))
  128. -- log.info("GSV", json.encode(libgnss.getGsv(2) or {}))
  129. -- log.info("VTG", json.encode(libgnss.getVtg(2) or {}))
  130. -- log.info("ZDA", json.encode(libgnss.getZda(2) or {}))
  131. -- log.info("date", os.date())
  132. log.info("sys", rtos.meminfo("sys"))
  133. log.info("lua", rtos.meminfo("lua"))
  134. end
  135. end)
  136. -- 订阅GNSS状态编码
  137. sys.subscribe("GNSS_STATE", function(event, ticks)
  138. -- event取值有
  139. -- FIXED 定位成功
  140. -- LOSE 定位丢失
  141. -- ticks是事件发生的时间,一般可以忽略
  142. log.info("gnss", "state", event, ticks)
  143. if event == "FIXED" then
  144. local locStr = libgnss.locStr()
  145. log.info("gnss", "locStr", locStr)
  146. if locStr then
  147. io.writeFile("/gnssloc", locStr)
  148. end
  149. end
  150. end)
  151. -- mqtt 上传任务
  152. sys.taskInit(function()
  153. sys.waitUntil("IP_READY", 15000)
  154. mqttc = mqtt.create(nil, "lbsmqtt.airm2m.com", 1886) --mqtt客户端创建
  155. mqttc:auth(mobile.imei(), mobile.imei(), mobile.muid()) --mqtt三元组配置
  156. log.info("mqtt", mobile.imei(), mobile.imei(), mobile.muid())
  157. mqttc:keepalive(30) -- 默认值240s
  158. mqttc:autoreconn(true, 3000) -- 自动重连机制
  159. mqttc:on(function(mqtt_client, event, data, payload) --mqtt回调注册
  160. -- 用户自定义代码,按event处理
  161. --log.info("mqtt", "event", event, mqtt_client, data, payload)
  162. if event == "conack" then -- mqtt成功完成鉴权后的消息
  163. sys.publish("mqtt_conack") -- 小写字母的topic均为自定义topic
  164. -- 订阅不是必须的,但一般会有
  165. mqtt_client:subscribe("/gnss/" .. mobile.imei() .. "/down/#")
  166. elseif event == "recv" then -- 服务器下发的数据
  167. log.info("mqtt", "downlink", "topic", data, "payload", payload)
  168. -- 这里继续加自定义的业务处理逻辑
  169. elseif event == "sent" then -- publish成功后的事件
  170. log.info("mqtt", "sent", "pkgid", data)
  171. end
  172. end)
  173. -- 发起连接之后,mqtt库会自动维护链接,若连接断开,默认会自动重连
  174. mqttc:connect()
  175. sys.waitUntil("mqtt_conack")
  176. log.info("mqtt连接成功")
  177. sys.timerStart(upload_stat, 1000) -- 一秒后主动上传一次
  178. while true do
  179. -- 业务演示。等待其他task发过来的待上报数据
  180. -- 这里的mqtt_pub字符串是自定义的,与mqtt库没有直接联系
  181. -- 若不需要异步关闭mqtt链接,while内的代码可以替换成sys.wait(30000)
  182. local ret, topic, data, qos = sys.waitUntil("mqtt_pub", 30000)
  183. if ret then
  184. if topic == "close" then break end
  185. log.info("mqtt", "publish", "topic", topic)
  186. mqttc:publish(topic, data, qos)
  187. end
  188. end
  189. mqttc:close()
  190. mqttc = nil
  191. end)
  192. sys.taskInit(function()
  193. while 1 do
  194. sys.wait(3600*1000) -- 一小时检查一次
  195. local fixed, time_fixed = libgnss.isFix()
  196. if not fixed then
  197. exec_agnss()
  198. end
  199. end
  200. end)
  201. sys.timerLoopStart(function()
  202. upload_stat()
  203. end, 60000)
  204. -- sys.subscribe("NTP_UPDATE", function()
  205. -- if not libgnss.isFix() then
  206. -- -- "$AIDTIME,year,month,day,hour,minute,second,millisecond"
  207. -- local date = os.date("!*t")
  208. -- local str = string.format("$AIDTIME,%d,%d,%d,%d,%d,%d,000",
  209. -- date["year"], date["month"], date["day"], date["hour"], date["min"], date["sec"])
  210. -- log.info("gnss", str)
  211. -- uart.write(gps_uart_id, str .. "\r\n")
  212. -- end
  213. -- end)
  214. -- if socket and socket.sntp then
  215. -- sys.subscribe("IP_READY", function()
  216. -- socket.sntp()
  217. -- end)
  218. -- end
  219. -- 用户代码已结束---------------------------------------------
  220. -- 结尾总是这一句
  221. sys.run()
  222. -- sys.run()之后后面不要加任何语句!!!!!