MikroTik에서 SMS 디코딩: PDU 파싱과 긴 메시지 연결
MikroTik RouterOS를 통해 SMS를 수신하고 처리하면 강력한 모니터링과 자동화 기능을 활용할 수 있습니다. 이 글에서는 이메일 스크립트를 사용해 메시지를 추출하고, PDU를 디코딩하여 정확한 텍스트를 표시하며, 다중 파트 SMS를 연결하는 방법을 자세히 알아봅니다. 안드로이드 앱 개발자를 위한 실전 기술 구현 가이드입니다.
MikroTik에서 SMS 데이터 추출
RouterOS 7.15 버전부터 /tool/sms/inbox/print detail 명령어로 PDU(Protocol Data Unit)를 포함한 SMS 상세 정보를 완전히 확인할 수 있습니다. PDU에는 모든 메타데이터와 인코딩된 메시지 텍스트가 압축되어 있습니다. 자동화를 위해 mikrotik-java 라이브러리를 사용한 직접 API 연동이나 커스텀 스크립트로 이메일을 통해 데이터를 가져오는 방법을 추천합니다.
스크립트는 각 SMS를 JSON 문자열 형식으로 변환해 지정한 이메일 주소로 전송합니다. 샘플 데이터는 다음과 같습니다:
{"phone":"+79011234567","timestamp":"2026-03-09 21:30:51+03:00","message":"some text","pdu":"07919761980644F0040B919720481784F50000623090120315211BF377BB0CA297F17410FDFE06DDDF72F21C34AFC3E16F391D","source":"usb2,0","type":"class-0"}
앱에서는 이 JSON을 파싱해 Sms 객체를 생성하고 후속 처리를 진행합니다.
PDU 구조와 초기 파싱
PDU는 서비스 필드와 사용자 데이터를 담은 16진수 문자열입니다. 디코딩은 먼저 비16진수 문자를 제거하고 길이를 짝수로 맞춘 후 바이트 배열로 변환하는 것으로 시작합니다.
초기 PDU 파싱 주요 단계:
- SMSC (서비스 센터 주소): 첫 바이트에 SMSC 주소 길이가 표시됩니다.
- 첫 번째 옥텟: PDU 유형을 설정하며, 다중 파트 메시지를 위한 UDHI 플래그(사용자 데이터 헤더)를 포함합니다.
- 발신자 주소: 발신자 번호로 길이와 형식 정보가 포함됩니다.
- PID (프로토콜 식별자): 일반 SMS는 0x00입니다.
- DCS (데이터 코딩 방식): 텍스트 인코딩(7비트, 8비트, UCS2)을 결정하는 핵심 필드입니다.
- SCTS (서비스 센터 타임스탬프): 메시지 수신 시각입니다.
- UDL (사용자 데이터 길이): 인코딩에 따라 해석되는 사용자 데이터 길이입니다.
다중 파트 메시지와 인코딩 처리
첫 번째 옥텟에 UDHI 플래그(0x40 비트)가 설정되어 있으면 긴 메시지의 일부입니다. 이 경우 사용자 데이터 헤더(UDH)가 포함되어 메시지 ID, 총 파트 수, 순서 번호 등의 재조립 정보를 제공합니다.
UDH 처리 알고리즘:
- 헤더 길이와 타입(8비트 또는 16비트 참조)을 확인합니다.
- 재조립을 위한 파트 순서 번호를 추출합니다.
- 인코딩에 따라 데이터 인덱스와 텍스트 길이를 조정합니다.
7비트 인코딩의 경우 UDH가 septet 단위로 공간을 차지하므로 텍스트 디코딩 전에 건너뜁니다. 다음 공식을 사용하세요:
private static int getUdhSeptetsCount(int udhLen) {
return (udhLen * 8 + 6) / 7;
}
UCS2와 8비트는 총 데이터 길이에서 헤더를 단순히 빼면 됩니다.
메시지 텍스트 디코딩
마지막 단계는 DCS에 따라 바이트를 읽을 수 있는 텍스트로 변환하는 것입니다. 주요 인코딩과 처리 방법:
- UCS2 (UTF-16BE): DCS 비트 2–3이 10xx일 때 발생.
StandardCharsets.UTF_16BE로 디코딩합니다. - 8비트 데이터: DCS 01xx에 해당하며, 바이너리 데이터나 대체 인코딩에 사용됩니다.
- 7비트 GSM: 라틴 문자와 기본 문자에 기본 적용; septet-to-byte 언패커가 필요합니다.
디코딩 후 앱에 텍스트를 표시하거나 이벤트 알림과 로직에 활용하세요.
주요 요약
- RouterOS 7.15+에서 PDU를 통해 SMS를 완벽히 제어할 수 있습니다.
- 다중 파트 메시지는 UDH 처리를 통해 제대로 연결해야 합니다.
- DCS 필드가 텍스트 인코딩과 디코딩 방식을 결정합니다.
- 이메일 스크립트 자동화로 외부 시스템 연동이 간편해집니다.
- 16진수 문자열 정리와 경계 확인으로 파싱 오류를 방지하세요.
— Editorial Team
아직 댓글이 없습니다.