跳转至

exgnss - NMEA数据处理

作者:李源龙

一、概述

当前使用libgnss核心库去实现gnss应用会比较麻烦,需要自己先去设置串口号,然后打开gnss电源,然后设置绑定串口2,再然后需要打开debug功能,还要去自己调用agps的接口,自己设置步骤太繁琐,而且有些指令不知道到底要不要去操作,所以LuatOS新增了exgnss扩展库,简化了gnss的使用。exgnss扩展库是对libgnss核心库的封装,使用起来更加简单。

libgnss核心库和exgnss扩展库的区别如下:

区别项 libgnss核心库 exgnss扩展库
打开方式 需要自己先去设置串口号,然后打开gnss电源,然后设置绑定串口2,再然后需要打开debug功能,还要去自己调用agps的接口 用exgnss.setup设置,然后用exgnss.open操作
应用场景 需要自己去用定时器开启,定时器关闭,或者定位成功再去手动调用关闭电源去操作 提供三种比较经典的应用场景

本篇文章仅介绍exgnss扩展库,如果需要了解libgnss核心库,请 点击此处

二、核心示例

exgnss=require("exgnss")  

local function mode1_cb(tag)
    log.info("TAGmode1_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

local function mode2_cb(tag)
    log.info("TAGmode2_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

local function mode3_cb(tag)
    log.info("TAGmode3_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

local function gnss_fnc()
    local gnssotps={
        gnssmode=1, --1为卫星全定位,2为单北斗
        agps_enable=true,    --是否使用AGPS,开启AGPS后定位速度更快,会访问服务器下载星历,星历时效性为北斗1小时,GPS4小时,默认下载星历的时间为1小时,即一小时内只会下载一次
        debug=true,    --是否输出调试信息
        -- uart=2,    --使用的串口,780EGH和8000默认串口2
        -- uartbaud=115200,    --串口波特率,780EGH和8000默认115200
        -- bind=1, --绑定uart端口进行GNSS数据读取,是否设置串口转发,指定串口号
        -- rtc=false    --定位成功后自动设置RTC true开启,flase关闭
         ----因为GNSS使用辅助定位的逻辑,是模块下载星历文件,然后把数据发送给GNSS芯片,
        ----芯片解析星历文件需要10-30s,默认GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,
        ----定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把auto_open设置成false
        ----需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理
        -- auto_open=false 
    }
    --设置gnss参数
    exgnss.setup(gnssotps)
    --开启gnss应用
    exgnss.open(exgnss.TIMER,{tag="modeTimer",val=60,cb=mode1_cb})  --使用TIMER模式,开启60s后关闭
    exgnss.open(exgnss.DEFAULT,{tag="modeDefault",cb=mode2_cb}) --使用DEFAULT模式,开启后一直运行  
    exgnss.open(exgnss.TIMERORSUC,{tag="modeTimerorsuc",val=60,cb=mode3_cb})    --使用TIMERORSUC模式,开启60s,如果定位成功,则直接关闭
    sys.wait(40000)
    log.info("关闭一个gnss应用,然后查看下所有应用的状态")
    --关闭一个gnss应用
    exgnss.close(exgnss.TIMER,{tag="modeTimer"})--关闭tag为modeTimer应用
    --查询3个gnss应用状态
    log.info("gnss应用状态1",exgnss.is_active(exgnss.TIMER,{tag="modeTimer"}))
    log.info("gnss应用状态2",exgnss.is_active(exgnss.DEFAULT,{tag="modeDefault"}))
    log.info("gnss应用状态3",exgnss.is_active(exgnss.TIMERORSUC,{tag="modeTimerorsuc"}))
    sys.wait(10000)
    --关闭所有gnss应用
    exgnss.close_all()
    --查询3个gnss应用状态
    log.info("gnss应用状态1",exgnss.is_active(exgnss.TIMER,{tag="modeTimer"}))
    log.info("gnss应用状态2",exgnss.is_active(exgnss.DEFAULT,{tag="modeDefault"}))
    log.info("gnss应用状态3",exgnss.is_active(exgnss.TIMERORSUC,{tag="modeTimerorsuc"}))
    --查询最后一次定位结果
    local loc= exgnss.last_loc()
    if loc then
        log.info("lastloc", loc.lat,loc.lng)
    end
end

sys.taskInit(gnss_fnc)


--GNSS定位状态的消息处理函数:
local function gnss_state(event, ticks)
    -- event取值有
    -- "FIXED":string类型 定位成功
    -- "LOSE": string类型 定位丢失
    -- "CLOSE": string类型 GNSS关闭,仅配合使用exgnss.lua有效

    -- ticks number类型 是事件发生的时间,一般可以忽略
    log.info("exgnss", "state", event)
    if event=="FIXED" then
        --获取rmc数据
        --json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位,本示例保留5位小数
        log.info("nmea", "rmc0", json.encode(exgnss.rmc(0),"5f"))
    end
end
sys.subscribe("GNSS_STATE",gnss_state)

三、常量详解

核心库常量,顾名思义是由合宙LuatOS内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

exgnss.DEFAULT

常量含义:exgnss应用模式1,常开模式;
数据类型:number
取值范围:1
示例代码:--- exgnss应用模式1.
        -- 打开gnss后,gnss定位成功时,如果有回调函数,会调用回调函数
        -- 使用此应用模式调用exgnss.open打开的“gnss应用”,必须主动调用exgnss.close
        -- 或者exgnss.close_all才能关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
        -- 通俗点说就是一直打开,除非自己手动关闭掉
        local function mode1_cb(tag)
            log.info("TAGmode1_cb+++++++++",tag)
            log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
        end
        exgnss.open(exgnss.DEFAULT,{tag="MODE2",cb=mode1_cb})

exgnss.TIMERORSUC

常量含义:exgnss应用模式2,限制开启时间,定位成功关闭;
数据类型:number
取值范围:2
示例代码:--- exgnss应用模式2.
        -- 打开gnss后,如果在gnss开启最大时长到达时,没有定位成功,如果有回调函数,
        -- 会调用回调函数,然后自动关闭此“gnss应用”
        -- 打开gnss后,如果在gnss开启最大时长内,定位成功,如果有回调函数,
        -- 会调用回调函数,然后自动关闭此“gnss应用”
        -- 打开gnss后,在自动关闭此“gnss应用”前,可以调用exgnss.close或者
        -- exgnss.close_all主动关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
        -- 通俗点说就是设置规定时间打开,如果规定时间内定位成功就会自动关闭此应用,
        -- 如果没有定位成功,时间到了也会自动关闭此应用
        local function mode2_cb(tag)
            log.info("TAGmode2_cb+++++++++",tag)
            log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
        end
        exgnss.open(exgnss.TIMERORSUC,{tag="MODE3",val=60,cb=mode2_cb})

exgnss.TIMER

常量含义:exgnss应用模式3,限制开启时间;
数据类型:number
取值范围:3
示例代码:--- exgnss应用模式3.
        -- 打开gnss后,在gnss开启最大时长时间到达时,无论是否定位成功,如果有回调函数,
        -- 会调用回调函数,然后自动关闭此“gnss应用”
        -- 打开gnss后,在自动关闭此“gnss应用”前,可以调用exgnss.close或者exgnss.close_all
        -- 主动关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
        -- 通俗点说就是设置规定时间打开,无论是否定位成功,到了时间都会自动关闭此应用,
        -- 和第二种的区别在于定位成功之后不会自动关闭,到时间之后才会自动关闭
        local function mode3_cb(tag)
            log.info("TAGmode3_cb+++++++++",tag)
            log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
        end
        exgnss.open(exgnss.TIMER,{tag="MODE1",val=60,cb=mode3_cb})

定位成功、定位丢失,gnss关闭的消息处理机制:

主要是利用lua本身的sys.subscribe机制,订阅"GNSS_STATE"消息,当gnss状态发生变化时,会自动调用回调函数

--GNSS定位状态的消息处理函数:
local function gnss_state(event, ticks)
    -- event取值有
    -- "FIXED":string类型 定位成功
    -- "LOSE": string类型 定位丢失
    -- "CLOSE": string类型 GNSS关闭,仅配合使用exgnss.lua有效

    -- ticks number类型 是事件发生的时间,一般可以忽略
    log.info("exgnss", "state", event)
    if event=="FIXED" then
        --获取rmc数据
        --json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位,本示例保留5位小数
        log.info("nmea", "rmc0", json.encode(exgnss.rmc(0),"5f"))
    end
end
sys.subscribe("GNSS_STATE",gnss_state)

四、函数详解

exgnss.setup(opts)

功能

设置gnss定位参数

注意事项

需要在exgnss.open之前调用

参数

opts

参数含义:表示gnss定位参数
数据类型:table类型
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:作为必需参数,若不提供会导致错误;
参数示例:{
            -- 参数含义:定位卫星模式;
            -- 数据类型:number;
            -- 取值范围:1为卫星全定位,2为单北斗;
            -- 是否必选:是;
            -- 注意事项:无;
            -- 参数示例:gnssmode=1;
            gnssmode

            -- 参数含义:是否使用AGPS;
            -- 数据类型:boolean;
            -- 取值范围:true/false;
            -- 是否必选:否;
            -- 注意事项:开启AGPS后定位速度更快,会访问服务器下载星历,星历时效性为北斗 1小时,GPS4小时,默认下载星历的时间为1小时,即一小时内只会下载一次,true为启用,false为不启用,默认为false;
            -- 参数示例:agps_enable = true;
            agps_enable

            -- 参数含义:是否输出原始NMEA调试信息到luatools;
            -- 数据类型:boolean;
            -- 取值范围:true/false;
            -- 是否必选:否;
            -- 注意事项:默认false;
            -- 参数示例:debug = true;
            debug

            -- 参数含义:GNSS串口配置;
            -- 数据类型:number;
            -- 取值范围:根据硬件串口号选择,780EGH和8000默认为uart2,可不填;
            -- 是否必选:否;
            -- 注意事项:无;
            -- 参数示例:uart = 2;
            uart

            -- 参数含义:GNSS串口波特率;
            -- 数据类型:number;
            -- 取值范围:780EGH和8000默认为115200,可不填;
            -- 是否必选:否;
            -- 注意事项:无;
            -- 参数示例:uartbaud = 115200;
            uartbaud

            -- 参数含义:绑定uart端口进行GNSS数据读取,设置串口转发;
            -- 数据类型:number;
            -- 取值范围:根据硬件串口号选择;
            -- 是否必选:否;
            -- 注意事项:无;
            -- 参数示例:bind = 1;
            bind

            -- 参数含义:定位成功后自动设置RTC;
            -- 数据类型:boolean;
            -- 取值范围:true/false,默认false;
            -- 是否必选:否;
            -- 注意事项:无;
            -- 参数示例:rtc = true;
            rtc

            -- 参数含义:是否开启agps辅助定位的时候,开启20s的gnss应用;
            -- 数据类型:boolean;
            -- 取值范围:true/false,默认true;
            -- 是否必选:否;
            -- 注意事项:因为GNSS使用辅助定位的逻辑,是模块下载星历文件,然后把下载的星历文件数据发送给GNSS芯片,芯片解析星历文件数据需要10-30s,如果打开辅助定位,默认lib库GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把auto_open设置成false需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理;
            -- 参数示例:auto_open = false;
            auto_open
         }

返回值

该接口无返回值,只需调用该接口执行相关操作,无需处理返回结果;

如果一定要把接口调用的结果赋值给一个变量,则这个变量就是一个nil值;

示例

local gnssotps={
    gnssmode=1, --1为卫星全定位,2为单北斗
    agps_enable=true,    --是否使用AGPS,开启AGPS后定位速度更快,会访问服务器下载星历,星历时效性为北斗1小时,GPS4小时,默认下载星历的时间为1小时,即一小时内只会下载一次
    debug=true,    --是否输出调试信息
    -- uart=2,    --使用的串口,780EGH和8000默认串口2
    -- uartbaud=115200,    --串口波特率,780EGH和8000默认115200
    -- bind=1, --绑定uart端口进行GNSS数据读取,是否设置串口转发,指定串口号
    -- rtc=false    --定位成功后自动设置RTC true开启,flase关闭
    ----因为GNSS使用辅助定位的逻辑,是模块下载星历文件,然后把下载的星历文件数据发送给GNSS芯片,
    ----芯片解析星历文件数据需要10-30s,如果打开辅助定位,默认lib库GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,
    ----定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把auto_open设置成false
    ----需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理
    -- auto_open=false 
}
    exgnss.setup(gnssotps)

exgnss.open(mode,para)

功能

打开一个“gnss应用”

注意事项

调用之前,必须先调用exgnss.setup()接口进行相关配置;

参数

mode

参数含义:gnss应用模式
数据类型:number
取值范围:支持exgnss.DEFAULTexgnss.TIMERORSUCexgnss.TIMER三种模式
是否必选:是;
注意事项:作为必需参数,若不提供会导致错误;
参数示例:exgnss.DEFAULT

para

参数含义:gnss应用参数
数据类型:table类型
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:作为必需参数,若不提供会导致错误;
参数示例:{
            -- 参数含义:gnss应用标记;
            -- 数据类型:string;
            -- 取值范围:无特别限制;
            -- 是否必选:是;
            -- 注意事项:无;
            -- 参数示例:tag = "MODE1";
            tag

            -- 参数含义:gnss应用开启最大时长;
            -- 数据类型:number,单位:秒;
            -- 取值范围:无特别限制;
            -- 是否必选:否;
            -- 注意事项:mode参数为gnss.TIMERORSUC或者gnss.TIMER时,此值才有意义;使用close接口时,不需要传入此参数;
            -- 参数示例:例如:val = 60;
            val

            -- 参数含义:gnss应用结束时的回调函数;
            -- 数据类型:function;
            -- 取值范围:无特别限制;
            -- 是否必选:否;
            -- 注意事项:使用close接口时,不需要传入此参数;
            -- 参数示例:
            --  local function mode_cb(tag)
            --     log.info("TAGmode3_cb+++++++++",tag)
            --     log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
            --  end
            -- cb=mode_cb;
            cb
         }

返回值

示例

local function mode1_cb(tag)
    log.info("TAGmode1_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

local function mode2_cb(tag)
    log.info("TAGmode2_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

local function mode3_cb(tag)
    log.info("TAGmode3_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

exgnss.open(exgnss.TIMER,{tag="MODE1",val=60,cb=mode1_cb})
exgnss.open(exgnss.DEFAULT,{tag="MODE2",cb=mode2_cb})
exgnss.open(exgnss.TIMERORSUC,{tag="MODE3",val=60,cb=mode3_cb})

exgnss.close(mode,para)

功能

关闭一个“gnss应用”

注意事项

只是从逻辑上关闭一个gnss应用,并不一定真正关闭gnss,是有所有的gnss应用都处于关闭状态,才会去真正关闭gnss

参数

mode

参数含义:gnss应用模式
数据类型:number
取值范围:支持exgnss.DEFAULTexgnss.TIMERORSUCexgnss.TIMER三种模式
是否必选:是;
注意事项:作为必需参数,若不提供会导致错误;
示例代码:exgnss.DEFAULT

para

参数含义:gnss应用参数
数据类型:table类型
取值范围:无特别限制;
是否必选:必须传入此参数;
注意事项:作为必需参数,若不提供会导致错误;
参数示例:{
            -- 参数含义:gnss应用标记;
            -- 数据类型:string;
            -- 取值范围:无特别限制;
            -- 是否必选:是;
            -- 注意事项:无;
            -- 参数示例:tag = "MODE1";
            tag
         }

返回值

示例

local function mode1_cb(tag)
    log.info("TAGmode1_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

exgnss.open(exgnss.TIMER,{tag="MODE1",val=60,cb=mode1_cb})
exgnss.close(exgnss.TIMER,{tag="MODE1"})

gnss.close_all()

功能

关闭所有“gnss应用”

注意事项

暂无

参数

返回值

示例

local function mode1_cb(tag)
    log.info("TAGmode1_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

local function mode2_cb(tag)
    log.info("TAGmode2_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

local function mode3_cb(tag)
    log.info("TAGmode3_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

exgnss.open(exgnss.TIMER,{tag="MODE1",val=60,cb=mode1_cb})
exgnss.open(exgnss.DEFAULT,{tag="MODE2",cb=mode2_cb})
exgnss.open(exgnss.TIMERORSUC,{tag="MODE3",val=60,cb=mode3_cb})

exgnss.close_all()

exgnss.is_active(mode,para)

功能

判断一个“gnss应用”是否处于激活状态

注意事项

处于激活状态返回true,否则返回nil

参数

mode

参数含义:gnss应用模式
数据类型:number
取值范围:支持exgnss.DEFAULTexgnss.TIMERORSUCexgnss.TIMER三种模式
是否必选:是;
注意事项:作为必需参数,若不提供会导致错误;
示例代码:exgnss.DEFAULT

para

参数含义:gnss应用参数
数据类型:table类型
取值范围:无特别限制;
是否必选:是;
注意事项:作为必需参数,若不提供会导致错误;
参数示例:{
            -- 参数含义:gnss应用标记;
            -- 数据类型:string;
            -- 取值范围:无特别限制;
            -- 是否必选:是;
            -- 注意事项:无;
            -- 参数示例:tag = "MODE1";
            tag
         }

返回值

示例

local function mode1_cb(tag)
    log.info("TAGmode1_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

local function mode2_cb(tag)
    log.info("TAGmode2_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end

local function mode3_cb(tag)
    log.info("TAGmode3_cb+++++++++",tag)
    log.info("nmea", "rmc", json.encode(exgnss.rmc(2)))
end


exgnss.open(exgnss.TIMER,{tag="MODE1",val=60,cb=mode1_cb})
exgnss.open(exgnss.DEFAULT,{tag="MODE2",cb=mode2_cb})
exgnss.open(exgnss.TIMERORSUC,{tag="MODE3",val=60,cb=mode3_cb})
log.info("gnss应用状态1",exgnss.is_active(exgnss.TIMER,{tag="MODE1"}))
log.info("gnss应用状态2",exgnss.is_active(exgnss.DEFAULT,{tag="MODE2"}))
log.info("gnss应用状态3",exgnss.is_active(exgnss.TIMERORSUC,{tag="MODE3"}))

exgnss.is_fix()

功能

gnss是否定位成功

注意事项

暂无

参数

返回值

local result = exgnss.is_fix()

result

参数含义:是否定位成功;
数据类型:boolean
取值范围:true/false
注意事项:true表示定位成功false表示定位失败

示例

local result = exgnss.is_fix()
log.info("nmea", "is_fix", result)

exgnss.int_location(speed_type)

功能

获取number类型的位置和速度信息

注意事项

暂无

参数

speed_type

参数含义:速度单位;
数据类型:number
取值范围:0 - m/h /小时,1 - m/s /秒,2 - km/h 千米/小时,3 - kn/h 英里/小时;
是否必选:否;
注意事项:默认0
示例代码:exgnss.int_location(1)

返回值

local lat,lng,speed=exgnss.int_location(0)

lat

参数含义:纬度数据;
数据类型:number
取值范围:格式为 DDDDDDDDD,示例:343482649DDDDDDDDD格式是由DD.DDDDDDD*10000000转换而来,目的是作为整数,方便某些场景使用;
注意事项:无;

lng

参数含义:经度数据;
数据类型:number
取值范围:格式为 DDDDDDDDD,示例:1135039700DDDDDDDDD格式是由DD.DDDDDDD*10000000转换而来,目的是作为整数,方便某些场景使用;
注意事项:无;

speed

参数含义:速度数据;
数据类型:number
取值范围:单位根据speed_type决定m/h, m/s, km/h, kn/h
注意事项:无;

示例

--DDDDDDDDD格式是由DD.DDDDDDD*10000000转换而来,目的是作为整数,方便某些场景使用,示例:343482649对应的原始值是34.3482649
-- 该数据是通过RMC转换的,如果想获取更详细的可以用exgnss.rmc(1)
-- speed数据默认 米/小时,返回值例如:343482649   1135039700  390m/h
log.info("nmea", "loc", exgnss.int_location())
-- speed数据米/秒,返回值例如:343482649   1135039700  0.1085478m/s
log.info("nmea", "loc", exgnss.int_location(1))
-- speed数据千米/小时,返回值例如:343482649 1135039700  0.3907720km/h
log.info("nmea", "loc", exgnss.int_location(2))
-- speed数据英里/小时,返回值例如:343482649 1135039700  0.2110000kn/h
log.info("nmea", "loc", exgnss.int_location(3))

exgnss.rmc(lnglat_mode)

功能

获取RMC的信息,经纬度,时间,速度,航向,定位是否有效,磁偏角

注意事项

暂无

参数

lnglat_mode

参数含义:经纬度数据的格式;
数据类型:number
取值范围:0-ddmm.mmmmm格式, 1-DDDDDDDDD格式, 2-DD.DDDDDDD格式, 3-原始RMC字符串
是否必选:是;
注意事项:无;
示例代码:exgnss.rmc(0)

返回值

table类型,返回RMC信息,格式如下:

local rmc=exgnss.rmc(2)

rmc

{
    -- 参数含义:地面航向;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:地面航向,单位为度,从北向起顺时针计算;
    course=344.9920044,     

    -- 参数含义:是否定位成功;
    -- 数据类型:boolean;
    -- 取值范围:true/false;
    -- 注意事项:true定位成功,false定位丢失;
    valid=true,   

    -- 参数含义:纬度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:纬度, 正数为北纬, 负数为南纬;
    lat=34.5804405,  

    -- 参数含义:经度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:经度, 正数为东经, 负数为西经;
    lng=113.8399506,  

    -- 参数含义:磁偏角;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:磁偏角,固定为0;
    variation=0,  

    -- 参数含义:地面速度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:单位为"节";
    speed=0.2110000,  

    -- 参数含义:年份;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:无;
    year=2025,   

    -- 参数含义:月份;
    -- 数据类型:number;
    -- 取值范围:1-12;
    -- 注意事项:无;
    month=1,     

    -- 参数含义:天;
    -- 数据类型:number;
    -- 取值范围:1-31;
    -- 注意事项:无;
    day=5,

    -- 参数含义:小时;
    -- 数据类型:number;
    -- 取值范围:0-23;
    -- 注意事项:无;
    hour=7, 

    -- 参数含义:分钟;
    -- 数据类型:number;
    -- 取值范围:0-59;
    -- 注意事项:无;
    min=23,

    -- 参数含义:秒;
    -- 数据类型:number;
    -- 取值范围:0-59;
    -- 注意事项:无;
    sec=20,
}

示例

--模式0示例:
--json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位,本示例保留5位小数
log.info("nmea", "rmc0", json.encode(exgnss.rmc(0),"5f"))
--日志输出内容:{"variation":0,"lat":3434.82666,"min":54,"valid":true,"day":17,"lng":11350.39746,"speed":0.21100,"year":2025,"month":7,"sec":30,"hour":11,"course":344.99200}
--模式1示例:
--DDDDDDDDD格式是由DD.DDDDDDD*10000000转换而来,目的是作为整数,方便某些场景使用
log.info("nmea", "rmc1", json.encode(exgnss.rmc(1)))
--日志输出内容:{"variation":0,"lat":345804414,"min":54,"valid":true,"day":17,"lng":1138399500,"speed":0.2110000,"year":2025,"month":7,"sec":30,"hour":11,"course":344.9920044}
--模式2示例:
--json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位
log.info("nmea", "rmc2", json.encode(exgnss.rmc(2)))
--日志输出内容:{"variation":0,"lat":34.5804405,"min":54,"valid":true,"day":17,"lng":113.8399506,"speed":0.2110000,"year":2025,"month":7,"sec":30,"hour":11,"course":344.9920044}
--模式3示例:
log.info("nmea", "rmc3", exgnss.rmc(3))
--日志输出内容:$GNRMC,115430.000,A,3434.82649,N,11350.39700,E,0.211,344.992,170725,,,A,S*02\r

exgnss.gsv()

功能

获取原始GSV信息

注意事项

暂无

参数

返回值

table类型,返回GSV信息,格式如下:

local gsv=exgnss.gsv()

gsv

{
    -- 参数含义:总可见卫星数量;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:无;
    total_sats=24, 

    -- 参数含义:卫星信息数组,每个元素为一个table;
    -- 数据类型:table;
    -- 取值范围:无特别限制;
    -- 注意事项:无;
    sats=[
            {
            -- 参数含义:信噪比;
            -- 数据类型:number;
            -- 取值范围:无特别限制;
            -- 注意事项:无;
            snr=27,     

            -- 参数含义:方向角;
            -- 数据类型:number;
            -- 取值范围:无特别限制;
            -- 注意事项:无;
            azimuth=278, 

            -- 参数含义:仰角;
            -- 数据类型:number;
            -- 取值范围:无特别限制;
            -- 注意事项:无;
            elevation=59, 

            -- 参数含义:卫星类型;
            -- 数据类型:number;
            -- 取值范围:0 - GPS, 1 - BD, 2 - GLONASS, 3 - Galileo, 4 - QZSS;
            -- 注意事项:无;
            tp=0,     

            -- 参数含义:卫星编号;
            -- 数据类型:number;
            -- 取值范围:无特别限制;
            -- 注意事项:无;
            nr=4
            },
            // 这里忽略了22个卫星的信息
            {
            snr=0,
            azimuth=107,
            elevation=19,
            tp=1,
            nr=31
            }
        ]   
}

示例

log.info("nmea", "gsv", json.encode(exgnss.gsv()))
-- 实例输出
-- {
--     "total_sats":24,      // 总可见卫星数量
--     "sats":[
--         {
--             "snr":27,     // 信噪比
--             "azimuth":278, // 方向角
--             "elevation":59, // 仰角
--             "tp":0,        // 0 - GPS, 1 - BD, 2 - GLONASS, 3 - Galileo, 4 - QZSS
--             "nr":4         // 卫星编号
--         },
--         // 这里忽略了22个卫星的信息
--         {
--             "snr":0,
--             "azimuth":107,
--             "elevation":19,
--             "tp":1,
--             "nr":31
--         }
--     ]
-- }

exgnss.gsa(data_mode)

功能

获取原始GSA信息

注意事项

暂无

参数

data_mode

参数含义:输出模式;
数据类型:number
取值范围:默认为0 -所有卫星系统全部输出在一起,1 - 每个卫星系统单独分开输出;
是否必选:否;
注意事项:无;
示例代码:exgnss.gsa(0)

返回值

table类型,返回GSA信息,格式如下:

local gsa=exgnss.gsa()

gsa

-- 示例数据(模式0, 也就是默认模式)

{
    -- 参数含义:位置精度因子;
    -- 数据类型:number;
    -- 取值范围:0.00 - 99.99,不定位时值为 99.99;
    -- 注意事项:暂无;
    pdop=1.1770000,

    -- 参数含义:正在使用的卫星编号;
    -- 数据类型:table;
    -- 取值范围:无特别限制;
    -- 注意事项:暂无;
    sats=[15,13,5,18,23,20,24,30,24,13,33,38,8,14,28,41,6,39,25,16,32,27],

    -- 参数含义:垂直精度因子;
    -- 数据类型:number;
    -- 取值范围:垂直精度因子,0.00 - 99.99,不定位时值为 99.99;
    -- 注意事项:暂无;
    vdop=1.0160000, 

    -- 参数含义:水平精度因子;
    -- 数据类型:number;
    -- 取值范围:水平精度因子,0.00 - 99.99,不定位时值为 99.99;
    -- 注意事项:暂无;
    hdop=0.5940000,

    -- 参数含义:卫星系统编号;
    -- 数据类型:number;
    -- 取值范围:1为GPS,4为北斗,2为GLONASS,3为Galileo;
    -- 注意事项:暂无;
    sysid=1, 

    -- 参数含义:定位模式;
    -- 数据类型:number;
    -- 取值范围:1-未定位, 2-2D定位, 3-3D定位;
    -- 注意事项:暂无;
    fix_type=3
}

示例

log.info("nmea", "gsa", json.encode(exgnss.gsa()))
--日志打印输出:
--[{"pdop":1.1770000,"sats":[15,13,5,18,23,20,24],"vdop":1.0160000,"hdop":0.5940000,"sysid":1,"fix_type":3},
--{"pdop":1.1770000,"sats":[30,24,13,33,38,8,14,28,41,6,39,25],"vdop":1.0160000,"hdop":0.5940000,"sysid":4,"fix_type":3},
--{"pdop":1.1770000,"sats":[16,32,27],"vdop":1.0160000,"hdop":0.5940000,"sysid":4,"fix_type":3},
--{"pdop":1.1770000,"sats":{},"vdop":1.0160000,"hdop":0.5940000,"sysid":2,"fix_type":3},
--{"pdop":1.1770000,"sats":{},"vdop":1.0160000,"hdop":0.5940000,"sysid":3,"fix_type":3}]

exgnss.vtg(data_mode)

功能

获取VTG速度信息

注意事项

暂无

参数

data_mode

参数含义:输出模式;
数据类型:number/nil
取值范围:3-原始字符串, 不传或者传其他值, 则返回浮点值;
是否必选:否;
注意事项:不传或者传其他值, 则返回浮点值;
示例代码:exgnss.vtg()

返回值

table类型,返回VTG信息,格式如下:

local vtg=exgnss.vtg()

vtg

{
    -- 参数含义:速度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:英里/小时;
    speed_knots=0,

    -- 参数含义:真北方向角;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:无;
    true_track_degrees=0,

        -- 参数含义:磁北方向角;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:无;
    magnetic_track_degrees=0, 

        -- 参数含义:速度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:千米/小时;
    speed_kph=0 
}

示例

log.info("nmea", "vtg", json.encode(exgnss.vtg()))
-- 输出内容:
-- {
--     "speed_knots":0,        // 速度, 英里/小时
--     "true_track_degrees":0,  // 真北方向角
--     "magnetic_track_degrees":0, // 磁北方向角
--     "speed_kph":0           // 速度, 千米/小时
-- }

--模式3
log.info("nmea", "vtg", exgnss.vtg(3))
-- 返回值:$GNVTG,0.000,T,,M,0.000,N,0.000,K,A*13\r
-- 提醒: 在速度<5km/h时, 不会返回方向角

exgnss.zda()

功能

获取原始ZDA时间和日期信息

注意事项

暂无

参数

返回值

table类型,返回VTG信息,格式如下:

local zda=exgnss.zda()

zda

{
    -- 参数含义:本地时区的分钟;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:本地时区的分钟, 一般固定输出0;
    minute_offset=0, 

    -- 参数含义:本地时区的小时;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:本地时区的小时, 一般固定输出0;
    hour_offset=0, 

    -- 参数含义:年份;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:UTC 年,四位数字;
    year=2025,   

    -- 参数含义:月份;
    -- 数据类型:number;
    -- 取值范围:1-12;
    -- 注意事项:UTC 月;
    month=1,     

    -- 参数含义:天;
    -- 数据类型:number;
    -- 取值范围:1-31;
    -- 注意事项:UTC 日;
    day=5,

    -- 参数含义:小时;
    -- 数据类型:number;
    -- 取值范围:0-23;
    -- 注意事项:无;
    hour=7, 

    -- 参数含义:分钟;
    -- 数据类型:number;
    -- 取值范围:0-59;
    -- 注意事项:无;
    min=23,

    -- 参数含义:秒;
    -- 数据类型:number;
    -- 取值范围:0-59;
    -- 注意事项:无;
    sec=20,
}

示例

log.info("nmea", "zda", json.encode(exgnss.zda()))
-- 实例输出
-- {
--     "minute_offset":0,   // 本地时区的分钟, 一般固定输出0
--     "hour_offset":0,     // 本地时区的小时, 一般固定输出0
--     "year":2023         // UTC 年,四位数字
--     "month":1,          // UTC 月,两位,01 ~ 12
--     "day":5,            // UTC 日,两位数字,01 ~ 31
--     "hour":7,           // 小时
--     "min":50,           // 分
--     "sec":14,           // 秒
-- }

exgnss.gga(lnglat_mode)

功能

获取GGA数据

注意事项

没定位成功时,返回nil

参数

lnglat_mode

参数含义:经纬度数据的格式;
数据类型:number
取值范围:0-ddmm.mmmmm格式, 1-DDDDDDDDD格式, 2-DD.DDDDDDD格式, 3-原始RMC字符串
是否必选:是;
注意事项:无;
示例代码:exgnss.gga(0)

返回值

table类型,GGA数据, 若如不存在会返回nil,格式如下:

local gga2 = exgnss.gga(2)

gga2

{
    -- 参数含义:经度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:正数为东经, 负数为西经;
    longitude=114.3199081,

    -- 参数含义:差分校正时延;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:单位为秒;
    dgps_age=0, 

    -- 参数含义:海平面分离度, 或者为海拔;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:单位是米;
    altitude=86.4000015,

    -- 参数含义:水平精度因子;
    -- 数据类型:number;
    -- 取值范围:0.00 - 99.99,不定位时值为 99.99;
    -- 注意事项:无;
    hdop=0.5940000,

    -- 参数含义:椭球高;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:无;
    height=-13.6999998,

    -- 参数含义:定位状态标识;
    -- 数据类型:number;
    -- 取值范围:0 - 无效,1 - 单点定位,2 - 差分定位;
    -- 注意事项:无;
    fix_quality=1,

    -- 参数含义:参与定位的卫星数量;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:无;
    satellites_tracked=22,

    -- 参数含义:纬度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:正数为北纬, 负数为南纬;
    latitude=34.7978172
}

示例

--模式0示例:
--json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位,本示例保留5位小数
local gga = exgnss.gga(0)
if gga then
    log.info("GGA0", json.encode(gga, "5f"))
end
--{"longitude":11419.19531,"dgps_age":0,"altitude":86.40000,"hdop":0.59400,"height":-13.70000,"fix_quality":1,"satellites_tracked":22,"latitude":3447.86914}
--模式1示例:
--DDDDDDDDD格式是由DD.DDDDDDD*10000000转换而来,目的是作为整数,方便某些场景使用
local gga1 = exgnss.gga(1)
if gga1 then
    log.info("GGA1", json.encode(gga1))
end
--{"longitude":1143199103,"dgps_age":0,"altitude":86.4000015,"hdop":0.5940000,"height":-13.6999998,"fix_quality":1,"satellites_tracked":22,"latitude":347978178}
--模式2示例:
--json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位
local gga2 = exgnss.gga(2)
if gga2 then
    log.info("GGA2", json.encode(gga2))
end
--{"longitude":114.3199081,"dgps_age":0,"altitude":86.4000015,"hdop":0.5940000,"height":-13.6999998,"fix_quality":1,"satellites_tracked":22,"latitude":34.7978172}
--模式3示例:
local gga3 = exgnss.gga(3)
if gga3 then
    log.info("GGA3", gga3)
end
--$GNGGA,131241.000,3434.81372,N,11350.39930,E,1,05,4.924,165.5,M,-15.2,M,,*6D\r

exgnss.gll(data_mode)

功能

获取GLL数据

注意事项

没定位成功时,返回nil

参数

data_mode

参数含义:经纬度数据的格式;
数据类型:number
取值范围:0-ddmm.mmmmm格式, 1-DDDDDDDDD格式, 2-DD.DDDDDDD格式
是否必选:是;
注意事项:无;
示例代码:exgnss.gll(0)

返回值

table类型,GLL数据, 若如不存在会返回nil,格式如下:

local gll2 = exgnss.gll(2)

gll2

{
    -- 参数含义:经度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:正数为东经, 负数为西经;
    longitude=114.3199081,

    -- 参数含义:秒;
    -- 数据类型:number;
    -- 取值范围:0-59;
    -- 注意事项:无;
    sec=14,

    -- 参数含义:分钟;
    -- 数据类型:number;
    -- 取值范围:0-59;
    -- 注意事项:无;
    min=32,

    -- 参数含义:定位模式;
    -- 数据类型:string;
    -- 取值范围:V无效, A单点解, D差分解;
    -- 注意事项:无;
    mode="A",

    -- 参数含义:小时;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:UTC时间为准;
    hour=6,

    -- 参数含义:微妙数;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:通常为0;
    us=0,

    -- 参数含义:定位状态;
    -- 数据类型:string;
    -- 取值范围:定位状态, A有效, B无效;
    -- 注意事项:无;
    status="A",

    -- 参数含义:纬度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:正数为北纬, 负数为南纬;
    latitude=34.7978172
}

示例

--模式0示例:
--json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位,本示例保留5位小数
local gll = exgnss.gll(0)
if gll then
    log.info("GLL0", json.encode(gll, "5f"))
end
--{"longitude":11419.19531,"sec":14,"min":32,"mode":"A","hour":6,"us":0,"status":"A","latitude":3447.86914}
--模式1示例:
--DDDDDDDDD格式是由DD.DDDDDDD*10000000转换而来,目的是作为整数,方便某些场景使用
local gll1 = exgnss.gll(1)
if gll1 then
    log.info("GLL1", json.encode(gll1))
end
--{"longitude":1143199103,"sec":14,"min":32,"mode":"A","hour":6,"us":0,"status":"A","latitude":347978178}
--模式2示例:
--json.encode默认输出"7f"格式保留7位小数,可以根据自己需要的格式调整小数位
local gll2 = exgnss.gll(2)
if gll2 then
    log.info("GLL2", json.encode(gll2))
end
--{"longitude":114.3199081,"sec":14,"min":32,"mode":"A","hour":6,"us":0,"status":"A","latitude":34.7978172}

exgnss.last_loc()

功能

获取最后的经纬度数据

参数

注意事项

暂无

返回值

table类型,经纬度数据,格式如下:

local lastloc = exgnss.last_loc()

lastloc

{
    --返回nil表示没有数据,此数据在定位成功,关闭gps时,会自动保存到文件系统中,定位成功之后每10分钟如果还处于定位成功状态会更新

    -- 参数含义:纬度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:正数为北纬, 负数为南纬;
    lat=ddmm.mmmmm0000,

    -- 参数含义:经度;
    -- 数据类型:number;
    -- 取值范围:无特别限制;
    -- 注意事项:正数为东经, 负数为西经;
    lng=ddmm.mmmmm0000
}

示例

local loc= exgnss.last_loc()
if loc then
    log.info("lastloc", loc.lat,loc.lng)
end
--日志输出内容示例:
--3447.8679200000 11419.196290000

五、产品支持说明

Air8000系列带内置GNSS的和Air780EGH都支持exgnss扩展库