Как извлечь идентификатор опросчика из сообщения DF11?

Я написал класс, который декодирует необработанные сообщения режима S. Просматривая на днях спецификации ICAO, я заметил, что идентификатор опросчика отправляется обратно в сообщении DF11.

Я подумал, что было бы забавно определить, где в моей зоне покрытия можно увидеть запросы от определенных радиолокационных установок.

Но мне очень трудно понять, как извлечь идентификатор следователя.

Для этого сообщения DF11:

5D406FDB0D62DD

У меня есть следующее:

Binary: 01011101010000000110111111011011000011010110001011011101
Integer Words:
    [0] => 93
    [1] => 64
    [2] => 111
    [3] => 219
    [4] => 13
    [5] => 98
    [6] => 221

 CA: 5
 AA: 4222939
 Address: 406FDB
 Parity: 255
 Residual: 0

Поскольку остаточное значение равно 0, я знаю, что это действительное сообщение DF11, и адрес также проверяется.

Из спецификации ИКАО:

«Код, используемый при формировании поля PI нисходящей линии связи, должен быть сформирован последовательностью из 24 битов (a1, a2,..., a24), где первые 17 битов являются НУЛЯМИ, следующие три бита являются копией метки кода ( CL) (3.1.2.5.2.1.3), а последние четыре бита являются копией поля кода запросчика (IC) (3.1.2.5.2.1.2)".

В этом случае я бы ожидал, что конец последних трех целочисленных слов (4,5 и 6) будет в основном 0, но это не так.

Я много раз просматривал документацию, но просто не понимаю, как получить коды II и SL из значения четности?

Я вычисляю значение четности, делая следующее:

$this->_pi = $this->_int[4] | $this->_int[5] | $this->_int[6];

где | в PHP это оператор ИЛИ. Это моя ошибка?

Ответы (1)

Ваш расчет $this->_piпросто объединяет три байта четности вместе, что, конечно, не имеет никакого смысла. Я не уверен, что вы надеетесь получить от этого. Даже объединение их XOR вместе не принесет никакой пользы.


Адресация и контрольная сумма в протоколе Mode S работают странно, чтобы сэкономить биты. Последние 3 байта сообщения составляются как контрольная сумма CRC (которую в Приложении 10 называют «четностью») первых 4/11 байтов, объединенных методом XOR с адресом «диапазона», частью которого является сообщение. Когда вы получаете сообщение, вы должны вычислить необработанный CRC самостоятельно, а затем выполнить операцию XOR из байтов. Остается только адрес, и, сравнивая его с интересующими вас адресами, вы можете увидеть, было ли сообщение адресовано вам или, наоборот, искажено или адресовано кому-то другому.

В базовом протоколе опроса в режиме S этот «адрес» является просто адресом планера, а поле контрольной суммы xor-адреса называется AP. Для восходящих сообщений транспондеры, конечно же, знают свой собственный адрес, а для нисходящих сообщений радары знают, какие адреса они недавно опрашивали.

В некоторых других случаях «адрес» является «идентификатором запросчика», а поле контрольной суммы-xor-адреса называется PI.

Для DF11 транспондер знает, какой II следует вводить в свои ответы, потому что он извлекает их из сообщения общего вызова, а радар знает, какой II соответствует его собственному общему вызову, поэтому он может распознавать эти ответы.

Наконец, в сквиттере , когда транспондер отправляет сообщение по нисходящему каналу без запроса сообщения по восходящему каналу, он устанавливает «адрес» равным 0.


Если вы декодировали широковещательные сообщения ADS-B, вы прослушиваете самогенерируемые сигналы, поэтому вы можете идентифицировать их как те, в которых CRC, который вы вычисляете, равен полю PI в сообщении (поскольку операция XOR 0 в CRC не меняет его). ). Все с другим адресом будет выглядеть как ошибки контрольной суммы для вашего кода.

Поскольку сообщение DF11, которое вы показываете, соответствует контрольной сумме, это должен быть сквиттер DF11. Есть много тех, чтобы услышать; TCAS зависит от того, кто их постоянно отправляет.

Чтобы найти сообщения DF11 с ненулевым идентификатором запросчика, вы должны искать сообщения, в которых последние три байта после операции XOR из CRC действительно начинаются с 17 нулей, но затем имеют по крайней мере некоторые из оставшихся 7 битов, отличных от нуля.

Спасибо за очень четкое объяснение :-) Завтра я пересмотрю свой код и отпишусь, но сейчас я точно вижу, как он должен работать.