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
Branch: master
Failed to load latest commit information.
ais Merge branch 'ignore-station-flag'
bin Better error handling
docs Spelling and cleanup formatting
m4 An autoconf m4/bash macro to configure libais for other libraries. C+…
src Initialize num_bits in AisMsg::AisMsg. CID 116341. And revert to the …
test Merge branch 'multiline-multistation-bugfix' of…
third_party Remove .svn
utils Bugfix for collecttypes
.codeclimate.yml Remove leading comment about location of this file.
.gitignore Moved compatibility tests to follow the common structure
.travis.yml Only do C++ gunit tests with python 3.4 (schwehr/libais#87)
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… Added install_requires.


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.