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 (de-facto 표준) / 4001 (장비별) |
- 문자셋은 US-ASCII 고정 입니다 (폼 옵션 없음).
- 고급 옵션
nmea.port(폼 미노출 — REST API 등록 시options로만 지정): 값이 있으면 위 폼의 포트 대신 이 값으로 접속합니다.
NMEA 0183 은 sentence 단방향 broadcast 가 일반적입니다. 게이트웨이는 read-only 로 동작합니다. 장비 제어가 필요한 환경이라면 NMEA 2000 / Modbus 게이트웨이를 별도로 두세요.
태그의 PLC 주소 표기
주소는 <문장타입>.<필드번호|alias> — 점(.) 표기 입니다. 필드번호는 talker 2자를 제외한 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:<문장타입> 표기는 지원하지 않습니다 — 각각 RMC.lat, <문장타입> (타입만) 으로 등록하세요. 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 2자 (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)