0xFF

RTL-SDR로 지상파 DMB 재난메시지 수신해보기 - 1 본문

개발 및 프로젝트/Safecast (졸업작품)

RTL-SDR로 지상파 DMB 재난메시지 수신해보기 - 1

캡스락 2026. 7. 1. 19:50

Safecast의 주요 기능 중 하나는 DMB망 기반 재난문자를 BLE 및 와이파이로 중계하는 기능이다.

휴대폰 기지국이 동작하지 않는 수준의 재난 발생시, Safecast AP가 DMB를 통해 수신받은 재난메시지를 블루투스 비콘을 이용하여 주변 휴대폰들에게 재전파하고, 이를 수신한 백그라운드 앱이 수신된 메시지를 자동으로 보여줌과 동시에 Safecast AP 연결을 권유하게 하는 것이다.

하지만 DMB라고 하면? 누군가는 이미 망한 로스트 테크놀로지가 아니냐고 반문할 수 있지만 놀랍게도 아직 서비스 중이긴 하다. 사실상 개인에게 있어 DMB를 수신할 수 있는 유일한 방법은 차량 인포테인먼트로 그 입지가 쪼그라들긴 했지만 말이다.

다만 약간의 문제가 있었던 것은 재난문자방송 관련 법령을 찾아보니 DMB 수신기의 정의에서 어느샌가 휴대폰이 빠져있었다는 것이고,

DMB를 통한 재난메시지 발송 기준 또한 "DMB 재난문자방송은 대형 화재, 지반침하(싱크홀) 발생, 대형 교통사고, 산사태로 인한 도로붕괴 등 운전자에게 알릴 필요가 있는 경우에만 발송한다."라고 개정되어 있었다는 것이다.

좌: 2016년, 우: 현행(글 작성일 기준)

따라서 방송망을 통해서 뭔가를 만든다고 하면 현 시점에서는 ATSC 3.0기반으로 만드는게 여러모로 옳겠다고 생각은 했지만, SDR로 수신해보기 어렵다는 점과 더불어 무엇보다 국내 ATSC 3.0 채널은 스크램블이 걸려있다고 하여 일단은 더 알아보는 것을 포기하고 그나마 건드리기 쉬운 DMB로 진행하게 되었다.

DMB 재난메시지 표준규격 확인

 일단 TTA 표준을 다운받아 스펙을 확인해 보았다. 최신 개정 스펙의 표준번호는 'TTAK.KO-07.0046/R7'라고 한다.

6 페이지

재난 메시지는 DMB의 영상 서비스가 FIC(고속정보채널)로 수신한 정보를 바탕으로 MSC(주 서비스 블록)을 참조하여야 하는 것과 달리, FIC에 메시지 본문을 바로 담아 전송한다고 한다.

이때 재난메시지 전송에 사용하는 FIC 내의 FIB(고속정보블록) 타입 번호와 확장 번호는 각각 5, 2이다.

따라서 FIG header가 수신되었을 때 '00101(타입번호) 010(확장번호)' 이면 위 표준에 따른 재난메시지 데이터가 들어있다고 보면 되겠다.

실제 수신처리는 깃허브에 돌아다니는 DAB 오픈소스(guglielmo)를 활용하여 위 표준의 데이터를 버리지 않게끔 간단히 수정해주기만 하면 받을 수 있었다.

마지막으로 위 계층 그림에서 D2 비트가 1인것까지 확인한 다음 해당 데이터를 덤프하면 실제 차량 운전자에게 표시되는 재난메시지의 덤프를 얻은 것이 된다.

그런데 실험 결과 D2 비트가 0인 데이터도 며칠 간의 실험 중 불규칙적으로 십수회 수신되는 것을 확인했는데, 처음에는 버그인 줄 알았지만 뭔가 일정한 포맷이 나타나고 있고(재난메시지 포맷과는 다름), 이와 함께 표준 규격에 정의된 지역코드들도 계속 등장하는 것으로 보아 추측하건데 전국 공공기관에 설치된 특수 수신기들의 작동시험을 위해 송출하는 시험 메시지인 것 같았다.

하루 중에도 꽤 자주 시험이 이루어지는 것 같아 신기했다.

