GNSS NMEA-0183 报文
GNSS NMEA-0183 报文
一、技术背景
全球导航卫星系统(GNSS, Global Navigation Satellite System)包括美国GPS、俄罗斯GLONASS、中国北斗(BDS)、欧盟伽利略(Galileo)等,为全球提供高精度定位、导航和授时服务。随着GNSS设备的普及,不同厂商的接收机、显示器、传感器等设备需要统一的通信协议以实现数据交互。
NMEA-0183协议由美国国家海洋电子协会(National Marine Electronics Association, NMEA)制定,最初用于解决航海电子设备间的兼容性问题。该协议定义了一套基于 ASCII 码的文本数据格式,支持异步串行通信,适用于低速数据传输场景(如串口、蓝牙)。通过标准化报文结构,GNSS设备可统一输出位置、时间、速度、卫星状态等信息,极大降低了系统集成成本。
二、发展历史
- 1983年:NMEA发布首版《NMEA 0183 接口标准》(1.0版),主要用于航海设备(如罗盘、测深仪)的数据交换,未直接支持GNSS。
- 1992年:随着GPS民用化,2.0版协议引入针对GPS的专用语句(如
$GPRMC
、$GPGGA
),定义了经纬度、时间、定位状态等核心字段。 - 1998年:3.0版优化校验机制,强制要求校验和字段,并支持更多卫星系统(如差分GPS)。
- 2004年:3.1版增加对GLONASS的支持,引入
$GNGGA
等多系统兼容语句(GN
为通用前缀)。 - 2019年:4.1版扩展支持北斗(BDS)、伽利略(Galileo),完善多星座混合定位数据格式,兼容现代GNSS接收机。
目前,NMEA-0183仍是低成本GNSS设备的主流协议,尽管面临NMEA-2000(高速网络协议)的竞争,但其简单性和跨平台兼容性使其在嵌入式系统、消费电子中持续广泛应用。
三、技术原理
1. 基本通信参数
- 物理层:异步串行通信(UART),常用波特率:4800、9600、19200 bps;数据位:8位;停止位:1位;无校验位(偶校验可选,取决于设备配置)。
- 数据格式:以文本行(ASCII码)为单位,每行对应一条报文,以
\r\n
(CRLF)结尾,长度通常不超过80字节。
2. 报文结构
每条报文由以下部分组成(以$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
为例):
[起始符] [语句标识] [数据字段] [校验和] [结束符]
$ GPRMC 各字段 *62 \r\n
- 起始符:固定为
$
(或!
,较少用)。 - 语句标识:由5-6个字符组成,前两位为系统标识(如
GP
代表GPS,GN
代表多系统通用),后3-4位为功能码(如RMC
代表推荐最小定位信息)。 - 数据字段:以逗号分隔的具体数据,允许空字段(表示未提供该数据)。
- 校验和:
*
后接两位十六进制数,计算方式为$
到*
之间所有字符的异或(XOR)结果。 - 结束符:固定为
\r\n
(十进制ASCII码13和10)。
3. 常用语句解析
(1)核心定位语句
语句 | 名称 | 功能描述 |
---|---|---|
$GPGGA | 全球定位系统固定数据 | 包含UTC时间、经纬度、定位状态、卫星数、精度因子、海拔高度等信息。 |
$GPRMC | 推荐最小定位信息 | 包含UTC时间、日期、经纬度、速度、航向、定位状态等核心导航数据。 |
$GPGSA | 卫星星历及DOP值 | 提供当前使用的卫星列表、定位模式(2D/3D)、PDOP/HDOP/VDOP等精度因子。 |
$GPGSV | 可见卫星信息 | 分多条报文描述当前可见的所有卫星的ID、仰角、方位角和信噪比(SNR)。 |
$GPVTG | 地面速度和航向 | 提供地面速度( knots/m/s)、真北/磁北航向角等信息。 |
(2)字段详解(以$GPRMC
为例)
$GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E*62
081836
:UTC时间(小时:分钟:秒,08:18:36)。A
:定位状态(A
=有效,V
=无效)。3751.65,S
:纬度(37°51.65' S,度分格式,需转换为十进制:37 + 51.65/60 = 37.86083° S)。14507.36,E
:经度(145°07.36' E,转换为145 + 7.36/60 = 145.12267° E)。000.0
:地面速度(节,0.0节表示静止)。360.0
:航向角(度,相对于真北,360°即0°)。130998
:日期(日/月/年,13日9月1998年)。011.3
:磁偏角(度,E表示东偏,需结合当地磁偏参数校正)。
(3)校验和计算
以GPRMC
语句为例,计算$
到*
之间的字符异或:
- 字符序列:
GPRMC,081836,A,3751.65,S,14507.36,E,000.0,360.0,130998,011.3,E
- 异或运算:从第一个字符
G
(ASCII 71)开始,依次与下一个字符异或,最终结果为0x62,对应校验和*62
。
4. 多系统兼容性
现代设备支持多GNSS星座(如GPS+北斗+GLONASS),NMEA-0183通过前缀区分:
GP
:仅GPS;GN
:多系统通用(兼容所有支持的卫星系统);BD
:北斗专用(如$BDGGA
)。- 通用语句(如
$GNGGA
)可包含多系统融合定位数据,字段定义与单系统语句一致。
四、应用场景
1. 航海导航
- 船舶定位:通过
$GPRMC
获取实时经纬度、航速、航向,结合电子海图(ECDIS)实现航线规划。 - 差分定位:接收
$GPDTM
(差分基站信息)提升定位精度,满足港口作业、远洋航行需求。
2. 陆地交通
- 车载导航:车载GPS模块通过NMEA-0183输出位置数据,供导航软件显示实时轨迹、计算路线。
- 物流追踪:物联网设备(如货车GPS终端)通过串口或蓝牙发送NMEA报文,后台解析后监控车辆位置与状态。
3. 航空与无人机
- 通用航空:小型飞机使用NMEA设备获取位置、高度(
$GPGGA
中的海拔字段),辅助目视飞行规则(VFR)导航。 - 无人机控制:飞控系统接收GNSS报文,实现定点悬停、航路点飞行等自主控制功能。
4. 测绘与地理信息
- 高精度定位:通过
$GPGSA
的DOP值评估定位精度,结合RTK(实时动态)技术(需扩展协议支持)实现厘米级测绘。 - 时间同步:利用
$GPRMC
的UTC时间字段,为分布式系统提供纳秒级授时(需设备支持高精度时标)。
5. 消费电子与物联网
- 运动手表:内置GNSS芯片通过NMEA协议输出跑步、骑行轨迹数据,同步至手机APP。
- 资产追踪:低功耗设备(如集装箱追踪器)通过NMEA报文发送位置,经GPRS/4G上传至云端平台。
五、使用举例
1. 报文解析代码(Python)
def parse_nmea(line):
if not line.startswith('$') or '*' not in line:
return None
# 提取校验和并计算
data_part, checksum_part = line[1:].split('*', 1)
checksum_calculated = 0
for c in data_part:
checksum_calculated ^= ord(c)
if int(checksum_part[:2], 16) != checksum_calculated:
print("校验和错误")
return None
# 分割字段
fields = data_part.split(',')
sentence_id = fields[0]
if sentence_id == 'GPRMC':
return parse_gprmc(fields)
elif sentence_id == 'GPGGA':
return parse_gpgga(fields)
else:
return fields
def parse_gprmc(fields):
# 字段索引:0=GPRMC, 1=时间, 2=状态, 3=纬度, 4=NS, 5=经度, 6=EW, ...
time_utc = fields[1] # 格式:HHMMSS
status = fields[2]
lat = float(fields[3]) if fields[3] else 0.0
lat_dir = fields[4]
lon = float(fields[5]) if fields[5] else 0.0
lon_dir = fields[6]
# 度分转换为十进制
lat_dec = lat / 100.0
lat_dec = lat_dec if lat_dir == 'N' else -lat_dec
lon_dec = lon / 100.0
lon_dec = lon_dec if lon_dir == 'E' else -lon_dec
return {
'type': 'GPRMC',
'time_utc': time_utc,
'status': status,
'latitude': lat_dec,
'longitude': lon_dec
}
2. 典型报文示例
(1)有效定位报文($GPRMC
)
$GPRMC,123519,A,3723.2475,N,12158.3416,W,000.5,064.7,120598,020.3,E*68
- 解析结果:UTC时间12:35:19,定位有效,北纬37.38745°,西经121.97236°,速度0.5节,航向64.7°,日期12日5月1998年,磁偏角20.3°东。
(2)卫星状态报文($GPGSV
)
$GPGSV,3,1,11,01,78,352,43,02,49,239,42,03,42,083,44,06,34,293,45*7F
$GPGSV,3,2,11,07,22,329,41,08,16,046,39,10,17,238,40,12,28,143,47*7A
$GPGSV,3,3,11,13,34,068,44,15,23,346,40,24,35,140,44*70
- 说明:共3条报文(
3,1
表示总3条,当前第1条),可见11颗卫星。每颗卫星包含ID、仰角(°)、方位角(°)、信噪比(dBHz)。
3. 注意事项
- 时区转换:NMEA时间为UTC,需根据当地时区(如北京时间+8小时)转换为本地时间。
- 数据刷新率:典型设备输出频率为1Hz(每秒1条报文),高速运动场景需确认设备支持更高刷新率(如5Hz、10Hz)。
- 多系统兼容:若设备支持北斗/GLONASS,需识别语句前缀(如
$BDGGA
)并统一解析逻辑。
六、总结
NMEA-0183协议凭借其简单性和跨平台兼容性,成为GNSS设备数据交互的事实标准,广泛应用于从航海到消费电子的多个领域。尽管面临更高效协议(如二进制格式)的挑战,其文本可读性和易于解析的特点,使其在低成本、低功耗场景中保持不可替代的地位。理解NMEA-0183报文结构是开发GNSS相关应用(如导航软件、定位终端)的基础,掌握其字段定义和校验机制是确保数据可靠性的关键。