Skip to content


Subversion checkout URL

You can clone with
Download ZIP
C++ decoder for Automatic Identification System for tracking ships and decoding maritime information
C++ Python Makefile HTML CMake
Fetching latest commit...
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
ais Merge branch 'dev' of into dev
bin Better error handling
docs Spelling and cleanup formatting
m4 An autoconf m4/bash macro to configure libais for other libraries. C+…
src Add in the decode_body and vdm tests and bring back pthread flag for …
test Minor cleanup of extra sample messages
third_party Remove .svn
utils Bugfix for collecttypes
.codeclimate.yml Remove leading comment about location of this file.
.gitignore Use py.test for running unittests
.travis.yml Try gcc-5 on travis-ci.
AUTHOR.txt Switch license to Apache 2.0. Version 0.14
CMakeLists.txt Starting over on cmake support
ChangeLog.html ChangeLog for release 0.15
LICENSE Cleanup license file Replacing every x/y pair with a dedicated Ais class instance. Add tes…
Makefile-custom Use g++-5 for coverity scan Start to autoconf build Had svg and link backwards. factor out header initialization of mmsi, repeat and mmsi, plus more …
VERSION Replacing every x/y pair with a dedicated Ais class instance. Add tes… cleanup white space Start to autoconf build
create.sql Fixed getType so that it is now a const method cleanup white space Switch license to Apache 2.0. Version 0.14 Fix ais.decode' exception so that it appears as ais.DecodeException (… Replacing every x/y pair with a dedicated Ais class instance. Add tes… Use py.test for running unittests


Library for decoding maritime Automatic Identification System messages.

See Also

Other open source AIS projects:


Building with legacy Makefile

make -f Makefile-custom test

Building with python

python build
python install

Building with CMake

cmake .



There are two interfaces to libais, one high-level iterator based one and a low-level fast C++ only one. The iterator based interface is accessed the following way:

with open("file.nmea") as f:
    for msg in
        print msg

To use the low-level C++ interface directly, you need to handle multi-line messages and padding yourself:

import ais
ais.decode('15PIIv7P00D5i9HNn2Q3G?wB0t0I', 0)
ais.decode('402u=TiuaA000r5UJ`H4`?7000S:', 0)
ais.decode('55NBjP01mtGIL@CW;SM<D60P5Ld000000000000P0`<3557l0<50@kk@K5h@00000000000', 0)

There is also support for converting parsed messages to the structure output by GPSD / gpsdecode. For full compatibility, you have to write the resulting message dictionaries to a file with json.dump() and add a newline after each message.

import json
import ais.compatibility.gpsd

with open("infile.nmea") as inf:
    with open("outfile.gpsd") as outf:
        for msg in
            gpsdmsg = ais.compatibility.gpsd.mangle(msg)
            json.dump(gpsdmsg, outf)

AIS Specification Documents


The C++ code was switched to the Google style in November, 2012. Indenting should be by 2 spaces.

Something went wrong with that request. Please try again.