Sisällysluettelo |
This is a work-in-progress specification for passing parsed AIS data in human- and computer-readable JSON format. If you have ideas for this specification, please email Heikki Hannikainen, OH7LZB (hessu at hes dot iki dot fi).
This protocol is useful for transmitting AIS data between AIS receiver sites and live AIS database services, and also for transmitting AIS data between AIS database services which choose to trust each other and exchange data.
This specification was initially implemented by Lekkas Dimitris of marinetraffic.com, and documented by Heikki Hannikainen of aprs.fi. Additional feedback has been received from Tapio Sokura, OH2KKU.
This document defines three levels of JSON messages.
First, after decoding the AIS packets they are encoded into AIS packet messages. They contain data from the AIS message itself.
Then, when a set of AIS packet messages are transmitted between two trusted servers, they are grouped in packet group messages per transmission path. The packet group message contains the path the packets have traveled so far, and an array of AIS packet messages. This is done to reduce network traffic - we will have a lot of packets having the same transmission path ('Receivingsite1', 'aprs.fi', 'marinetraffic.com'), so it is not necessary to transmit the path separately with each AIS packet message.
The packet group messages are then, optionally, enclosed in a transport message. The transport message contains identifiers for detecting that the received message is a valid JSON AIS message, and might at a later phase contain a protocol version number, if the protocol needs to be extended in a non-compatible way. The transport message can be used when packet group messages are transmitted over HTTP pushing/polling, but might not be necessary when a stream of packet group messages are transmitted over a persistent TCP connection, since the relevant handshaking information can be exchanged once when the connection is opened.
If you don't have data for a certain field, do not include that key at all.
Packet types 1-3 are used by AIS class A transponders (usually large commercial vessels) and types 18-19 by class B transponders (pleasure boats and other small vessels).
Type 24 packets are different from most other AIS packets in that the data fields of the packet vary depending on the packet subtype, called part (number). The actual data fields are identical in their interpretation and contents to the corresponding class A (packet type 5) fields, except vendorid (doesn't exist for class A transponders).
Part 0 (A) fields:
Part 1 (B) fields:
These examples have been formatted with extra whitespace for readability. JSON doesn't care about whitespace in the elements, so while these are valid JSON AIS messages, they should be transmitted in a more compact format (no line feeds and spaces between the elements).
An AIS position report for a single ship:
{
"msgtype": 3,
"mmsi":2320787,
"status":14,
"speed":0,
"lon":-1.11023795604706,
"lat":50.7996215820313,
"course":0,
"heading":0,
"timestamp":"20081013091401"
}
An AIS ship/voyage information report:
{
"msgtype": 5,
"mmsi":211189000,
"imo":8705383,
"callsign":"DQEJ",
"shipname":"SASSNITZ",
"shiptype":69,
"length":0,
"width":0,
"eta":"20081014101000",
"draught":58,
"destination":"TRELLEBORG/SASSNITZ",
"timestamp":"20081013091717"
}
A complete packet group message with path data and a couple of ship positions. These positions were received by the receiving station called "OH7LZB", who gave it to marinetraffic, who in turn forwarded the data to aprs.fi.
{
"path": [
{ "name": "aprs.fi", "url": "http://aprs.fi/" },
{ "name": "marinetraffic", "url": "http://www.marinetraffic.com/" },
{ "name": "OH7LZB" }
],
"msgs": [
{
"msgtype": 3, "mmsi":2320787, "status":14, "speed":0,
"lon":-1.11023795604706, "lat":50.7996215820313,
"course":0, "heading":0, "timestamp":"20081013091401"
},
{
"msgtype": 3, "mmsi":1850257, "status":14, "speed":4,
"lon":-3.26425604706, "lat":50.264556,
"course":30, "heading":32, "timestamp":"20081013091403"
},
{
"msgtype": 3, "mmsi":9124762, "status":14, "speed":10,
"lon":2.12512412, "lat":52.153213,
"course":321, "heading":319, "timestamp":"20081013091405"
},
{
"msgtype": 5, "mmsi":211189000, "imo":8705383, "callsign":"DQEJ",
"shipname":"SASSNITZ", "shiptype":69, "length":0, "width":0,
"eta":"20081015103000", "draught":58,
"destination":"TRELLEBORG/SASSNITZ", "timestamp":"20081013091717"
}
]
}
This format is used for passing JSON AIS messages using a polling mechanism. A client receives AIS data from a server by doing HTTP GET requests from a specific URL (for example, http://ais-server.example.com/jsonais/get). The server should require authentication (for example, using HTTP BASIC authentication, or by using a secret URL component). If no authentication is done, and anyone is allowed to upload data without ways to restrict abuse, the system will eventually be spammed or abused with rubbish data.
The client can request data updated within a specific time range by using the firsttime and lasttime parameters. Time is specified in UTC format, YYYYMMDDHHMMSS (13 October 2008 12:34:56 UTC would be 20081013123456). The matching logic is firsttime <= updatetime < lasttime. With a polling interval of 60 seconds, at t=20081013120100 the client would ask for firsttime=20081013120000&lasttime=20081013120100, and at t=20081013120200 it would ask for firsttime=20081013120100&lasttime=20081013120200). This way the client will only receive each updated point once, and the server can optimize it's backend database queries too.
The time used in the firsttime/lasttime queries is UTC time when the packet message was received by the server. This corresponds to the servertime key in the packet message, not rxtime. This ensures that all packets are correctly transferred from the server to the client.
The client can also require excluding data which has passed through a specified JSON AIS server. This is done using the URL parameter excludepath. For example, excludepath=aprs.fi would filter out all entries which have "name"="aprs.fi" in the path.
The JSON AIS messages are returned by the server in transport message which specifies the protocol name (jsonais) and contains an array of packet group messages. This container is used so that we can extend the protocol later by adding fields here.
Fields of the HTTP transport message:
The content-type given by the server should be application/json, which is the content-type specified by the JSON RFC.
Example:
{
"protocol": "jsonais",
"encodetime": "20081210215137",
"groups": [
{ "path": [ ..path1... ], "msgs": [ { "msgtype: 5, .... }, { "msgtype": 3 }, ... ] },
{ "path": [ ..path2... ], "msgs": [ { "msgtype: 5, .... }, { "msgtype": 3 }, ... ] },
{ "path": [ ..path3... ], "msgs": [ { "msgtype: 5, .... }, { "msgtype": 3 }, ... ] }
]
}
This format is used for passing JSON AIS messages using a pushing mechanism. A client transmits AIS data to a server by doing HTTP POST requests to a specific URL (for example, http://ais-server.example.com/jsonais/post). This is generally the easiest way to post JSON AIS data from a receiving station to a server, as it will get through mostly all firewalls and proxies.
The array of AIS messages are formatted in a HTTP transport message, similarly to the HTTP GET method, and then encoded in a variable named jsonais of a HTTP POST request. Standard HTTP POST encoding methods are used - they can handle binary data, so JSON should go in just fine.
This protocol is used for passing JSON AIS messages over a TCP stream. This has the least network overhead, since the connection is open all the time. It also provides the least latency, since the messages can be transmitted at any time, without a need for a polling timer.
A trusted server should authenticate all clients. If unauthenticated connections are allowed in a network of database services, it is certain that at some point rubbish and spam will enter the network.
Each connection only carries data to one direction - from the client to the server. If bidirectional communication is needed, two connections should be formed.
The username and password can be whatever the server administrator chooses to use. Usernames could be email addresses or plain names. Because this communication is typically not encrypted, the password should be specific to the AIS application. If the AIS server system has features which require a higher level of security, it might choose to use separate passwords for authenticating the users on the SSL-encrypted web site, and to assign separate random passwords for each user for the purpose of AIS packet feeding.
{
"protocol": "jsonais",
"command": "login",
"username": "users.email@gmail.com",
"password": "password"
}
{
"protocol": "jsonais",
"command": "login",
"result": "ok",
"description": "Login successful, welcome"
}