본문 바로가기

통신이론

ADS-B 디코딩(ICAO, 항공편명) - 항공기 추적

이번에는 지금 내 머리 위 하늘에서 비행중인 항공기의 정체와 정보를 알고 추적할 수 있는 신기하고 재밌는 예제(ADS-B 디지털패킷 디코딩)를 소개하려 합니다.

 

ADS-B(Automatic Dependent Surveillance-Broadcast, 자동 종속 감시 방송)는 항공기가 위성 항법(GPS)을 기반으로 항공기 식별부호, 위치, 속도, 고도 등 비행 정보를 1초 단위로 지상 관제소 및 주변 항공기에 자동으로 방송하는 차세대 항공 감시 기술입니다. 기존 레이더보다 빠르고 정확하게 항공기 충돌 방지와 안전을 향상시킬 수 있어 대체재가 되고 있으며, 2020년부터 많은 국가에서 장착이 의무화되고 있는 추세입니다.

ADS-B 시스템

얼마전 국내에서도 이 장비의 항공기에 설치·운용이 의무화되었습니다.

 

① ICAO 24-bit address

유엔이 설립한 국제민간항공기구(ICAO, International Civil Aviation Organization)는 국제 항공 운송의 연결성, 효율성, 안전성을 증진하기 위해서 모든 회원국이 준수해야 할 표준과 권고를 제정합니다. 특히 여기서 ICAO 24비트 주소(모드 S 코드 또는 16진 코드)는 개별 항공기에 부여하는 고유 6자리 16진수 식별자(Hex ID)로써 이 주소들은 개별 항공기에 할당되고, 고유 신원을 제공하는 데 사용됩니다. (예: 71C540)

 

항공기 등록기호(Registration)

정식으로 등록되어 운항하는 민간 항공기의 식별 번호로, 항공기의 차량 번호판 같은 존재입니다. 한국 법령상 용어는 등록부호 또는 등록기호가 혼용되며, 영어로는 Registration code 혹은 number로 지칭되고, 테일넘버(Tail Number)라고 불리기도 합니다.

국토교통부가 지정한 규칙에 따라 부여하는데, 예를 들어 'HL8540'은 순서대로 국제전기통신연합(ITU)에서 대한민국에 부여한 무선국 국가식별부호(HL), 제트엔진(8), 쌍발 엔진(5), 일련번호(40)를 의미합니다.

reg. HL8540

사실 이 기호가 무선 Callsign의 역할 중이고 많이 활용되고 있습니다.

 

③ 항공편명(Flight Number)

항공사코드와 일련번호의 조합으로, 특정 비행 노선을 식별하는 고유 번호입니다(예: KE123, OZ456). 실시간 운항 현황, 출발/도착 공항, 게이트 위치 등을 확인하는 데 쓰입니다.
예를 들어 'EOK311' 항공편명을 네이버나 구글에서 검색하면, 아래 탑승권 처럼 여러 정보를 얻을 수 있습니다.

탑승권

