Browse Source

update:修改了8000的gnss的demo

liszt123 1 month ago
parent
commit
7ccf449c9d

+ 3 - 3
module/Air8000/demo/gnss/combination/lowpower.lua → module/Air8000/demo/gnss/exgnss/combination/lowpower.lua

@@ -17,8 +17,8 @@ local function lowpower_cb(tag)
     log.info("nmea", "rmc", json.encode(exgnss.rmc(0)))
     local data=string.format('{"lat":%5f,"lng":%5f}', rmc.lat, rmc.lng)
     sys.publish("SEND_DATA_REQ", "gnsslowpower", data) --发送数据到服务器
-    pm.power(pm.WORK_MODE, 1)--进入低功耗模式
-    pm.power(pm.WORK_MODE,1,1)--wifi进入低功耗模式
+    -- pm.power(pm.WORK_MODE, 1)--进入低功耗模式
+    -- pm.power(pm.WORK_MODE,1,1)--wifi进入低功耗模式
 end
 
 local function lower_open()
@@ -40,7 +40,7 @@ local function gnss_fnc()
         ----芯片解析星历文件需要10-30s,默认GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,
         ----定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把auto_open设置成false
         ----需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理
-        auto_open=false 
+        -- auto_open=false 
     }
     exgnss.setup(gnssotps)  --配置GNSS参数
     exgnss.open(exgnss.TIMERORSUC,{tag="lowpower",val=60,cb=lowpower_cb}) --打开一个60s的TIMERORSUC应用,该模式定位成功关闭

+ 0 - 0
module/Air8000/demo/gnss/combination/main.lua → module/Air8000/demo/gnss/exgnss/combination/main.lua


+ 2 - 2
module/Air8000/demo/gnss/combination/normal.lua → module/Air8000/demo/gnss/exgnss/combination/normal.lua

@@ -39,8 +39,8 @@ local function gnss_fnc()
         -- auto_open=false 
     }
     exgnss.setup(gnssotps)  --配置GNSS参数
-    exgnss.open(exgnss.TIMERORSUC,{tag="normal",val=60,cb=normal_cb}) --打开一个60s的TIMERORSUC应用,该模式定位成功关闭
-    sys.timerLoopStart(normal_open,60000)       --每60s开启一次GNSS
+    exgnss.open(exgnss.TIMER,{tag="normal",val=30,cb=normal_cb}) --打开一个60s的TIMERORSUC应用,该模式定位成功关闭
+    -- sys.timerLoopStart(normal_open,60000)       --每60s开启一次GNSS
     
 end
 

+ 0 - 0
module/Air8000/demo/gnss/combination/psm.lua → module/Air8000/demo/gnss/exgnss/combination/psm.lua


+ 0 - 0
module/Air8000/demo/gnss/combination/readme.md → module/Air8000/demo/gnss/exgnss/combination/readme.md


+ 1 - 1
module/Air8000/demo/gnss/combination/tcp_client_main.lua → module/Air8000/demo/gnss/exgnss/combination/tcp_client_main.lua

@@ -24,7 +24,7 @@ local tcp_client_sender = require "tcp_client_sender"
 -- 点击 打开TCP 按钮,会创建一个TCP server
 -- 将server的地址和端口赋值给下面这两个变量
 local SERVER_ADDR = "112.125.89.8"
-local SERVER_PORT = 44333
+local SERVER_PORT = 32066
 
 -- tcp_client_main的任务名
 local TASK_NAME = tcp_client_sender.TASK_NAME

+ 0 - 0
module/Air8000/demo/gnss/combination/tcp_client_receiver.lua → module/Air8000/demo/gnss/exgnss/combination/tcp_client_receiver.lua


+ 0 - 0
module/Air8000/demo/gnss/combination/tcp_client_sender.lua → module/Air8000/demo/gnss/exgnss/combination/tcp_client_sender.lua


+ 0 - 0
module/Air8000/demo/gnss/combination/vibration.lua → module/Air8000/demo/gnss/exgnss/combination/vibration.lua


+ 0 - 0
module/Air8000/demo/gnss/single/gnss.lua → module/Air8000/demo/gnss/exgnss/single/gnss.lua


+ 0 - 0
module/Air8000/demo/gnss/single/main.lua → module/Air8000/demo/gnss/exgnss/single/main.lua


