| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209 |
- -- LuaTools需要PROJECT和VERSION这两个信息
- PROJECT = "irtu_gnss"
- VERSION = "1.0.1"
- --[[
- 这个demo名字含irtu,实际上没有使用iRTU.
- 网站是: https://gps.nutz.cn/ 连上之后,输入IMEI并回车,就能看到当前坐标
- 小程序的名字: iRTU寻物 打开后扫码模块上的二维码,就能显示当前位置和历史轨迹
- 服务器源码: https://gitee.com/wendal/irtu-gps 里面的硬件和配置描述是Air800的,可以无视.
- 本demo需要Air780EG及V1003固件, 2023-1-11之后编译的版本
- 所需要的库文件,在 script/libs里面, 全部加入就可以了
- ]]
- -- sys库是标配
- local sys = require("sys")
- local sysplus = require("sysplus")
- local libnet = require("libnet")
- local gps_uart_id = 2
- -- libgnss库初始化
- libgnss.clear() -- 清空数据,兼初始化
- -- GNSS串口初始化
- uart.setup(gps_uart_id, 115200)
- function exec_agnss()
- local url = "http://download.openluat.com/9501-xingli/HXXT_GPS_BDS_AGNSS_DATA.dat"
- if http then
- -- AGNSS 已调通
- while 1 do
- local code, headers, body = http.request("GET", url).wait()
- log.info("gnss", "AGNSS", code, body and #body or 0)
- if code == 200 and body and #body > 1024 then
- for offset = 1, #body, 512 do
- log.info("gnss", "AGNSS", "write >>>", #body:sub(offset, offset + 511))
- uart.write(gps_uart_id, body:sub(offset, offset + 511))
- sys.wait(100) -- 等100ms反而更成功
- end
- -- sys.waitUntil("UART2_SEND", 1000)
- io.writeFile("/6228.bin", body)
- break
- end
- sys.wait(60 * 1000)
- end
- end
- sys.wait(20)
- -- "$AIDTIME,year,month,day,hour,minute,second,millisecond"
- local date = os.date("!*t")
- if date.year > 2022 then
- local str = string.format("$AIDTIME,%d,%d,%d,%d,%d,%d,000", date["year"], date["month"], date["day"],
- date["hour"], date["min"], date["sec"])
- log.info("gnss", str)
- uart.write(gps_uart_id, str .. "\r\n")
- sys.wait(20)
- end
- -- 读取之前的位置信息
- local gnssloc = io.readFile("/gnssloc")
- if gnssloc then
- str = "$AIDPOS," .. gnssloc
- log.info("POS", str)
- uart.write(gps_uart_id, str .. "\r\n")
- str = nil
- gnssloc = nil
- else
- uart.write(gps_uart_id, "$AIDPOS,3432.70,N,10885.25,E,1.0\r\n")
- end
- end
- sys.taskInit(function()
- -- Air780EG默认波特率是115200
- log.info("GPS", "start")
- pm.power(pm.GPS, true)
- -- 调试日志,可选
- libgnss.debug(true)
- sys.wait(200) -- GPNSS芯片启动需要时间,大概150ms
- -- 增加显示的语句,可选
- uart.write(gps_uart_id, "$CFGMSG,0,1,1\r\n") -- GLL
- sys.wait(20)
- uart.write(gps_uart_id, "$CFGMSG,0,5,1\r\n") -- VTG
- sys.wait(20)
- uart.write(gps_uart_id, "$CFGMSG,0,6,1\r\n") -- ZDA
- sys.wait(20)
- -- 定位成功后,使用GNSS时间设置RTC
- libgnss.rtcAuto(true)
-
- -- 绑定uart,底层自动处理GNSS数据
- libgnss.bind(gps_uart_id)
- exec_agnss()
- end)
- -- 单纯定时打印一下定位信息
- sys.taskInit(function()
- while 1 do
- sys.wait(5000)
- log.info("RMC", json.encode(libgnss.getRmc(4) or {}))
- end
- end)
- -- 订阅GNSS状态编码
- sys.subscribe("GNSS_STATE", function(event, ticks)
- -- event取值有
- -- FIXED 定位成功
- -- LOSE 定位丢失
- -- ticks是事件发生的时间,一般可以忽略
- log.info("gnss", "state", event, ticks)
- if event == "FIXED" then
- local locStr = libgnss.locStr()
- log.info("gnss", "locStr", locStr)
- if locStr then
- -- 存入文件,方便下次AGNSS快速定位
- io.writeFile("/gnssloc", locStr)
- end
- end
- end)
- -- 对接服务器
- local taskName = "gnsstask"
- function gnsstask()
- local tx_buff = zbuff.create(1024)
- local rx_buff = zbuff.create(1024)
- local netc
- local result, param, succ
- local host, port = "gps.nutz.cn", 19002
- local netc = socket.create(nil, taskName)
- -- socket.debug(netc, true)
- socket.config(netc, nil, nil, nil)
- while 1 do
- result = libnet.waitLink(taskName, 0, netc)
- result = libnet.connect(taskName, 15000, netc, host, port)
- local jdata = {
- imei = mobile.imei(),
- iccid = mobile.iccid()
- }
- if result then
- local data = json.encode(jdata)
- log.info("服务器连上了", "上报注册注册信息", data)
- libnet.tx(taskName, 0, netc, data)
- end
- while result do
- succ, param = socket.rx(netc, rx_buff)
- if not succ then
- log.info("服务器断开了", succ, param, host, port)
- break
- end
- if rx_buff:used() > 0 then
- log.info("收到服务器数据,长度", rx_buff:used())
- rx_buff:del()
- end
- if rx_buff:len() > 1024 then
- rx_buff:resize(1024)
- end
- log.info("sys", rtos.meminfo("sys"))
- result, param = libnet.wait(taskName, 1000, netc)
- if not result then
- log.info("服务器断开了", result, param)
- break
- end
- -- 发送数据包
- local msg = {libgnss.isFix(), os.time()}
- local rmc = libgnss.getRmc(1)
- local gsa = libgnss.getGsa()
- local vtg = libgnss.getVtg()
- table.insert(msg, rmc.lng)
- table.insert(msg, rmc.lat)
- local gll = libgnss.getGll()
- table.insert(msg, 0) -- altitude
- table.insert(msg, 0) -- azimuth
- table.insert(msg, (vtg and vtg.speed_kph) and vtg.speed_kph or 0) -- speed
- table.insert(msg, 0) -- sateCno
- table.insert(msg, 0) -- sateCnt
- --jdata.msg = msg
- local data = json.encode({msg=msg})
- log.info("report", data)
- if data then
- libnet.tx(taskName, 0, netc, data)
- end
- end
- d1Online = false
- libnet.close(taskName, 5000, netc)
- log.info("sys", rtos.meminfo("sys"))
- sys.wait(1000)
- end
- end
- local function netCB(msg)
- log.info("未处理消息", msg[1], msg[2], msg[3], msg[4])
- end
- sysplus.taskInitEx(gnsstask, "gnsstask", netCB)
- sys.taskInit(function()
- while 1 do
- sys.wait(3600 * 1000) -- 一小时检查一次
- local fixed, time_fixed = libgnss.isFix()
- if not fixed then
- exec_agnss()
- end
- end
- end)
- -- 用户代码已结束---------------------------------------------
- -- 结尾总是这一句
- sys.run()
- -- sys.run()之后后面不要加任何语句!!!!!
|