docs/msg_creation_guide.org
* Introduction
None of the documents out in the wild really do a good job talking
about the rights and wrongs of AIS message creation. This is my
attempt to capture best practices. This is based on experience
implementing pure python and pure C++ decoders of AIS, talking ESR
through his writing of a pure python decoder and the GPSD C decoder.
The real solution is to introduce a proper language for describing AIS
messages, but the majority of the community does not see this as a
requirement.
Unsorted initial list:
- All messages must have their overall content broadcast in byte
aligned message, so make your message clear how it byte aligns. A
variable length spare at the end is a good way to do this.
- Do not pad more than to then next byte on the end of your message.
There is no reason to fill out to the end of a slot. Extra space
only increases the chance that VHF noise will corrupt the message.
- Avoid defaults or common with lots of 1 bits in them. This will
trigger bit stuffing more often and cause problems.
- Make sure that values that are needed occur before they are used.
Otherwise you are forcing people code to require random access to
the bit stream.
- Provide example messages, bit streams, and decoded values for people
to test against.
- Provide an example database SQL CREATE command for your message.
This will force you to think carefully about your data structures.
If it has spatial geometry, include both a traditional SQL
definition and a PostGIS spatial version.
- Include a diagram if appropriate!
- Do not reference paywalled documents (e.g. ITU 1371)
- Include the lookup tables locally for things that have tables. Do
not just blindly refer to things like the Beaufort scale. That is
not helpful.
- State all units. For example, you can *not* just say "Salinity".
- Use SI units. Using things like nautical miles or chains for
distances is bad. Use km or m and let the software
presentation interface do the unit conversions to what ever.
- Just because it is done in ITU 1371 does not mean it is a good
idea. e.g. Message 22 and 23.
- On messages 25 and 26, use an DAC/FI pair (aka app id).
Unstructured binary without a specification document is bad. Are we
supposed to use the MMSI to id the content?
- Always specify longitude (x) first and then specify latitude (y)
- Specify the reference datum and only use WGS 84 SRID 4326
- Be very careful with vertical reference datums. It may not be
possible to convert if a different datum is needed on the ship.
- Always specify dates and times in UTC
- An integer scaled by a constant is not "floating point". Reserve
that term for things like IEEE Floats
- If you have a boolean value and want to specify that it can be
unknown, you can use two bits and call out all the options. For
example "Ice Yes/No", say 0==No Ice, 1==Ice Present, 2==Information
not available, 3==Reserved. Use 2 to be unknown to avoid "11" and
an increased chance of bit-stuffing. However, this is a terrible
example. What does it mean to have ice or no ice? That is a huge
question.
- Realize that any data transmitted is sent unencrypted and can be
read by anyone with a receiver (including spacecraft). Transmitted
data is public domain. If you need to keep it private, do not send
it over AIS. *Anyone* can read an addressed message.
- Consider alternative broadcast methods to the VHF data link (VDL).
It has limited bandwidth.
- Try to avoid too much state. Lots of messages where the state has
to be cached can overload small systems. Try to have messages
expire before too long.
- When a value is a decimal scaled value, write out the equation. e.g
-20.0 to 50.0 C should be "deg C = (raw_value / 10.0) - 20."
- Make sure to explain the motivation for a message. Why would this
message be sent. What conditions trigger the message to be sent?
- Do not count on precise timing of AIS messages. Receivers should
have a good (GPS based) local clock, but the message may take from 1
sec to as much as a minute or two to get to the end computer
(e.g. traveling through networks). Alternatively, the message will
be decoded after the fact for analysis. The USCG N-AIS sense of
time is +/- 8 minutes. Alternatively, the message might be received
by a satellite and downlinked 30 minutes or more later when the
satellite gets to a downlink station. Is the message understandable
in that sense?