또 날짜와 시간정보를 알고 추가하여 (http://www.flightaware.com 사이트에서) 과거 비행을 재현할 수도 있습니다.

전쟁 위기상황과 고유가 시대에 마음껏 비행기를 탑승이 어려운 지금, 마음이라도 전세계 하늘을 자유롭게 날고 있다고 상상해 보세요! 플렉스^^;

 

ADS-B 패킷

ADS-B 패킷은 다음과 같은 짧은 펄스 시퀀스입니다.

ADS-B Packet


각 펄스는 1μs 길이이며, 두 개의 0.5μs 서브펄스로 구성됩니다. 이것은 ON-OFF 키잉(OOK)의 예입니다. 정보비트 0과 1에 따라 펄스의 위치를 조정하는 PPM(Pulse Position Modulation)이라고도 할 수 있습니다.
패킷의 시작 부분을 찾을 수 있는 8μs Preamble이 있습니다. 이 패턴을 찾으면, 패킷이 맞는 지 그리고 패킷이 정확히 어디서 시작되는지 알 수 있습니다.

패킷 자체는 56 또는 112μs 길이이고, 56비트 또는 112비트로 디코딩됩니다.
ADS-B 신호는 1090 ㎒ 주파수로 전송됩니다. 모두가 같은 주파수를 사용해서 패킷들이 간섭할 수 있지만 분산된 수신기 수가 많기 때문에 각 신호는 어딘가에서 가장 강하게 나타나고, 대부분의 패킷이 수신됩니다.

 

 디코딩 과정 및 결과

먼저 1.5625초간 ( 샘플레이트 3.2 , 중심주파수 1090 , 수신이득은 30dB)으로 설정해서 RTL-SDR 통해 전파수신하고 캡처한 후 신호를 그래프로 표시해 보겠습니다.

1090_16bit_10M.npy
19.07MB

 

디코딩을 위해 오직 신호의 포락선을 찾으면 되기때문에, 신호의 샘플은 복소수의 절대값입니다.

여기서 줌인을 잘 조절해서 관찰해 아래와 같이 ADS-B패킷의 흔적을 찾아보세요!

IQ샘플 중에서 패킷신호 (샘플 3356364 ~ 3356724사이 112μs) 탐지 후 줌인

ADS-B 신호의 전파형식은 14M0M1D 으로, 이는 변조형식:위상펄스변조(M)·신호특성:디지털 단일채널(1),정보형태:데이터(D)를 의미하고, 심볼주기가 약 0.5μs 이므로 대략 대역폭은 2M(1/0.5μ) 이상을 예상할 수 있는데 실질적인 유효 대역폭은 20dBc기준 14 라고 합니다. 이는 스펙토그램 상에서 (약 2 이상 대역에 걸처) 일시적이고 짧게 발생하는 것을 아래처럼 확인 가능합니다.

(샘플 551200 ~ 679200 사이) 0.04초 간 3번 발생

그런데 0.5us 단위에 샘플레이트(fs=3.2 )가 맞지 않기 때문에 이를 맞추기위해 5배 업 샘플링하고 8배 다운 샘플링하여 fs=2 로 조정해서 분석합니다. 비트는 하강 전이는 1이고 상승 전이는 0으로 판별합니다.

패킷은 56 혹은 112비트로 구성되고, CRC체크도 있고 여러 정보를 디코딩하기에 복잡하므로 우리는 항공편명만 찾기만 목표로 할게요. 

112 bits ADS-B packe 데이터 구조

우리의 관심은 처음 Preamble 8비트(DF 17, CA 5) 즉 '10001|101' 를 찾는 것이 최우선이고,

다음 24비트는 항공기 고유ID 즉 앞서 언급한 ICAO 24-bit address가 되겠습니다. 이 HexID를 구글 등에서 검색해 보면, 항공기 등록기호, 스펙 등을 자세히 알 수 있습니다. 

마지막으로 [bits 33-37] 5비트가 '00100'을 찾으면, 그다음 [bits 41-88]에서 6bit 당 1문자로 엔코딩된 항공편명을 드디어 찾을 수 있습니다. 이때 각 6비트 정수를 아래 순서의 문자로 디코딩하면 됩니다.

'#ABCDEFGHIJKLMNOPQRSTUVWXYZ#####_###############0123456789#####'

자~ 여기까지 따라오셨다면, 여러분들은 ICAO: ' 71C540' , 항공편명: 'EOK311_ _' 를 아래처럼 디코딩 완료 하신겁니다.

수고하셨습니다. 짝짝짝!

안테나 수신이 좋았는지 에러비트가 발생하지 않아 정말 다행입니다.ㅎㅎㅎ

그리고 결과화면을 보면 충분히 따라할 수 있을 것으로 보고 소스코드는 참고자료5로 갈음할게요.

fs=2 ㎒ 리샘플 (2097728 ~ 2097904)의 88비트 디코딩

 

ADS-B 인터넷서비스 및 공개소프트웨어

RTL-SDR과 dump1090 을 함께 이용하면, 간단히 터미널창에서 텍스트로 실시간 항공감시를 할 수 있뿐 아니라 웹브라우저를 통해 지도 위에 화려한 그래픽으로 실시간 항공감시도 가능하답니다. 전문 프로그램이다 보니 미약한 신호수신 환경속에서도 에러보정하면서 다양한 항공기 정보를 모두 디코딩 가능한 재주꾼입니다.

한편 SDR기기 없이도 간단히 웹사이트( ADS-B Exchange - track aircraft live )에서 항공감시가 가능한데, ADS-B Exchange는 전 세계 자발적 참여자들이 수집한 데이터를 바탕으로 운영되는 실시간 항공기 추적 플랫폼입니다. 일반적인 항공 추적 서비스와 달리, 검열이나 필터링 없는 데이터를 제공하는 것이 가장 큰 특징입니다.

 

 

여러분도 밖으로 나가 비행추적을 좀 즐기시길 바랍니다.ㄱㄱ 감사합니다!!

 

 

<참고자료>

1. 자동 종속 감시–방송 - 위키피디아

2. 등록부호 - 나무위키

3. 호출 부호 - 나무위키

4. RF311 (EOK311) Aero K Flight Tracking and History 09-Apr-2026 (KIX / RJBB-CJJ / RKTU) - FlightAware

5. web.stanford.edu/class/ee26n/Assignments/Assignment4.html

6. https://blog.naver.com/igrafx/224165757081