Multiplayer protocol
The messages
All messages are composed of XDR encoded data. (see RFC 1832 for a complete description of XDR). XDR basically means: All data is in network byte order and aligned to the nearest multiple of 4 bytes. Strings are encoded as a zero-terminated array of characters,aligned to the nearest multiple of 4 bytes. Floating point numbers (32 or 64 bit) must be encode in the IEEE standard.
The header
The header is always 32 bytes long and contains the following fields in exactly that order:
|Magic|Version|MsgId|MsgLen|ReplyAddress|ReplyPort|Callsign|Data|
Magic: | 4 bytes, always 0x46474653 ("FGFS") |
Version: | 4 bytes, protocol version, currently 0x00010001 (1.1) |
MsgId: | 4 bytes, defines what data is appended to the header. Can be 0x00000001 for chat messages (deprecated) or 0x00000007 for position data |
MsgLen: | 4 bytes, the length of the data. Important: This is not in bytes, see the description of STRING field at the end for more information. |
ReplyAddress: | 4 bytes, deprecated and ignored |
ReplyPort: | 4 bytes, deprecated and ignored |
Callsign: | 8 bytes, zero terminated array of characters representing
the user callsign |
Data of chat messages
The data for chat messages is a zero terminated array of characters. The MsgLen field in the header represents its length. The maximum length is defined to be 256 bytes.
Data of position messages
The data of position data is more complicated and looks like this:
ModelName | 96 bytes, zero terminated array of characters representing the aircraft model used by the user |
time | 8 bytes, representing the time when this message was generated |
lag | 8 bytes, time offset for network lag |
PosX | 8 bytes, XDR encoded double value, X-ccordinate of users position wrt the earth centered frame |
PosY | 8 bytes, XDR encoded double value, Y-ccordinate of users position wrt the earth centered frame |
PosZ | 8 bytes, XDR encoded double value, z-ccordinate of users
position wrt the earth centered frame |
OriX | 4 bytes, XDR encoded float value, X-orientation of the user wrt the earth centered frame, stored in the angle axis representation where the angle is coded into the axis length |
OriY | 4 bytes, XDR encoded float value, Y-orientation of the user wrt the earth centered frame, stored in the angle axis representation where the angle is coded into the axis length |
OriZ | 4 bytes, XDR encoded float value, Z-orientation of the user wrt the earth centered frame, stored in the angle axis representation where the angle is coded into the axis length |
VelX | 4 bytes, XDR encoded float value, velocity of the user in X direction wrt the earth centered frame measured in the earth centered frame |
VelY | 4 bytes, XDR encoded float value, velocity of the user in Y direction wrt the earth centered frame measured in the earth centered frame |
VelZ | 4 bytes, XDR encoded float value, velocity of the user in Z direction wrt the earth centered frame measured in the earth centered frame |
AV1 | 4 bytes, XDR encoded float value, 1. part of the three dimensional angular velocity vector wrt the earth centered frame measured in the earth centered frame |
AV2 | 4 bytes, XDR encoded float value, 2. part of the three dimensional angular velocity vector wrt the earth centered frame measured in the earth centered frame |
AV3 | 4 bytes, XDR encoded float value, 3. part of the three dimensional angular velocity vector wrt the earth centered frame measured in the earth centered frame |
LA1 | 4 bytes, XDR encoded float value, 1. part of the three dimensional linear accelaration vector wrt the earth centered frame measured in the earth centered frame |
LA2 | 4 bytes, XDR encoded float value, 2. part of the three dimensional linear accelaration vector wrt the earth centered frame measured in the earth centered frame |
LA3 | 4 bytes, XDR encoded float value, 3. part of the three dimensional linear accelaration vector wrt the earth centered frame measured in the earth centered frame |
AA1 | 4 bytes, XDR encoded float value, 1. part of the three dimensional angular accelaration vector wrt the earth centered frame measured in the earth centered frame |
AA2 | 4 bytes, XDR encoded float value, 2. part of the three dimensional angular accelaration vector wrt the earth centered frame measured in the earth centered frame |
AA3 | 4 bytes, XDR encoded float value, 3. part of the three dimensional angular accelaration vector wrt the earth centered frame measured in the earth centered frame |
pad | up to 8 bytes for padding the data to a multiple of 8 bytes |
This data is followed by property-values, which are encoded in the form ID|Value
The following properties are transmitted, but not necessarily all present and not in this order:
Important: This table is outdated. Please have a look in the flightgear sources at src/MultiPlayer/multiplaymgr.cxx
ID | Property | Type(*) |
---|---|---|
100 | "surface-positions/left-aileron-pos-norm" | FLOAT |
101 | "surface-positions/right-aileron-pos-norm" | FLOAT |
102 | "surface-positions/elevator-pos-norm" | FLOAT |
103 | "surface-positions/rudder-pos-norm" | FLOAT |
104 | "surface-positions/flap-pos-norm" | FLOAT |
105 | "surface-positions/speedbrake-pos-norm" | FLOAT |
106 | "gear/tailhook/position-norm" | FLOAT |
107 | "gear/launchbar/position-norm" | FLOAT |
108 | "gear/launchbar/state" | STRING |
109 | "gear/launchbar/holdback-position-norm" | FLOAT |
110 | "canopy/position-norm" | FLOAT |
111 | "surface-positions/wing-pos-norm" | FLOAT |
112 | "surface-positions/wing-fold-pos-norm" | FLOAT |
200 | "gear/gear[0]/compression-norm" | FLOAT |
201 | "gear/gear[0]/position-norm" | FLOAT |
210 | "gear/gear[1]/compression-norm" | FLOAT |
211 | "gear/gear[1]/position-norm" | FLOAT |
220 | "gear/gear[2]/compression-norm" | FLOAT |
221 | "gear/gear[2]/position-norm" | FLOAT |
230 | "gear/gear[3]/compression-norm" | FLOAT |
231 | "gear/gear[3]/position-norm" | FLOAT |
240 | "gear/gear[4]/compression-norm" | FLOAT |
241 | "gear/gear[4]/position-norm" | FLOAT |
300 | "engines/engine[0]/n1" | FLOAT |
301 | "engines/engine[0]/n2" | FLOAT |
302 | "engines/engine[0]/rpm" | FLOAT |
310 | "engines/engine[1]/n1" | FLOAT |
311 | "engines/engine[1]/n2" | FLOAT |
312 | "engines/engine[1]/rpm" | FLOAT |
320 | "engines/engine[2]/n1" | FLOAT |
321 | "engines/engine[2]/n2" | FLOAT |
322 | "engines/engine[2]/rpm" | FLOAT |
330 | "engines/engine[3]/n1" | FLOAT |
331 | "engines/engine[3]/n2" | FLOAT |
332 | "engines/engine[3]/rpm" | FLOAT |
340 | "engines/engine[4]/n1" | FLOAT |
341 | "engines/engine[4]/n2" | FLOAT |
342 | "engines/engine[4]/rpm" | FLOAT |
350 | "engines/engine[5]/n1" | FLOAT |
351 | "engines/engine[5]/n2" | FLOAT |
352 | "engines/engine[5]/rpm" | FLOAT |
360 | "engines/engine[6]/n1" | FLOAT |
361 | "engines/engine[6]/n2" | FLOAT |
362 | "engines/engine[6]/rpm" | FLOAT |
370 | "engines/engine[7]/n1" | FLOAT |
371 | "engines/engine[7]/n2" | FLOAT |
372 | "engines/engine[7]/rpm" | FLOAT |
380 | "engines/engine[8]/n1" | FLOAT |
381 | "engines/engine[8]/n2" | FLOAT |
382 | "engines/engine[8]/rpm" | FLOAT |
390 | "engines/engine[9]/n1" | FLOAT |
391 | "engines/engine[9]/n2" | FLOAT |
392 | "engines/engine[9]/rpm" | FLOAT |
800 | "rotors/main/rpm" | FLOAT |
801 | "rotors/tail/rpm" | FLOAT |
810 | "rotors/main/blade[0]/position-deg" | FLOAT |
811 | "rotors/main/blade[1]/position-deg" | FLOAT |
812 | "rotors/main/blade[2]/position-deg" | FLOAT |
813 | "rotors/main/blade[3]/position-deg" | FLOAT |
820 | "rotors/main/blade[0]/flap-deg" | FLOAT |
821 | "rotors/main/blade[1]/flap-deg" | FLOAT |
822 | "rotors/main/blade[2]/flap-deg" | FLOAT |
823 | "rotors/main/blade[3]/flap-deg" | FLOAT |
830 | "rotors/tail/blade[0]/position-deg" | FLOAT |
831 | "rotors/tail/blade[1]/position-deg" | FLOAT |
900 | "sim/hitches/aerotow/tow/length" | FLOAT |
901 | "sim/hitches/aerotow/tow/elastic-constant" | FLOAT |
902 | "sim/hitches/aerotow/tow/weight-per-m-kg-m" | FLOAT |
903 | "sim/hitches/aerotow/tow/dist" | FLOAT |
904 | "sim/hitches/aerotow/tow/connected-to-property-node" | BOOL |
905 | "sim/hitches/aerotow/tow/connected-to-ai-or-mp-callsign" | STRING |
906 | "sim/hitches/aerotow/tow/brake-force" | FLOAT |
907 | "sim/hitches/aerotow/tow/end-force-x" | FLOAT |
908 | "sim/hitches/aerotow/tow/end-force-y" | FLOAT |
909 | "sim/hitches/aerotow/tow/end-force-z" | FLOAT |
930 | "sim/hitches/aerotow/is-slave" | BOOL |
931 | "sim/hitches/aerotow/speed-in-tow-direction" | FLOAT |
932 | "sim/hitches/aerotow/open" | BOOL |
933 | "sim/hitches/aerotow/local-pos-x" | FLOAT |
934 | "sim/hitches/aerotow/local-pos-y" | FLOAT |
935 | "sim/hitches/aerotow/local-pos-z" | FLOAT |
1001 | "controls/flight/slats" | FLOAT |
1002 | "controls/flight/speedbrake" | FLOAT |
1003 | "controls/flight/spoilers" | FLOAT |
1004 | "controls/gear/gear-down" | FLOAT |
1005 | "controls/lighting/nav-lights" | FLOAT |
1006 | "controls/armament/station[0]/jettison-all" | BOOL |
1100 | "sim/model/variant" | INT |
1101 | "sim/model/livery/file" | STRING |
1200 | "environment/wildfire/data" | STRING |
10001 | "sim/multiplay/transmission-freq-hz" | STRING |
10002 | "sim/multiplay/chat" | STRING |
10100 | "sim/multiplay/generic/string[0]" | STRING |
10101 | "sim/multiplay/generic/string[1]" | STRING |
10102 | "sim/multiplay/generic/string[2]" | STRING |
10103 | "sim/multiplay/generic/string[3]" | STRING |
10104 | "sim/multiplay/generic/string[4]" | STRING |
10105 | "sim/multiplay/generic/string[5]" | STRING |
10106 | "sim/multiplay/generic/string[6]" | STRING |
10107 | "sim/multiplay/generic/string[7]" | STRING |
10108 | "sim/multiplay/generic/string[8]" | STRING |
10109 | "sim/multiplay/generic/string[9]" | STRING |
10110 | "sim/multiplay/generic/string[10]" | STRING |
10111 | "sim/multiplay/generic/string[11]" | STRING |
10112 | "sim/multiplay/generic/string[12]" | STRING |
10113 | "sim/multiplay/generic/string[13]" | STRING |
10114 | "sim/multiplay/generic/string[14]" | STRING |
10115 | "sim/multiplay/generic/string[15]" | STRING |
10116 | "sim/multiplay/generic/string[16]" | STRING |
10117 | "sim/multiplay/generic/string[17]" | STRING |
10118 | "sim/multiplay/generic/string[18]" | STRING |
10119 | "sim/multiplay/generic/string[19]" | STRING |
10200 | "sim/multiplay/generic/float[0]" | FLOAT |
10201 | "sim/multiplay/generic/float[1]" | FLOAT |
10202 | "sim/multiplay/generic/float[2]" | FLOAT |
10203 | "sim/multiplay/generic/float[3]" | FLOAT |
10204 | "sim/multiplay/generic/float[4]" | FLOAT |
10205 | "sim/multiplay/generic/float[5]" | FLOAT |
10206 | "sim/multiplay/generic/float[6]" | FLOAT |
10207 | "sim/multiplay/generic/float[7]" | FLOAT |
10208 | "sim/multiplay/generic/float[8]" | FLOAT |
10209 | "sim/multiplay/generic/float[9]" | FLOAT |
10210 | "sim/multiplay/generic/float[10]" | FLOAT |
10211 | "sim/multiplay/generic/float[11]" | FLOAT |
10212 | "sim/multiplay/generic/float[12]" | FLOAT |
10213 | "sim/multiplay/generic/float[13]" | FLOAT |
10214 | "sim/multiplay/generic/float[14]" | FLOAT |
10215 | "sim/multiplay/generic/float[15]" | FLOAT |
10216 | "sim/multiplay/generic/float[16]" | FLOAT |
10217 | "sim/multiplay/generic/float[17]" | FLOAT |
10218 | "sim/multiplay/generic/float[18]" | FLOAT |
10219 | "sim/multiplay/generic/float[19]" | FLOAT |
10300 | "sim/multiplay/generic/int[0]" | INT |
10301 | "sim/multiplay/generic/int[1]" | INT |
10302 | "sim/multiplay/generic/int[2]" | INT |
10303 | "sim/multiplay/generic/int[3]" | INT |
10304 | "sim/multiplay/generic/int[4]" | INT |
10305 | "sim/multiplay/generic/int[5]" | INT |
10306 | "sim/multiplay/generic/int[6]" | INT |
10307 | "sim/multiplay/generic/int[7]" | INT |
10308 | "sim/multiplay/generic/int[8]" | INT |
10309 | "sim/multiplay/generic/int[9]" | INT |
10310 | "sim/multiplay/generic/int[10]" | INT |
10311 | "sim/multiplay/generic/int[11]" | INT |
10312 | "sim/multiplay/generic/int[12]" | INT |
10313 | "sim/multiplay/generic/int[13]" | INT |
10314 | "sim/multiplay/generic/int[14]" | INT |
10315 | "sim/multiplay/generic/int[15]" | INT |
10316 | "sim/multiplay/generic/int[16]" | INT |
10317 | "sim/multiplay/generic/int[17]" | INT |
10318 | "sim/multiplay/generic/int[18]" | INT |
10319 | "sim/multiplay/generic/int[19]" | INT |
(*) The types are XDR encoded as follows:
INT 4 bytes, send unconditionally
FLOAT: 4 bytes, send unconditionally
BOOL: 4 bytes, send unconditionally
STRING [LEN|STR|PAD]: LEN: 4 bytes, length of the decoded string STR: LEN*4 bytes, encoded string. PAD: n*4 bytes, padding.
Important Due to a bug, all bytes in the STRING field are sent as 4byte ints (not in the header or the position message). So STR has length LEN*4 and padding (4-LEN%4)*4 bytes, if LEN%4 != 0.