본문으로 건너뛰기

NMEA 0183 (해양 / 선박)

NMEA 0183 은 미국 National Marine Electronics Association 이 1983년에 표준화한 해양 / 선박 장비용 ASCII 통신 규약입니다. GPS / 자이로 컴퍼스 / 풍속계 / 어군탐지기 / AIS 등 거의 모든 해양 센서가 이 sentence 포맷을 씁니다.

게이트웨이의 NMEA 드라이버는 TCP (NMEA over IP) 로 sentence stream 을 받아 checksum (XOR) 검증 후 sentence type 별로 필드를 파싱해 노출합니다. 읽기 전용 입니다.

UDP 멀티캐스트로 받는 선교 장비라면

선박 통합 브리지처럼 IEC 61162-450(Lightweight Ethernet) 으로 문장을 멀티캐스트하는 환경은 IEC 61162-450 드라이버 를 사용하세요. 문장 파서가 동일하므로 태그 주소 표기와 alias 는 이 문서와 완전히 같습니다.


등록 폼 입력값

입력 칸무엇을 적나요예시
IP 주소NMEA 다중화기 / 라우터 IP192.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.7RMC 의 7번 필드 (대지속력 kn)
GGA.2GGA 의 2번 필드 (위도)
RMC.latalias — 아래 표 참조 (대소문자 무관)
RMC(필드 생략) 마지막 수신 raw 문장 전체

alias 가 정의되지 않은 sentence type 도 필드번호 (XXX.3) 로는 접근할 수 있고, 타입만 적으면 raw 문장 전체를 문자열로 받습니다.

옛 표기와 다릅니다

콜론 표기 (RMC:lat) 와 RAW:<문장타입> 표기는 지원하지 않습니다 — 각각 RMC.lat, <문장타입> (타입만) 으로 등록하세요. satellites / windAngle / windSpeed 같은 긴 이름 alias 도 없습니다 — 실제 alias 는 sats / angle / speed 입니다 (아래 표가 드라이버 정의 전체).

지원 sentence / alias 전체 (드라이버 정의)

sentencealias
RMCutc, status, lat, ns, lon, ew, speed (kn), course, date, magvar, magvarew, mode
GGAutc, lat, ns, lon, ew, fix, sats (위성 수), hdop, alt, altunit, geoidsep, sepunit, dgpsage, dgpsid
GLLlat, ns, lon, ew, utc, status, mode
VTGcogtrue, cogmag, speed (kn, = speedkn), speedkm (km/h), mode
GSAmode1, mode2, pdop, hdop, vdop
GSVtotalmsgs, msgnum, satsinview
HDTheading (true), t
HDMheading (magnetic), m
MWVangle (풍향각), ref (R/T), speed (풍속), units, status
DBTdepthft, depthm (= depth, m), depthfa
DPTdepth (m), offset, max
MTWtemp, units
VHWheadingt, headingm, speed (kn), speedkm
ZDAutc, day, month, year, tzh, tzm
XDRtype, 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 등 수치 필드FloatREAL
Fix 품질 / 위성 수Integer(비움)
위도 / 경도 (DDMM.MMMM 원문)Float (+ 계산식 변환 권장)REAL
UTC 시각 / 상태 문자 (A/V) / raw 문장StringSTR[80]
위경도는 DDMM.MMMM 원문

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.latFloatREAL
경도 (DDDMM.MMMM)RMC.lonFloatREAL
속도 (knots)RMC.speedFloatREAL
위성 수GGA.satsInteger(비움)
Fix 품질GGA.fixInteger(비움)
풍향각MWV.angleFloatREAL
풍속MWV.speedFloatREAL
수심 (m)DPT.depthFloatREAL
자이로 헤딩HDT.headingFloatREAL
AIS 는 별도

AIS (선박 식별) 는 NMEA 0183 위에 얹힌 별개 페이로드입니다. AIVDM / AIVDO sentence 의 binary payload 디코딩이 필요하면 별도 AIS 디코더 (gpsd / aisutils) 를 거쳐 들이는 것을 권장합니다.


더 자세한 예제 / 자동화 등록