[2026-07-01 08:18:16] [재난메시지(D2==1) 덤프] 길이: 29 bytes, 내용: 0111101000001000000010110101001001010100010101110101110111100100101101110100100100000000001100100011100000110000001100000011000000110000001100000011000000110000001100000000100010101110011111001100011100100000000000000011000000000000 [2026-07-01 08:18:16] [재난메시지(D2==1) 덤프] 길이: 29 bytes, 내용: 0111101000011000000010110011011100000000001110100000000000110100000000000011010000000000101111011010110000100000000000001000000110111101101011011100110001111100101101110100100100000000010000110000000001111110000000001000000010101100 [2026-07-01 08:18:16] [재난메시지(D2==1) 덤프] 길이: 29 bytes, 내용: 0111101000101000000010111110100010110010001011100000000010010001110001010000110011001101010010010000000001000011000000000010000000000000010101001101011000111100101110110010100011001100001000000000000000000001110010001010110011000111 [2026-07-01 08:18:16] [재난메시지(D2==1) 덤프] 길이: 29 bytes, 내용: 0111101000111000000010110011110010111011001000000000000010011001101100000101100011010101001000000000000010101100110000001110000010101100010111001011100000100000000000000111100011000111011101001101010100100000000000000111010011010101 [2026-07-01 08:18:16] [재난메시지(D2==1) 덤프] 길이: 29 bytes, 내용: 0111101001001000000010111111100110110010011011001010110100000100101011000010000000000000000001001100100001110100101110100010000000000000101101011101000100011100110010000001000111001001001011000000000000100000000000000101000010101101 [2026-07-01 08:18:16] [재난메시지(D2==1) 덤프] 길이: 29 bytes, 내용: 0111101001011000000010111011010111010001000101011100100011110100101111000111110010111001001000000000000001010101110101100111100011000111010110001101010111011100110000101110000010101100001000000000000010000001101111011010110111001100 [2026-07-01 08:18:16] [재난메시지(D2==1) 덤프] 길이: 29 bytes, 내용: 0111101001101000000010110111110010110111010010010000000001000011000000000010110000000000001000000000000010101000101100001010110111001100011111001011011101001001000000000100001100000000010111001011100000100000000000001011000011000110 [2026-07-01 08:18:16] [재난메시지(D2==1) 덤프] 길이: 29 bytes, 내용: 0111101001111000000010111000110011010110000101001011110010001101101101111100100010110010111001001011001000101110000000000010000000000000010110110000000001111000110001111001110011001100010000001010111011101100110100111110000010101100 [2026-07-01 08:18:16] [재난메시지(D2==1) 덤프] 길이: 11 bytes, 내용: 0111101010001000000010111000110111000001110001001011001101011100101110000101110100000000

위 내용은 실제 재난메시지(D2 = 1)를 수신해본 것이다.

이렇게 실제 재난메시지 데이터를 받아보기까지는 꽤 오랜 시간이 걸렸는데, 아무래도 긴급재난이 아닌 평시에는 운전자를 위한 내용만 보내도록 기준이 개정된 탓인 것 같다.

아무튼 위 덤프를 표준에 따라 해석해보면..

재난 종류 코드: RTW(교통 통제)
지역: 2800000000(인천광역시)
발령시각: 2026-07-01 08:18 KST
내용:
금일 07:44경 북청라IC~검단.양촌IC 화물차 적재물 낙하 사고로 인해 해당구간 전면 통제중, 교통정보를 확인하시고 북청라IC, 남청라IC로 우회바랍니다. [인천김포고속도로]

가 나온다.

실제로 DMB에 대해 관심을 갖고 조사해보기 전에는 "차에서는 DMB로 재난문자를 받는다더라" 고 어디선가 얼핏 들어본 것 외에는 아는 것이 없었는데

이렇게 실제로 전용 단말기가 아닌 무려 RTL-SDR 동글로 전파를 잡아서 메시지가 들어오는걸 확인해보니 신기했다.

이제 실제 데이터도 얻었으니 이 데이터를 활용해서 재난메시지 파서 로직까지 구현하는 것이 다음 단계이다.

 

이상입니다.

잘못된 내용이나 궁금하신 점은 댓글로 남겨주시면 감사하겠습니다.

 

다음 글 바로가기: RTL-SDR로 지상파 DMB 재난메시지 수신해보기 - 2