+ 0 - 0
module/Air8000/demo/gnss/single/readme.md → module/Air8000/demo/gnss/exgnss/single/readme.md


+ 180 - 0
module/Air8000/demo/gnss/libgnss/gnss.lua

@@ -0,0 +1,180 @@
+--[[
+@module  gnss
+@summary gnss应用测试功能模块
+@version 1.0
+@date    2025.07.27
+@author  李源龙
+@usage
+主要功能:
+1、开启gnss定位,使用agps辅助定位
+2、定位成功获取经纬度
+
+]]
+local lbsLoc2 = require("lbsLoc2")
+local gps_uart_id = 2
+
+local gnssmode=1
+
+
+local function agps()
+    if libgnss.isFix() then return end
+    local lat, lng
+    
+    -- 判断星历时间和下载星历   
+    while not socket.adapter(socket.dft()) do
+        log.warn("airlbs_multi_cells_wifi_func", "wait IP_READY", socket.dft())
+        -- 在此处阻塞等待默认网卡连接成功的消息"IP_READY"
+        -- 或者等待1秒超时退出阻塞等待状态;
+        -- 注意:此处的1000毫秒超时不要修改的更长;
+        -- 因为当使用exnetif.set_priority_order配置多个网卡连接外网的优先级时,会隐式的修改默认使用的网卡
+        -- 当exnetif.set_priority_order的调用时序和此处的socket.adapter(socket.dft())判断时序有可能不匹配
+        -- 此处的1秒,能够保证,即使时序不匹配,也能1秒钟退出阻塞状态,再去判断socket.adapter(socket.dft())
+        local result=sys.waitUntil("IP_READY", 30000)
+        if result == false then
+            log.warn("gnss_agps", "wait IP_READY timeout")
+            return
+        end
+    end
+    socket.sntp()
+    sys.waitUntil("NTP_UPDATE", 5000)
+    local now = os.time()
+    local agps_time = tonumber(io.readFile("/hxxt_tm") or "0") or 0
+    log.info("os.time",now)
+    log.info("agps_time",agps_time)
+    if now - agps_time > 3600 or io.fileSize("/hxxt.dat") < 1024 then
+        local url 
+
+        if gnssmode and 2 == gnssmode then
+            -- 单北斗
+            url = "http://download.openluat.com/9501-xingli/HXXT_BDS_AGNSS_DATA.dat"
+        else
+            url = "http://download.openluat.com/9501-xingli/HXXT_GPS_BDS_AGNSS_DATA.dat"
+        end
+        local code = http.request("GET", url, nil, nil, {dst="/hxxt.dat"}).wait()
+        if code and code == 200 then
+            log.info("exgnss.opts", "下载星历成功", url)
+            io.writeFile("/hxxt_tm", tostring(now))
+        else
+            log.info("exgnss.opts", "下载星历失败", code)
+        end
+    else
+        log.info("exgnss.opts", "星历不需要更新", now - agps_time)
+    end
+    --进行基站定位,给到gnss芯片一个大概的位置
+    if mobile then
+        lat, lng = lbsLoc2.request(5000)
+        -- local lat, lng, t = lbsLoc2.request(5000, "bs.openluat.com")
+        -- log.info("lbsLoc2", lat, lng)
+        if lat and lng then
+            lat = tonumber(lat)
+            lng = tonumber(lng)
+            log.info("lbsLoc2", lat, lng)
+            -- 转换单位
+            local lat_dd,lat_mm = math.modf(lat)
+            local lng_dd,lng_mm = math.modf(lng)
+            lat = lat_dd * 100 + lat_mm * 60
+            lng = lng_dd * 100 + lng_mm * 60
+        end
+    elseif wlan then
+        -- wlan.scan()
+        -- sys.waitUntil("WLAN_SCAN_DONE", 5000)
+    end
+    --获取基站定位失败则使用本地之前保存的位置
+    if not lat then
+        -- 获取最后的本地位置
+        local locStr = io.readFile("/hxxtloc")
+        if locStr then
+            local jdata = json.decode(locStr)
+            if jdata and jdata.lat then
+                lat = jdata.lat
+                lng = jdata.lng
+            end
+        end
+    end
+
+    -- 写入星历
+    local agps_data = io.readFile("/hxxt.dat")
+    if agps_data and #agps_data > 1024 then
+        log.info("exgnss.opts", "写入星历数据", "长度", #agps_data)
+        for offset=1,#agps_data,512 do
+            log.info("exgnss", "AGNSS", "write >>>", #agps_data:sub(offset, offset + 511))
+            uart.write(gps_uart_id, agps_data:sub(offset, offset + 511))
+            sys.wait(100) -- 等100ms反而更成功
+        end
+        -- uart.write(gps_uart_id, agps_data)
+    else
+        log.info("exgnss.opts", "没有星历数据")
+        return
+    end
+    -- "lat":23.4068813,"min":27,"valid":true,"day":27,"lng":113.2317505
+    --如果没有经纬度的话,定位时间会变长,大概10-20s左右
+    if not lat or not lng then
+        -- lat, lng = 23.4068813, 113.2317505
+        log.info("exgnss.opts", "没有GPS坐标", lat, lng)
+        return --暂时不写入参考位置
+    else
+        log.info("exgnss.opts", "写入GPS坐标", lat, lng)
+    end
+    --写入时间
+    local date = os.date("!*t")
+    if date.year > 2023 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("exgnss.opts", "参考时间", str)
+        uart.write(gps_uart_id, str .. "\r\n")
+        sys.wait(20)
+    end
+    -- 写入参考位置
+    local str = string.format("$AIDPOS,%.7f,%s,%.7f,%s,1.0\r\n",
+    lat > 0 and lat or (0 - lat), lat > 0 and 'N' or 'S',
+    lng > 0 and lng or (0 - lng), lng > 0 and 'E' or 'W')
+    log.info("exgnss.opts", "写入AGPS参考位置", str)
+    uart.write(gps_uart_id, str)
+
+end
+
+
+local function gnss_open()
+    log.info("GPS", "start")
+    libgnss.clear() -- 清空数据,兼初始化
+    --设置串口波特率
+    uart.setup(gps_uart_id, 115200)
+    -- 打开GPS
+    pm.power(pm.GPS, true)
+    -- 绑定uart,底层自动处理GNSS数据
+    -- 第二个参数是转发到虚拟UART, 方便上位机分析
+    libgnss.bind(gps_uart_id, uart.VUART_0)
+    sys.wait(200) -- GPNSS芯片启动需要时间
+    -- 调试日志,可选
+    libgnss.debug(true)
+
+    -- 增加显示的语句
+    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)
+    sys.taskInit(agps)
+
+end
+
+sys.taskInit(gnss_open)
+
+
+--GNSS定位状态的消息处理函数:
+local function gnss_state(event, ticks)
+    -- event取值有
+    -- "FIXED":string类型 定位成功
+    -- "LOSE": string类型 定位丢失
+
+    -- ticks number类型 是事件发生的时间,一般可以忽略
+    log.info("exgnss", "state", event)
+    if event=="FIXED" then
+        --获取rmc数据
+        --json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位,本示例保留5位小数
+        log.info("nmea", "rmc0", json.encode(libgnss.getRmc(0),"5f"))
+    end
+end
+
+sys.subscribe("GNSS_STATE",gnss_state)

+ 61 - 0
module/Air8000/demo/gnss/libgnss/main.lua

@@ -0,0 +1,61 @@
+
+--[[
+@module  main
+@summary LuatOS用户应用脚本文件入口,总体调度应用逻辑
+@version 1.0
+@date    2025.07.27
+@author  李源龙
+@usage
+本demo演示的功能为:
+使用Air8000整机开发板,通过exgnss.lua扩展库,开启GNSS定位,展示模块的三种应用状态
+]]
+
+--[[
+必须定义PROJECT和VERSION变量,Luatools工具会用到这两个变量,远程升级功能也会用到这两个变量
+PROJECT:项目名,ascii string类型
+        可以随便定义,只要不使用,就行
+VERSION:项目版本号,ascii string类型
+        如果使用合宙iot.openluat.com进行远程升级,必须按照"XXX.YYY.ZZZ"三段格式定义:
+            X、Y、Z各表示1位数字,三个X表示的数字可以相同,也可以不同,同理三个Y和三个Z表示的数字也是可以相同,可以不同
+            因为历史原因,YYY这三位数字必须存在,但是没有任何用处,可以一直写为000
+        如果不使用合宙iot.openluat.com进行远程升级,根据自己项目的需求,自定义格式即可
+]]
+PROJECT = "gnsstest"
+VERSION = "001.000.000"
+
+--添加硬狗防止程序卡死
+if wdt then
+    wdt.init(9000)--初始化watchdog设置为9s
+    sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
+end
+
+-- 如果内核固件支持errDump功能,此处进行配置,【强烈建议打开此处的注释】
+-- 因为此功能模块可以记录并且上传脚本在运行过程中出现的语法错误或者其他自定义的错误信息,可以初步分析一些设备运行异常的问题
+-- 以下代码是最基本的用法,更复杂的用法可以详细阅读API说明文档
+-- 启动errDump日志存储并且上传功能,600秒上传一次
+-- if errDump then
+--     errDump.config(true, 600)
+-- end
+
+
+-- 使用LuatOS开发的任何一个项目,都强烈建议使用远程升级FOTA功能
+-- 可以使用合宙的iot.openluat.com平台进行远程升级
+-- 也可以使用客户自己搭建的平台进行远程升级
+-- 远程升级的详细用法,可以参考fota的demo进行使用
+
+
+-- 启动一个循环定时器
+-- 每隔3秒钟打印一次总内存,实时的已使用内存,历史最高的已使用内存情况
+-- 方便分析内存使用是否有异常
+-- sys.timerLoopStart(function()
+--     log.info("mem.lua", rtos.meminfo())
+--     log.info("mem.sys", rtos.meminfo("sys"))
+-- end, 3000)
+
+require"gnss"
+
+
+-- 用户代码已结束---------------------------------------------
+-- 结尾总是这一句
+sys.run()
+-- sys.run()之后后面不要加任何语句!!!!!

+ 91 - 0
module/Air8000/demo/gnss/libgnss/readme.md

@@ -0,0 +1,91 @@
+
+## 演示功能概述
+
+使用Air8000整机开发板,利用libgnss核心库如何实现定位功能
+
+主要操作为:
+
+打开GNSS,使用AGPS辅助定位
+
+定位成功之后,获取经纬度信息
+
+## 演示硬件环境
+
+1、Air8000整机开发板一块
+
+2、TYPE-C USB数据线一根
+
+3、gnss天线一根
+
+4、Air8000整机开发板和数据线的硬件接线方式为
+
+- Air8000整机开发板通过TYPE-C USB口供电;(整机开发板的拨钮开关拨到USB供电)
+
+- TYPE-C USB数据线直接插到核心板的TYPE-C USB座子,另外一端连接电脑USB口;
+
+
+## 演示软件环境
+
+1、Luatools下载调试工具
+
+2、[Air8000 V2018版本固件](https://docs.openluat.com/air8000/luatos/firmware/)
+
+## 演示核心步骤
+
+1、搭建好硬件环境
+
+2、通过Luatools将demo与固件烧录到核心板中
+
+3、烧录好后,板子开机将会在Luatools上看到如下打印:
+
+(1) 开启GNSS应用:
+
+```lua
+[2025-08-13 17:30:59.548][000000000.449] I/user.全卫星开启
+[2025-08-13 17:30:59.587][000000000.449] I/user.debug开启
+[2025-08-13 17:30:59.633][000000000.449] D/gnss Debug ON
+[2025-08-13 17:30:59.697][000000000.449] I/user.agps开启
+[2025-08-13 17:30:59.779][000000000.450] W/user.gnss_agps wait IP_READY
+[2025-08-13 17:30:59.810][000000000.451] I/user.exgnss._open
+[2025-08-13 17:30:59.834][000000000.452] I/user.exgnss.open 1 modeDefault nil function: 0C7F7A20
+[2025-08-13 17:30:59.873][000000000.453] I/user.exgnss.open 2 modeTimerorsuc 60 function: 0C7FAFF0
+[2025-08-13 17:30:59.918][000000000.456] I/user.exgnss state OPEN
+
+```
+
+(2) GNSS定位成功:
+
+```lua
+[2025-08-13 17:31:05.314][000000008.890] I/gnss Fixed 344786478 1141919416
+[2025-08-13 17:31:05.331][000000008.892] I/user.exgnss state FIXED
+[2025-08-13 17:31:05.348][000000008.894] I/user.nmea rmc0 {"variation":0,"lat":3447.86475,"min":31,"valid":true,"day":13,"lng":11419.19336,"speed":0.01300,"year":2025,"month":8,"sec":4,"hour":9,"course":340.04800}
+[2025-08-13 17:31:05.361][000000008.894] I/user.exgnss.statInd@1 true 3 modeTimer 60 52 nil function: 0C7FB4B8
+[2025-08-13 17:31:05.369][000000008.895] I/user.exgnss.statInd@2 true 1 modeDefault nil nil nil function: 0C7F7A20
+[2025-08-13 17:31:05.387][000000008.896] I/user.exgnss.statInd@3 true 2 modeTimerorsuc 60 52 nil function: 0C7FAFF0
+[2025-08-13 17:31:05.401][000000008.896] I/user.exgnss.statInd@4 true 3 libagps 20 17 nil nil
+[2025-08-13 17:31:06.311][000000009.895] I/user.exgnss.timerFnc@1 3 modeTimer 60 52 nil
+[2025-08-13 17:31:06.324][000000009.896] I/user.exgnss.timerFnc@2 1 modeDefault nil nil 1
+[2025-08-13 17:31:06.329][000000009.896] I/user.TAGmode2_cb+++++++++ modeDefault
+[2025-08-13 17:31:06.335][000000009.897] I/user.nmea rmc {"variation":0,"lat":34.7977448,"min":31,"valid":true,"day":13,"lng":114.3199005,"speed":0.0130000,"year":2025,"month":8,"sec":4,"hour":9,"course":340.0480042}
+[2025-08-13 17:31:06.337][000000009.898] I/user.exgnss.timerFnc@3 2 modeTimerorsuc 60 52 1
+[2025-08-13 17:31:06.340][000000009.898] I/user.TAGmode3_cb+++++++++ modeTimerorsuc
+[2025-08-13 17:31:06.342][000000009.899] I/user.nmea rmc {"variation":0,"lat":34.7977448,"min":31,"valid":true,"day":13,"lng":114.3199005,"speed":0.0130000,"year":2025,"month":8,"sec":4,"hour":9,"course":340.0480042}
+[2025-08-13 17:31:06.344][000000009.900] I/user.exgnss.close 2 modeTimerorsuc 60 function: 0C7FAFF0
+[2025-08-13 17:31:06.349][000000009.900] I/user.exgnss.timerFnc@4 3 libagps 20 17 nil
+
+```
+3、到时间关闭所有应用:
+```lua
+[2025-08-13 17:31:46.861][000000050.455] I/user.exgnss.close 3 modeTimer 60 function: 0C7FB4B8
+[2025-08-13 17:31:46.876][000000050.455] I/user.TAGmode2_cb+++++++++ modeDefault
+[2025-08-13 17:31:46.892][000000050.456] I/user.nmea rmc {"variation":0,"lat":34.7977867,"min":31,"valid":true,"day":13,"lng":114.3198853,"speed":0,"year":2025,"month":8,"sec":46,"hour":9,"course":0}
+[2025-08-13 17:31:46.911][000000050.456] I/user.exgnss.close 1 modeDefault nil function: 0C7F7A20
+[2025-08-13 17:31:46.936][000000050.463] I/user.exgnss._close
+[2025-08-13 17:31:46.950][000000050.464] I/user.exgnss.close 2 modeTimerorsuc 60 function: 0C7FAFF0
+[2025-08-13 17:31:46.965][000000050.465] I/user.exgnss.close 3 libagps 20 nil
+[2025-08-13 17:31:46.982][000000050.465] I/user.gnss应用状态1
+[2025-08-13 17:31:46.997][000000050.465] I/user.gnss应用状态2
+[2025-08-13 17:31:47.013][000000050.466] I/user.gnss应用状态3
+[2025-08-13 17:31:47.027][000000050.469] I/user.lastloc 3447.8671900000 11419.193360000
+[2025-08-13 17:31:47.042][000000050.470] I/user.exgnss state CLOSE
+```

+ 0 - 0
module/Air8000/demo/gnss/readme.md