communication:protocol
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
communication:protocol [2009/04/20 20:15] – danielrichman | communication:protocol [2015/04/03 09:49] (current) – removed eroneous , at the end of the example mfa298 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Communications Protocol ====== | ====== Communications Protocol ====== | ||
- | This is the typical protocol used by UKHAS members to transmit GPS data balloon to ground on the unlicensed bands, although any custom data may be tacked onto the end of the string. | + | This is the typical protocol used by UKHAS members to transmit GPS data balloon to ground on the unlicensed bands. Parsing is handled by [[http:// |
- | | + | < |
- | + | ||
- | * <CALL SIGN> simply identifies your balloon - doesn' | + | |
- | * < | + | |
- | | + | |
- | * The newline at the end is not required, however it does make the protocol much more easier to human-read. | + | |
+ | * The individual fields can be of variable length, the minimum and maximum can be set in the payloads XML file. | ||
+ | * CALLSIGN simply identifies your balloon - doesn' | ||
+ | * sentence_id (sometimes known as count, sequence, incremental counter...) also helps people receiving many transmissions at once. This should go up for each new transmission. It can go up 1, 2, 3, or be the milliseconds since power on, or whatever you want. It just has to increase each time a new string is sent. | ||
+ | * latitude and longitude can either be in decimal degrees (DD.dddd) or the NMEA format (DDMM.mmmm). If using decimal degrees take care that your conversion code does not break if it crosses the meridian. While the NMEA format is accepted you will still need to parse whether it its NSEW and use +/- appropriately. | ||
+ | * The checksum is very strongly recommended. We support CRC16_CCITT, | ||
+ | * The newline at the end IS required. It does make the protocol much more easier to human-read, and dl-fldigi looks for that character to terminate the string. Although both will work, please use ' | ||
* Here are example strings: | * Here are example strings: | ||
- | $$ALIEN1,1,12:13:11,50.904072,00.026106,09001,temperature: 14 | + | |
+ | | ||
+ | |||
+ | Example of a CRC16_CCITT' | ||
+ | $$hadie, | ||
+ | |||
+ | Demonstration of the fact that the custom data can be anything: | ||
+ | $$icarus, | ||
+ | |||
+ | **Usage example for the below two functions** | ||
+ | <code c># | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | char s[100]; | ||
+ | |||
+ | void make_string(struct information i) | ||
+ | { | ||
+ | char checksum[10]; | ||
+ | |||
+ | snprintf(s, | ||
+ | |||
+ | snprintf(checksum, | ||
+ | // or snprintf(checksum, | ||
+ | |||
+ | // It would be much more efficient to use the return value of snprintf here, rather than strlen | ||
+ | |||
+ | if (strlen(s) > sizeof(s) - 4 - 1) | ||
+ | { | ||
+ | // Don't overflow the buffer. You should have made it bigger. | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // Also copy checksum' | ||
+ | memcpy(s + strlen(s), checksum, strlen(checksum) + 1); | ||
+ | }</ | ||
+ | |||
+ | **Useful code to calculate NMEA xor checksum** | ||
+ | |||
+ | Please note: The use of xor checksum for payload telemetry is not advised, this code is useful for checking sentences sent by the GPS. The CCITT checksum below has much better performance and is preferred for payload telemetry | ||
+ | |||
+ | <code c># | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | uint8_t gps_xor_checksum(char *string) | ||
+ | { | ||
+ | size_t i; | ||
+ | uint8_t XOR; | ||
+ | uint8_t c; | ||
+ | |||
+ | XOR = 0; | ||
+ | |||
+ | // Calculate checksum ignoring the first two $s | ||
+ | for (i = 2; i < strlen(string); | ||
+ | { | ||
+ | c = string[i]; | ||
+ | XOR ^= c; | ||
+ | } | ||
+ | |||
+ | return XOR; | ||
+ | }</ | ||
+ | |||
+ | **Useful code to calculate CRC16_CCITT checksum on the AVR** | ||
+ | |||
+ | (Refer to [[http:// | ||
+ | |||
+ | <code c># | ||
+ | #include < | ||
+ | #include < | ||
+ | #include < | ||
+ | |||
+ | uint16_t gps_CRC16_checksum (char *string) | ||
+ | { | ||
+ | size_t i; | ||
+ | uint16_t crc; | ||
+ | uint8_t c; | ||
+ | |||
+ | crc = 0xFFFF; | ||
+ | |||
+ | // Calculate checksum ignoring the first two $s | ||
+ | for (i = 2; i < strlen(string); | ||
+ | { | ||
+ | c = string[i]; | ||
+ | crc = _crc_xmodem_update (crc, c); | ||
+ | } | ||
+ | return crc; | ||
+ | }</ | ||
+ | ====== Getting Your Payload On the Tracker ====== | ||
- | $$icarus, | + | You will need to fill out a flight document so the server can parse your telemetry strings and update the map.\\ |
+ | Fill out the form here :[[http://habhub.org/ |
communication/protocol.1240258520.txt.gz · Last modified: 2009/04/20 20:15 by danielrichman