Feeding AIS data to a Furuno NavNet VX2 plotter with a Raspberry Pi
We have an old USCG Safeboat Defender, and currently the electronics setup looks something like this:
There is an old generation NavNet VX2 plotter at the core of the system taking inputs from GPS, Radar and Heading Sensor and a Network Sounder directly connected to the NETWORK port. The NMEA 0183 serial output from DATA2 is being sent to the VHF Radio for DSC and to the NMEA 2000 network for inclusion on the RD-33 display.
I want to add AIS data into the mix. AIS will let me receive data from a second VHF antenna that is broadcast by vessels with AIS transponders about their location, speed, heading etc. I would like to view the AIS data on the NavNet VX2 chart plotter and also on my iPad using the Navionics software.
Furuno forums say that the only way to bring AIS data into the plotter is either via DATA2 (NMEA 0183) or the NETWORK. Due to the high volume of AIS data DATA2 can struggle to keep up and so if using that method it needs to be a dedicated AIS-only input and can’t emit sentences in this mode. As I’m using DATA2 to bridge to the NMEA2000 network — I would loose the ability, so the NETWORK seems like the best option.
dAISy for Raspberry Pi
WegMatt makes this nifty AIS receiver board that can integrate with a Raspberry Pi and it’s only $69. Before investing in a commercial AIS solution, I wanted to get this wired up to see how useful AIS will be and if I want it as a permanent addition.
The Rough Plan
The idea is to add a switch to the network to allow the Network Sounder and Raspberry Pi to interface with the NavNet VX2 via ethernet. The Pi will receive AIS information from its onboard receiver connected to a spare antenna on the roof and send that information on the network to the NavNet VX2. I will also configure the Pi’s network card to operate as a “Wi-Fi Access Point” — allowing me to connect an iPad to it and get AIS data into Navionics.
Setup Raspberry Pi
I’m using a Pi Model 3B for this, more than enough compute and uses less power than using a Pi Model 4.
With the Pi in hand and dAISy hat installed, I installed Raspberry Pi OS Lite skipping the heavier Desktop version using the Raspberry Pi Imager.
Setup SSH
I’m going to do everything from the command line interface and don’t want to use a keyboard and monitor — so need to be able to connect remote. After flashing the SD card with the Pi image, I opened the ‘boot’ drive and created a file called ‘ssh’ (no extension) with nothing in it (See option 3 for more detail), so that SSH was enabled on first-boot.
Network Configuration
I’m going to setup the Pi a slightly unusual way. On the LAN side, I want the Pi to look like a Furuno FA-30 (AIS Receiver) to the NavNet VX2. On the WLAN (Wireless) side I want it to act as an “Access Point” so that I can connect to the network from an iPad or Laptop and see AIS data in Navionics or OpenCPN.
By default the FA-30 runs on IP address 172.31.24.2, so I will use this for my static LAN IP Address. In my case I have the NavNet VX2 running on IP 172.31.3.1 and the Network Sounder on on 172.31.92.1.
When we read AIS data off the Serial interface of the dAISy — those AIS sentences will get sent out as UDP packets on both the LAN side — broadcast to 172.31.255.255 subnet and the WLAN side.
Setup the Pi as a Wireless Access Point
The first step is to setup our Wi-Fi network as a Routed Wireless Access Point. There are a fairly lengthy set of steps to do this right, as you also need to setup a DHCP server to hand out IP Addresses to devices that will be connecting on wireless. How to do this is covered really well in this tutorial. If you follow the steps you should end up with a Wi-Fi network you can now join that will give you a 192.168.4.x address. We will use the Pi’s 192.168.4.1 address to configure Navionics or OpenCPN software later once all the AIS plumbing is in place.
Setup the Pi LAN Interface
Open /etc/dhcpcd.conf in your favorite editor and set configure the LAN network (eth0) to be be as follows:
interface eth0
static ip_address=172.31.24.2/16
static routers=172.31.24.1
This sets up our IP address to be static 172.31.24.2 (the same as an FA-30 unit) and the /16 says the subnet is 172.31.255.255 which will be used for broadcast UDP packets.
Setup the dAISy Serial Interface
WegMatt the makers of dAISy have a great quick start guide that goes over how to setup the Serial connection. Follow the steps here.
The final part of the puzzle
Most people when they are doing this kind of NMEA mulitplexing use a took called kplex. Which is robust and handy way to get NMEA data in and out of various interfaces. However, I ran into a problem. The Furuno NavNet VX only accepts NMEA over UDP on ethernet if it has a special proprietary preamble in it. This meant I couldn’t use kplex at this time as it didn’t support this output format, so I had to build my own app to do this. Enter the ‘dAISyFuruno server’…
Installing the dAISyFuruno server
The last step is setting up the software that will read from the serial interface and output UDP packets with AIS data to the NavNet VX2. This program is written in NodeJS — so we need to install the NodeJS runtime first.
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.37.2/install.sh | bash$ nvm install node
Clone the repo and install the packages:
$ git clone https://github.com/brettmarl/dAISyFuruno.git
$ cd dASISyFuruno
$ npm install
Lets run it to do a quick test that everything is working:
$ npm start
Should see ‘[Connected to dAISy on …]’ and some AIS output (hopefully). Now lets get it running every time we boot by utilizing PM2 — a startup manager for Node apps.
$ npm install pm2@latest -g
$ pm2 start index.js
$ pm2 startup
(run the command it tells you to)
$ pm2 save
You should now be able to reboot and things will come back up.
If you want to see how things are going you can use
$ pm2 logs
If needed, you can make some changes to config.json.
By default it looks like this:
{
"dAISyInput":
{
"device" : "/dev/serial0",
"baudRate" : 38400,
"dataBits" : 8,
"parity" : "none",
"stopBits" : 1
},
"UDPOutputs" :
[
{
"enabled" : true,
"comment" : "broadcast to LAN for NavNet in Furuno format",
"broadcast_addr" : "172.31.255.255",
"broadcast_port" : 10021,
"furuno_mode" : true
},
{
"enabled" : true,
"comment" : "broadcast to WLAN for Navionics",
"broadcast_addr" : "192.168.4.255",
"broadcast_port" : 10110,
"furuno_mode" : false
}
]
}
dAISyInput allows you to configure however you setup the Serial port. If you didn’t do anything different — it comes with default settings.
UDPOutputs allows you to configure what AIS messages get echoed on to the network. We sent out one to the LAN side of the network to broadcast 172.31.255.255 so that the NavNet VX2 will pick up the info. You’ll also notice that there is a furuno_mode set to true. This emits the Furuno-specific preamble before the AIS message that the NavNet expects from a Furuno AIS receiver. Without this it will not work.
On the WLAN side, we send out packets to 192.168.4.255.
Setting up Navionics on an iPad
Once up and running you can use the following settings to configure Navionics on an iPad:
- Connect to your Pi Wifi network
- Goto Navionics > Menu | Paired Devices
- Use these Settings:
host: 0.0.0.0
port 10110
UDP
Setting up OpenCPN on a PC
Assuming connected to the Wireless network vs. ethernet.
- Open CPN > Settings | Add Connection
- Use the following:
UDP
Address: 0.0.0.0
Port: 10110
If you want to connect via a PC on Wired ethernet, you will either have to emit another UDP packet by adding a 3rd section that doesn’t include the Furuno preamble on a different port. Or you can try an experimental feature of OpenCPN where they can ingest the Furuno formatted packets. Follow this guide and add the following to your opencpn.ini:
EnableUDPNullHeader=1
The Results
So far it’s working pretty good in a temporary setup. Going to wire things in more permanently to the rooftop Antenna and see how useful it is.