Your wind gear, your chartplotter, your autopilot and your radar were probably made by people who would rather you bought everything from them. They still have to talk over something. Here's what that something is, what it actually looks like on the wire, and where open source gets you past the fences.
Before anything else
None of what follows would be possible without Kees Verruijt. He reverse engineered NMEA 2000 from scratch and gave it away as CANboat — one man cracked it open for everybody. If you run Signal K or OpenCPN, you are using his work right now.
The initials nobody explains
National Marine Electronics Association.
They're a US trade body, founded in 1957 — a group of marine electronics dealers who met at the New York Boat Show and decided they'd get further working together than separately. Not a government agency, not a regulator. A members' organisation of manufacturers, dealers and installers.
Their useful contribution is standards. Before them, every manufacturer's gear spoke only to its own. NMEA got the industry to agree on a common language so a depth sounder from one company could feed a display from another. They published NMEA 0183 in 1983, NMEA 2000 around the turn of the century, and OneNet for ethernet since.
The standards documents are sold, not published. You can buy them, and they are not cheap. For a hobbyist wanting to read their own boat's data, that's a wall — which is exactly the wall Kees Verruijt went around by reverse engineering NMEA 2000 from scratch and giving the result away.
So when you read a PGN on this page, you're reading it through one man's work rather than through the official document.
Everything on a boat is one of these
| What it carries | Speed | The cable | Open? | |
|---|---|---|---|---|
| NMEA 0183 | text sentences | 4,800 baud | two wires | Yes |
| NMEA 2000 | small binary messages | 250 kbit/s | one shared backbone | Mostly |
| Ethernet | radar and sonar pictures | 100 Mbit/s + | ordinary Cat5 | No |
Every argument about marine electronics compatibility comes down to which of those three a thing uses, and whether anyone has written down the format.
1983, and still going
0183 is plain text. No decoding, no tooling. If you can see the wire, you can read the data.
$GPVTG,164.0,T,175.2,M,0.0,N,0.0,K,A $WIMWV,274.1,R,11.7,N,A $SDDBT,,f,,M,,F
Each line is a sentence. The first two letters after
the $ say who is talking — GP is GPS,
WI is wind, SD is a sounder. The next three
say what kind of message it is. Then comma-separated fields, and a
checksum on the end so the listener can tell if it arrived intact.
How it works: one device talks, and anything wired to it listens. That's the whole model. It's a one-way conversation down a pair of wires at 4,800 bits a second — about 40 sentences a second if you push it.
The catch: one talker per wire. Want your GPS heard by three things? You wire it to three things, or buy a multiplexer. It's slow, it's clumsy, and it is still on almost every boat afloat because it is dead simple and it never stops working.
Every field in one sentence
Here's a real one off this boat. It scrolls past about forty times a second, which is why nobody ever stops to look at it:
$GPVTG,164.0,T,175.2,M,0.0,N,0.0,K,A*23
| Piece | What it is |
|---|---|
$ | Start of sentence. Everything before this is noise. |
GP | Talker ID — who is speaking. GP is a GPS. |
VTG | Sentence type — Course Over Ground and Ground Speed. |
164.0 | Course over ground |
T | …and that one was True |
175.2 | Course over ground again |
M | …this time Magnetic. The 11.2° gap is local variation. |
0.0 | Speed over ground |
N | …in kNots |
0.0 | Speed over ground |
K | …in Kilometres per hour. Same number, both units. |
A | Mode. A = autonomous fix, good data. |
*23 | Checksum. See below. |
That's the whole design. A label saying who's talking, a label saying what kind of message, then comma-separated values where each number is followed by a letter telling you its units.
$WIMWV,274.1,R,11.7,N,A
WI = Weather Instruments. MWV = Wind Speed
and Angle. Wind at 274.1°, R for
Relative (apparent, not true),
11.7 knots, A for valid.
That *23 on the end is a two-digit hex number. To make
it, the talker takes every character between the $ and
the * and XORs them all together. The listener does the
same sum and compares.
It costs almost nothing to compute and it catches the single-character corruption you get from a noisy wire on a boat. Forty-year-old engineering, still doing its job.
GP GPS | GN combined GNSS |
SD depth sounder | WI weather |
HC magnetic compass | HE gyro |
AI AIS | VW water speed |
II integrated instruments | IN integrated nav |
EC chart system | RA radar |
RMC | Recommended minimum — position, speed, course, date. The workhorse. |
GGA | Fix data — position, satellites used, fix quality, altitude |
VTG | Course and speed over ground |
DBT / DPT | Depth below transducer / depth with offset |
MWV / MWD | Wind angle and speed / wind direction |
MTW | Water temperature |
HDG / HDT | Heading, magnetic / true |
VDM / VDO | AIS — other vessels / your own |
GSV | Satellites in view |
Learn those and you can read most of what crosses an 0183 wire without looking anything up.
A network instead of a wire per device
N2K fixed the one-talker problem. Everything hangs off one backbone and everything hears everything.
Underneath, it is CAN bus — the same technology your car uses to let the engine talk to the dashboard. 250 kilobits a second, shared by every instrument aboard. Messages are tiny: eight bytes at a time.
Here is the depth sounder on this boat, as it actually appears:
0DF50B05#FF19020000000099
| | | | |
| | | | +-- max range
| | | +----- transducer offset
| | +-------------- 537 x 0.01 m = 17.6 ft
| +----------------- sequence tag (unused)
+-------------------------- priority 3, PGN 128267, from device 5
That PGN — Parameter Group Number — is the key. 128267 means "water depth" on every N2K boat in the world, regardless of who built the sensor. 127250 is heading. 130306 is wind. It is a shared dictionary, and that is why a Garmin display can read a Airmar sensor.
This part costs people money. Raymarine sell SeaTalkNG. Simrad and B&G sell SimNet. Furuno have CAN bus. They come in different colours with different plugs and they are sold as if they were different systems.
They are all NMEA 2000. Same two signal wires, same power pair, same 250 kbit CAN bus, same PGNs. What differs is the connector moulded on the end. An adapter cable — which every one of those manufacturers will happily sell you — makes them the same network, because they always were.
The same depth message, taken apart
N2K isn't text, so you can't just look at it. But it's not complicated either — it's an address followed by eight bytes. Here's the depth sounder on this boat:
0DF50B05#FF19020000000099
\_______/ \______________/
address eight data bytes
That 0DF50B05 is a 29-bit CAN identifier, and it's packed
with three separate pieces of information:
| Field | Where | Value | Meaning |
|---|---|---|---|
| Priority | top 3 bits | 3 | How urgent. Lower wins the bus. 3 is normal instrument data. |
| PGN | middle 18 bits | 128267 | What this message is. 128267 means Water Depth, on every boat in the world. |
| Source | bottom 8 bits | 5 | Which device said it. Devices claim an address when they join the bus. |
Work it the other way and it reassembles exactly:
priority 3 shifted up 26 bits, plus PGN 128267 shifted up 8,
plus source 5, gives 0x0DF50B05. That's the whole
addressing scheme.
| Bytes | Field | Here |
|---|---|---|
FF | Sequence ID — ties related messages together | 255, meaning unused |
19 02 00 00 | Depth, 32-bit, 0.01 m per count | 537 × 0.01 m = 5.37 m = 17.6 ft |
00 00 | Transducer offset — to waterline or keel | zero, not configured |
99 | Maximum range, 10 m per count | 153 × 10 = 1530 m |
19 02 00 00 reads as 0x00000219 = 537, not 0x19020000.
That's little-endian — least significant byte first.
CAN does it, your PC does it, and it trips up everybody the first
time.
127250 | Vessel heading | 128267 | Water depth |
129025 | Position, rapid update | 129026 | Course and speed over ground |
130306 | Wind data | 130310 | Environmental — water temp, pressure |
127245 | Rudder angle | 127508 | Battery status |
129029 | GNSS position data | 126996 | Product information |
A CAN frame carries eight bytes and no more. Plenty of messages need more than that — a GNSS position fix with satellites and accuracy runs to dozens.
The answer is fast-packet: the sender chops the message into eight-byte pieces, numbers them, and the receiver glues them back together. It works, and it's a large part of why reading N2K properly is harder than it looks — and why a complete PGN database took one person years to build.
Ordinary network cable, extraordinary secrecy
Radar and sonar imagery will not fit on NMEA 2000. Not even close. So manufacturers run a second network: plain ethernet, the same Cat5 cable as a home router.
On this boat the radar streams to one multicast address and the fishfinder to another. Any machine on that network can ask for a copy — which is exactly how our Raspberry Pi gets them.
| Stream | Address | Rate |
|---|---|---|
| Quantum radar | 232.1.216.1:2574 | 250 spokes/rev |
| Axiom fishfinder | 226.192.224.0:3221 | 71 pings/sec, 157 kB/s |
The cable is standard. The connectors are standard. Only the format is secret, and only because nobody published it. That is the one real wall left, and it is made of paperwork rather than technology.
Which is why we sat down and read the bytes.
Why one is open and the other isn't
The depth number is eight bytes once a second, and it is open to everyone. The sonar picture is 150,000 bytes a second, and it is locked. That is not a conspiracy, it is arithmetic: one sonar channel is about five times the entire capacity of an NMEA 2000 network. It was never going to fit, so it never got standardised, so it never got opened.
One is eight bytes. The other is a hundred and fifty thousand. The small one fits on an open standard somebody reverse-engineered in an attic. The big one never did.
The reason any of this matters
A translator in the middle, that speaks all three and belongs to nobody.
On this boat that translator is Signal K, running on a Raspberry Pi. It reads 0183. It reads NMEA 2000. It listens on the ethernet. And it turns all of it into one common set of names that any program can ask for.
What that means in practice:
None of this requires throwing away your marine electronics. We run Raymarine gear and we are glad of it. The open-source layer sits alongside, reads the same wires, and removes the part where one company decides what your own data is allowed to do.