NMEA 0183(海洋 / 船舶)
NMEA 0183 是美国 National Marine Electronics Association 于 1983 年标准化的海洋 / 船舶设备 ASCII 通信规约。GPS / 陀螺罗经 / 风速计 / 探鱼仪 / AIS 等几乎所有海洋传感器都使用该 sentence 格式。
网关的 NMEA 驱动通过 TCP(NMEA over IP)接收 sentence stream,进行 checksum(XOR)校验后,按 sentence type 解析各字段并对外提供。只读。
对于像船舶综合驾驶台那样以 IEC 61162-450(Lightweight Ethernet)组播语句的环境,请使用 IEC 61162-450 驱动。由于语句解析器相同,标签地址表记与 alias 与本文完全一致。
注册表单输入项
| 输入栏 | 填写内容 | 示例 |
|---|---|---|
| IP 地址 | NMEA 多路复用器 / 路由器 IP | 192.168.0.140 |
| 端口 | NMEA TCP 端口 | 10110(事实标准)/ 4001(因设备而异) |
- 字符集固定为 US-ASCII(无表单选项)。
- 高级选项
nmea.port(表单中不显示 — 仅在通过 REST API 注册时以options指定):若有值,则使用该值而非上述表单端口进行连接。
NMEA 0183 通常为 sentence 单向 broadcast。网关以 read-only 方式运行。若环境中需要控制设备,请另行配置 NMEA 2000 / Modbus 网关。
标签的 PLC 地址表记
地址为 <sentence-type>.<field-no|alias> — 点(.)表记。字段编号是排除 talker 两个字符后的 1-base 索引。
| 表记 | 含义 |
|---|---|
RMC.7 | RMC 的第 7 个字段(对地航速 kn) |
GGA.2 | GGA 的第 2 个字段(纬度) |
RMC.lat | alias — 参见下表(不区分大小写) |
RMC | (省略字段)最后接收的完整 raw 语句 |
未定义 alias 的 sentence type 也可通过字段编号(XXX.3)访问;仅填写类型时,将以字符串形式返回完整 raw 语句。
不支持冒号表记(RMC:lat)与 RAW:<sentence-type> 表记 — 请分别以 RMC.lat、<sentence-type>(仅类型)注册。也不存在 satellites / windAngle / windSpeed 这类长名称 alias — 实际 alias 为 sats / angle / speed(下表即驱动定义的全部内容)。
支持的 sentence / alias 全表(驱动定义)
| sentence | alias |
|---|---|
RMC | utc, status, lat, ns, lon, ew, speed (kn), course, date, magvar, magvarew, mode |
GGA | utc, lat, ns, lon, ew, fix, sats(卫星数), hdop, alt, altunit, geoidsep, sepunit, dgpsage, dgpsid |
GLL | lat, ns, lon, ew, utc, status, mode |
VTG | cogtrue, cogmag, speed (kn, = speedkn), speedkm (km/h), mode |
GSA | mode1, mode2, pdop, hdop, vdop |
GSV | totalmsgs, msgnum, satsinview |
HDT | heading (true), t |
HDM | heading (magnetic), m |
MWV | angle(风向角), ref (R/T), speed(风速), units, status |
DBT | depthft, depthm (= depth, m), depthfa |
DPT | depth (m), offset, max |
MTW | temp, units |
VHW | headingt, headingm, speed (kn), speedkm |
ZDA | utc, day, month, year, tzh, tzm |
XDR | type, value, units, id(仅第一个 transducer 组) |
接收规则(驱动行为)
- 仅处理以
$开头的语句 — 不支持!encapsulation(AIS 的 AIVDM / AIVDO)。 - checksum(
$~*区间 XOR)不一致的语句将被丢弃。无 checksum 的语句(部分旧型设备)予以接受。 - talker 两个字符(GP / GN / GL / HC / II …)会被自动去除 —
$GPRMC与$GNRMC缓存在同一个RMC键下,对外呈现最后接收的值。proprietary$P...语句不做 talker 分离,直接作为键。
数据类型匹配
值以 sentence 字段的 ASCII 原文原样呈现 — 驱动不做单位 / 坐标转换。
| sentence 字段 | 数据类型 | 类型辅助 |
|---|---|---|
| 航速 / 水深 / 高度 / DOP 等数值字段 | Float | REAL |
| Fix 质量 / 卫星数 | Integer | (留空) |
| 纬度 / 经度(DDMM.MMMM 原文) | Float(+ 建议用计算公式转换) | REAL |
| UTC 时刻 / 状态字符 (A/V) / raw 语句 | String | STR[80] |
NMEA 经纬度采用“度度分分.分分”格式(例:4807.038 = 48°07.038′),驱动不会转换为十进制度(decimal degree)。若需要十进制度,请通过应用计算公式为标签设置转换式。
常见问题与解决
| 现象 / 消息 | 可能原因 | 解决 |
|---|---|---|
| “Connection refused” | NMEA 路由器的 TCP 端口未开放 | 在多路复用器(Brookhouse / Actisense / NavLink2)设置中启用 TCP server |
| 只有部分 sentence 收不到 | 设备未发送该 sentence | 在设备手册中确认发送 sentence 列表 |
| 经纬度是异常的大数值 | DDMM.MMMM 原文原样呈现(正常行为 — 驱动不做转换) | 通过应用计算公式转换为十进制度 |
| 收不到 AIS (AIVDM) 值 | 不支持 ! encapsulation(仅处理 $ 语句) | 经由独立 AIS 解码器接入(参见下方提示) |
| 同一语句由多个 talker 发送 | 去除 talker 后键相同 — 仅呈现最后接收的值 | 在路由器上应用 talker filter |
| Sentence 进入速度过快 | NMEA 通常为 1Hz~10Hz | 将标签 polling 周期设为 1 秒,即可获取最后的值 |
常用示例
船舶的基本 GPS + 环境传感器组合:
| 标签名称 | 地址 | 数据类型 | 类型辅助 |
|---|---|---|---|
| 纬度 (DDMM.MMMM) | RMC.lat | Float | REAL |
| 经度 (DDDMM.MMMM) | RMC.lon | Float | REAL |
| 航速 (knots) | RMC.speed | Float | REAL |
| 卫星数 | GGA.sats | Integer | (留空) |
| Fix 质量 | GGA.fix | Integer | (留空) |
| 风向角 | MWV.angle | Float | REAL |
| 风速 | MWV.speed | Float | REAL |
| 水深 (m) | DPT.depth | Float | REAL |
| 陀螺航向 | HDT.heading | Float | REAL |
AIS(船舶识别)是叠加在 NMEA 0183 之上的独立载荷。若需要解码 AIVDM / AIVDO sentence 的 binary payload,建议经由独立 AIS 解码器(gpsd / aisutils)接入。
更详细的示例 / 自动化注册
- 高级 — REST API 中的 NMEA 示例
- 技术详情:NMEA 0183 驱动(advanced)