RT820T based RTL SDR USB dongle
1/4 wave groundplane antenna / moxon loop
I have a raspberry Pi 2 running with RTL-SDR USB stick successfully feeding AIS to marinetraffic.com and to my local network. The rough steps (and links to guides are below)
Start with fresh install of raspbian Jessie lite 2016-5-10
Install RTL SDR on Raspberry Pi and add to blacklist of USB devices: http://goo.gl/tXnW13.
sudo apt-get update
sudo apt-get install git
sudo apt-get install cmake
sudo apt-get install libusb-1.0-0.dev
sudo apt-get install build-essential
sudo apt-get install cmake
sudo apt-get install libusb-1.0-0.dev
sudo apt-get install build-essential
Now install the RTL-2832U USB dongle driver src and compile
git clone git://git.osmocom.org/rtl-sdr.git
cd rtl-sdr/
mkdir build
cd build
cmake ../
make
sudo make install
sudo ldconfig
cd rtl-sdr/
mkdir build
cd build
cmake ../
make
sudo make install
sudo ldconfig
Edit the following file /etc/modprobe.d/raspi-
use your favourite editor like nano or vi
sudo nano /etc/modprobe.d/raspi-
add the following lines in the file.
blacklist dvb_usb_rtl28xxu
blacklist rtl2832
blacklist rtl2830
Save and exist.
(ctrl-X --> y -->enter)
REBOOT then plug in your RTL-SDR stick
Confirm the RTL is working using rtl_test first before proceeding:
sudo rtl_tcp -t
Install gnuradio(dev) http://goo.gl/TVogHw (takes a long time!) :
sudo apt-get install gnuradio gnuradio-devinstall osmosdr:
sudo apt-get install gr-osmosdr
install Boost
sudo apt-get install libboost1.50-all
install Cppunit:
sudo apt-get install libcppunit-dev
install liblog4cpp5:
sudo apt-get install liblog4cpp5-dev
install socat:
sudo apt-get install socat
install swig:
sudo apt-get install swig
install gr-ais https://goo.gl/QXXzhO. :
git clone https://github.com/bistromath/gr-ais.git
cd gr-ais
mkdir build
cd build
cmake ../
if you get an error at this point:
CMake Error at CMakeLists.txt:114 (find_package):
Could not find a configuration file for package "Gnuradio" that is
compatible with requested version "3.7.6".
then edit cmake to force 3.75 (a bodge, but works!):
cd ~/gr-ais
nano CMakeFiles.txt
find the section #Find gnuradio build dependencies
edit the line:
find_package(Gnuradio "3.7.6" REQUIRED)change to
find_package(Gnuradio "3.7.5" REQUIRED)
exit nano(Ctrl-x -->y-->enter)
resume with building:
cd ~/gr-ais/build
cmake ../
make
sudo make install
sudo ldconfig
if you get an error
ImportError: No module named ais_swig
then check you have installed swig, reboot and then re-try the steps to build gr-ais
Install and run "kal" :
mkdir ~/src
cd ~/src
sudo apt-get install libtool autoconf automake libfftw3-dev
git clone https://github.com/asdil12/kalibrate-rtl.git
cd kalibrate-rtl
git checkout arm_memory
./bootstrap
./configure
make
sudo make install
" to calibrate the RTL dongle to work out the error value to use in ais_rx
http://goo.gl/wbqOts. MY RTL dongle had an error of around minus 33 ppm, and this is the value passed to ais_rx below. replace with your error value. As the dongle warms up this value may change so check again after some time. don't forget to put an antenna on your SDR stick.
in the UK we have 900MH\ gsm base stations. for the US this is usually 850MHz. Command below is for 900MHz :
sudo kal -s 900
this will give you a channel number of a nearby GSM station
use the channel number to get a calibration value. e.g. below found chan: 114
sudo kal -c 114
this will then give you a ppm value -make note of it below
average absolute error: -33.163
profile your hardware by running the following command: (takes a long time!)
volk_profile
You can then pipe AIS messages to MarineTraffic using "socat" (sudo apt-get install socat) using the command below (where 1.2.3.4:1234 should be changed for your marinetraffic upload IP and port and --error -33 should be changed for your error value obtained from kal
ais_rx --gain 44 --error -33 -s osmocom | socat - UDP4-DATAGRAM:1.2.3.4:1234
if you run OpenCPN on a computer on your LAN, you can send the traffic to that at the same time as marinetraffic (assuming your OpenCPN computer is running on LAN 192.168.1.101:9999) and also pipe the raw AIS sentences to the console for confirmation of reception:
ais_rx --gain 44 --error -33 -s osmocom | tee >(socat - UDP4-DATAGRAM:1.2.3.4:1234) | tee >( socat - UDP4-DATAGRAM:192.168.1.101:9999)
to keep this running when you disconnect your console session, create a file and save the above commandline into it:
touch ~/ais.sh
sudo nano ~/ais.sh
paste the above commandline into file and save (Ctrl-x Ctrl-y)
make the file executable
sudo chmod +x ais.sh
Then to run as background process on startup, edit /etc/rc.local to have it run on startup)
sudo nano /etc/rc.local
paste the following line into it and save
/home/pi/ais.sh &
It is fairly processor-intensive on the Pi - 100% of two cores and 50-75% of the remaining cores.
I am no raspberry pi expert so optimisations could be made for sure. I'm happy to make my SD card image available to anyone who wants a copy, but I don't have sufficient hosting for the image file.
As the script runs headless on startup, no output is sent to the console by default.
To see it is working you can either
a) open up OpenCPN and see the traffic
b) sniff the network traffic on the destination computer using nc -l -n 192.168.1.101 9999 (linux)
c) sniff the network traffic using Wireshark (windows)
d) You can use rTail and pipe the output of the AIS parser to stream it to a webpage hosted on your Pi