exgnss - NMEA数据处理
作者:李源龙
一、概述
当前使用libgnss核心库去实现gnss应用会比较麻烦,需要自己写接口打开,自己设置所有的参数,所以LuatOS新增了exgnss扩展库,简化了gnss的使用。exgnss扩展库是对libgnss核心库的封装,使用起来更加简单。
libgnss核心库和exgnss扩展库的区别如下:
区别项 | libgnss核心库 | exgnss扩展库 |
---|---|---|
打开方式 | 需要自己写接口打开,自己设置所有的参数 | 用exgnss.setup设置,然后用exgnss.open操作 |
应用场景 | 需要自己按照自己的逻辑去实现 | 提供三种比较经典的应用场景 |
本篇文章仅介绍exgnss扩展库,如果需要了解libgnss核心库,请 点击此处
二、常量详解
核心库常量,顾名思义是由合宙LuatOS内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;
--关于exgnss的三种应用场景:
exgnss.DEFAULT:
--- exgnss应用模式1.
-- 打开gnss后,gnss定位成功时,如果有回调函数,会调用回调函数
-- 使用此应用模式调用exgnss.open打开的“gnss应用”,必须主动调用exgnss.close
-- 或者exgnss.close_all才能关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
-- 通俗点说就是一直打开,除非自己手动关闭掉
exgnss.TIMERORSUC:
--- exgnss应用模式2.
-- 打开gnss后,如果在gnss开启最大时长到达时,没有定位成功,如果有回调函数,
-- 会调用回调函数,然后自动关闭此“gnss应用”
-- 打开gnss后,如果在gnss开启最大时长内,定位成功,如果有回调函数,
-- 会调用回调函数,然后自动关闭此“gnss应用”
-- 打开gnss后,在自动关闭此“gnss应用”前,可以调用exgnss.close或者
-- exgnss.close_all主动关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
-- 通俗点说就是设置规定时间打开,如果规定时间内定位成功就会自动关闭此应用,
-- 如果没有定位成功,时间到了也会自动关闭此应用
exgnss.TIMER:
--- exgnss应用模式3.
-- 打开gnss后,在gnss开启最大时长时间到达时,无论是否定位成功,如果有回调函数,
-- 会调用回调函数,然后自动关闭此“gnss应用”
-- 打开gnss后,在自动关闭此“gnss应用”前,可以调用exgnss.close或者exgnss.close_all
-- 主动关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
-- 通俗点说就是设置规定时间打开,无论是否定位成功,到了时间都会自动关闭此应用,
-- 和第二种的区别在于定位成功之后不会自动关闭,到时间之后才会自动关闭
三、函数详解
exgnss.setup(opts)
功能
设置gnss定位参数
参数
opts
table类型,表示gnss定位参数;
必须传入此参数;
此参数的内容格式说明如下
{
gnssmode = , -- number类型,定位卫星模式,1为卫星全定位,2为单北斗,默认为卫星全定位
-- 例如:gnssmode = 1
agps_enable = , -- boolean类型,是否使用AGPS,开启AGPS后定位速度更快,会访问服务器下载星历,星历时效性为北斗1小时,GPS4小时,默认下载星历的时间为1小时,即一小时内只会下载一次,true为启用,false为不启用,默认为false
-- 例如:agps_enable = true
debug = , -- boolean类型,是否输出调试信息到,luatools,true为输出,false为不输出,默认为false
-- 例如 debug = true
uart = , -- number类型,GNSS串口配置,780EGH和8000默认为uart2,可不填
-- 例如:uart = 2
uartbaud = , -- number类型,GNSS串口波特率,780EGH和8000默认为115200,可不填
-- 例如:uartbaud = 115200
bind = , -- number类型或者,绑定uart端口进行GNSS数据读取,是否设置串口转发,指定串口号,不需要转发,可不填
-- 例如:bind = 2
rtc = , -- boolean类型,定位成功后自动设置RTC true开启,flase关闭,默认为flase,不需要可不填
-- 例如:rtc = true
auto_open = , --boolean类型, 因为GNSS使用辅助定位的逻辑,是模块下载星历文件,然后把数据发送给GNSS芯片,
--芯片解析星历文件需要10-30s,默认GNSS会开启20s,该逻辑如果不执行,会导致下一次GNSS开启定位是冷启动,
--定位速度慢,大概35S左右,所以默认开启,如果可以接受下一次定位是冷启动,可以把auto_open设置成false
--需要注意的是热启动在定位成功之后,需要再开启3s左右才能保证本次的星历获取完成,如果对定位速度有要求,建议这么处理
--例如:auto_open = false
}
返回值
无
示例
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
}
exgnss.setup(gnssotps)
exgnss.open(mode,para)
功能
设置gnss定位参数
参数
mode
number类型,表示gnss应用模式;
必须传入此参数;
此参数的内容格式说明如下
支持exgnss.DEFAULT,exgnss.TIMERORSUC,exgnss.TIMER三种
--关于gnss的三种应用场景:
-- exgnss.DEFAULT:
--- gnss应用模式1.
-- 打开gnss后,gnss定位成功时,如果有回调函数,会调用回调函数
-- 使用此应用模式调用exgnss.open打开的“gnss应用”,必须主动调用exgnss.close
-- 或者exgnss.close_all()才能关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
-- 通俗点说就是一直打开,除非自己手动关闭掉
-- exgnss.TIMERORSUC:
--- gnss应用模式2.
-- 打开gnss后,如果在gnss开启最大时长到达时,没有定位成功,如果有回调函数,
-- 会调用回调函数,然后自动关闭此“gnss应用”
-- 打开gnss后,如果在gnss开启最大时长内,定位成功,如果有回调函数,
-- 会调用回调函数,然后自动关闭此“gnss应用”
-- 打开gnss后,在自动关闭此“gnss应用”前,可以调用exgnss.close或者
-- exgnss.close_all()主动关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
-- 通俗点说就是设置规定时间打开,如果规定时间内定位成功就会自动关闭此应用,
-- 如果没有定位成功,时间到了也会自动关闭此应用
-- exgnss.TIMER:
--- gnss应用模式3.
-- 打开gnss后,在gnss开启最大时长时间到达时,无论是否定位成功,如果有回调函数,
-- 会调用回调函数,然后自动关闭此“gnss应用”
-- 打开gnss后,在自动关闭此“gnss应用”前,可以调用exgnss.close或者exgnss.close_all()
-- 主动关闭此“gnss应用”,主动关闭时,即使有回调函数,也不会调用回调函数
-- 通俗点说就是设置规定时间打开,无论是否定位成功,到了时间都会自动关闭此应用,
-- 和第二种的区别在于定位成功之后不会自动关闭,到时间之后才会自动关闭
-- “gnss应用”:指的是使用gnss功能的一个应用
-- 例如,假设有如下3种需求,要打开gnss,则一共有3个“gnss应用”:
-- “gnss应用1”:每隔1分钟打开一次gnss
-- “gnss应用2”:设备发生震动时打开gnss
-- “gnss应用3”:收到一条特殊短信时打开gnss
-- 只有所有“gnss应用”都关闭了,才会去真正关闭gnss
-- 每个“gnss应用”打开或者关闭gnss时,最多有4个参数,其中 gnss应用模式和gnss应用标记 共同决定了一个唯一的“gnss应用”:
-- 1、gnss应用模式(必选)
-- 2、gnss应用标记(必选)
-- 3、gnss开启最大时长[可选]
-- 4、回调函数[可选]
-- 例如exgnss.open(exgnss.TIMER,{tag="MODE1",val=60,cb=mode1_cb})
-- exgnss.TIMER为gnss应用模式,"MODE1"为gnss应用标记,60秒为gnss开启最大时长,mode1_cb为回调函数
para
table类型,表示gnss应用参数;
必须传入此参数;
此参数的内容格式说明如下
{
tag = , -- string类型,gnss应用标记
-- 例如:tag = "MODE1"
val = , -- number类型,gnss应用开启最大时长,单位:秒,mode参数为gnss.TIMERORSUC或者gnss.TIMER时,此值才有意义;使用close接口时,不需要传入此参数
-- 例如:val = 60
cb = , -- function类型,gnss应用结束时的回调函数,使用close接口时,不需要传入此参数
-- 例如 cb=mode_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
number类型,表示gnss应用模式;
必须传入此参数;
此参数的内容格式说明如下
支持exgnss.DEFAULT,exgnss.TIMERORSUC,exgnss.TIMER三种模式
para
table类型,表示gnss应用参数;
必须传入此参数;
此参数的内容格式说明如下
{
tag = , -- string类型,gnss应用标记,调用本接口查询状态时,mode和para.tag要和exgnss.open打开一个“gnss应用”时传入的mode和para.tag保持一致
-- 例如:tag = "MODE1"
}
返回值
无
示例
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应用”,只是从逻辑上关闭一个gnss应用,并不一定真正关闭gnss,是有所有的gnss应用都处于关闭状态,才会去真正关闭gnss
参数
mode
number类型,表示gnss应用模式;
必须传入此参数;
此参数的内容格式说明如下
支持exgnss.DEFAULT,exgnss.TIMERORSUC,exgnss.TIMER三种模式
para
table类型,表示gnss应用参数;
必须传入此参数;
此参数的内容格式说明如下
{
tag = , -- string类型,gnss应用标记,调用本接口查询状态时,mode和para.tag要和gnss.open打开一个“gnss应用”时传入的mode和para.tag保持一致
-- 例如:tag = "MODE1"
}
返回值
无
示例
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表示定位失败
示例
log.info("nmea", "is_fix", exgnss.is_fix())
exgnss.int_location(speed_type)
功能
获取number类型的位置和速度信息
参数
speed_type
number类型,速度单位,默认是m/h,
0 - m/h 米/小时, 默认值, 整型
1 - m/s 米/秒, 浮点数
2 - km/h 千米/小时, 浮点数
3 - kn/h 英里/小时, 浮点数
返回值
local lat,lng,speed=exgnss.int_location(0)
lat
number类型, lat数据, 格式为 DDDDDDDDD,示例:343482649,DDDDDDDDD格式是由DD.DDDDDDD*10000000转换而来,目的是作为整数,方便某些场景使用
lng
number类型,lng数据, 格式为 DDDDDDDDD,示例:1135039700,DDDDDDDDD格式是由DD.DDDDDDD*10000000转换而来,目的是作为整数,方便某些场景使用
speed
number类型,speed数据, 单位根据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字符串
返回值
table类型,返回RMC信息,格式如下:
local rmc=exgnss.rmc(2)
rmc
-- {
-- course=344.9920044, // 地面航向,单位为度,从北向起顺时针计算
-- valid=true, // true定位成功,false定位丢失
-- lat=34.5804405, // 纬度, 正数为北纬, 负数为南纬
-- lng=113.8399506, // 经度, 正数为东经, 负数为西经
-- variation=0, // 磁偏角,固定为0
-- speed=0.2110000 // 地面速度, 单位为"节"
-- year=2023, // 年份
-- month=1, // 月份, 1-12
-- day=5, // 月份天, 1-31
-- hour=7, // 小时,0-23
-- min=23, // 分钟,0-59
-- sec=20, // 秒,0-59
-- }
course
number类型, 地面航向,单位为度,从北向起顺时针计算
valid
boolean类型,true定位成功,false定位丢失
lat
number类型,纬度, 正数为北纬, 负数为南纬
lng
number类型,经度, 正数为东经, 负数为西经
variation
number类型,磁偏角,固定为0
speed
number类型,地面速度, 单位为"节"
year
number类型,年份
month
number类型,月份, 1-12
day
number类型,月份天, 1-31
hour
number类型,小时,0-23
min
number类型,分钟,0-59
sec
number类型,秒,0-59
示例
--模式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
-- {
-- 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
-- }
-- ]
-- }
total_sats
number类型,总可见卫星数量
sats
table类型,卫星信息数组,每个元素为一个table,包含以下字段:
snr
number类型,信噪比
azimuth
number类型,方向角
elevation
number类型,仰角
tp
number类型,卫星类型,0 - GPS, 1 - BD, 2 - GLONASS, 3 - Galileo, 4 - QZSS
nr
number类型,卫星编号
示例
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信息
参数
无
返回值
table类型,返回GSA信息,格式如下:
local gsa=exgnss.gsa()
gsa -- 示例数据(模式0, 也就是默认模式) --sysid:1为GPS,4为北斗,2为GLONASS,3为Galileo --{
--pdop=1.1770000, 位置精度因子,0.00 - 99.99,不定位时值为 99.99
--sats=[15,13,5,18,23,20,24,30,24,13,33,38,8,14,28,41,6,39,25,16,32,27], // 正在使用的卫星编号
--vdop=1.0160000, 垂直精度因子,0.00 - 99.99,不定位时值为 99.99
--hdop=0.5940000, // 水平精度因子,0.00 - 99.99,不定位时值为 99.99
--sysid=1, // 卫星系统编号1为GPS,4为北斗,2为GLONASS,3为Galileo
--fix_type=3 // 定位模式, 1-未定位, 2-2D定位, 3-3D定位
--}
pdop
number类型,位置精度因子,0.00 - 99.99,不定位时值为 99.99
vdop
number类型,垂直精度因子,0.00 - 99.99,不定位时值为 99.99
hdop
number类型,水平精度因子,0.00 - 99.99,不定位时值为 99.99
sats
table类型,正在使用的卫星编号
sysid
numuber类型,卫星系统编号1为GPS,4为北斗,2为GLONASS,3为Galileo
fix_type
number类型,定位模式, 1-未定位, 2-2D定位, 3-3D定位
示例
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类型,
3-原始字符串, 不传或者传其他值, 则返回浮点值
返回值
table类型,返回VTG信息,格式如下:
local vtg=exgnss.vtg() vtg { speed_knots=0, // 速度, 英里/小时 true_track_degrees=0, // 真北方向角 magnetic_track_degrees=0, // 磁北方向角 speed_kph=0 // 速度, 千米/小时 }
speed_knots
number类型,速度, 英里/小时
true_track_degrees
number类型,真北方向角
magnetic_track_degrees
number类型,磁北方向角
speed_kph
number类型,速度, 千米/小时
示例
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
-- {
-- 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, // 秒
-- }
minute_offset
number类型,本地时区的分钟, 一般固定输出0
hour_offset
number类型,本地时区的小时, 一般固定输出0
year
number类型,UTC 年,四位数字
month
number类型,UTC 月,两位,01 ~ 12
day
number类型,UTC 日,两位数字,01 ~ 31
hour
number类型,小时
min
number类型,分
sec
number类型,秒
示例
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数据
参数
lnglat_mode
number类型,经纬度数据的格式,
0-ddmm.mmmmm格式,
1-DDDDDDDDD格式,
2-DD.DDDDDDD格式,
3-原始RMC字符串
返回值
table类型,GGA数据, 若如不存在会返回nil,格式如下:
local gga2 = exgnss.gga(2)
gga2
--{
--longitude=114.3199081, // 经度, 正数为东经, 负数为西经
--dgps_age=0, // 差分校正时延,单位为秒
--altitude=86.4000015, // 海平面分离度, 或者成为海拔, 单位是米,
--hdop=0.5940000, // 水平精度因子,0.00 - 99.99,不定位时值为 99.99
--height=-13.6999998, // 椭球高
--fix_quality=1, // 定位状态标识 0 - 无效,1 - 单点定位,2 - 差分定位
--satellites_tracked=22, // 参与定位的卫星数量
--latitude=34.7978172 // 纬度, 正数为北纬, 负数为南纬
--}
longitude
number类型,经度, 正数为东经, 负数为西经
dgps_age
number类型,差分校正时延,单位为秒
altitude
number类型,海平面分离度, 或者成为海拔, 单位是米,
hdop
number类型,水平精度因子,0.00 - 99.99,不定位时值为 99.99
height
number类型,椭球高
fix_quality
number类型,定位状态标识 0 - 无效,1 - 单点定位,2 - 差分定位
satellites_tracked
number类型,参与定位的卫星数量
latitude
number类型,纬度, 正数为北纬, 负数为南纬
示例
--模式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)
功能
获取GGA数据
参数
lnglat_mode
number类型,经纬度数据的格式,
0-ddmm.mmmmm格式,
1-DDDDDDDDD格式,
2-DD.DDDDDDD格式,
返回值
table类型,GLL数据, 若如不存在会返回nil,格式如下:
local gll2 = exgnss.gll(2)
gll2
--{
--longitude=114.3199081, // 经度, 正数为东经, 负数为西经
--sec=14, // 秒, UTC时间为准
--min=32, // 分钟, UTC时间为准
--mode="A", // 定位模式, V无效, A单点解, D差分解
--hour=6, // 小时, UTC时间为准
--us=0, // 微妙数, 通常为0
--status="A", // 定位状态, A有效, B无效
--latitude=34.7978172 // 纬度, 正数为北纬, 负数为南纬
--}
longitude
number类型,经度, 正数为东经, 负数为西经
latitude
number类型,纬度, 正数为北纬, 负数为南纬
hour
number类型,小时, UTC时间为准
min
number类型,分钟, UTC时间为准
sec
number类型,秒, UTC时间为准
us
number类型,微秒数, 通常为0
mode
string类型,定位模式, V无效, A单点解, D差分解
status
string类型,定位状态, A有效, B无效
示例
--模式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()
功能
获取GGA数据
参数
无
返回值
table类型,经纬度数据,格式如下:
local lastloc = exgnss.last_loc()
lastloc
--{
-- lat=ddmm.mmmmm0000, --纬度
-- lng=ddmm.mmmmm0000 --经度
--}
返回nil表示没有数据,此数据在定位成功,关闭gps时,会自动保存到文件系统中,定位成功之后每10分钟如果还处于定位成功状态会更新
lat
number类型,纬度, ddmm.mmmmm0000格式
lng
number类型,经度, ddmm.mmmmm0000格式
示例
local loc= exgnss.last_loc()
if loc then
log.info("lastloc", loc.lat,loc.lng)
end
--日志输出内容示例:
--3447.8679200000 11419.196290000
四、产品支持说明
Air8000系列和Air780EGH都支持exgnss扩展库