Dekodowanie SMS w MikroTik: analiza PDU i łączenie długich wiadomości
Odbieranie i przetwarzanie SMS przez MikroTik RouterOS otwiera możliwości monitorowania i automatyzacji. W artykule omówiono metodę wydobywania wiadomości poprzez skrypt e-mail i późniejsze dekodowanie PDU dla poprawnego wyświetlania tekstu, w tym łączenie złożonych SMS. Akcent położono na realizację techniczną dla programistów aplikacji na Androida.
Wydobywanie danych SMS z MikroTik
Począwszy od RouterOS 7.15, system zapewnia dostęp do pełnych danych SMS, w tym PDU (Protocol Data Unit), poprzez komendę /tool/sms/inbox/print detail. PDU zawiera wszystkie informacje serwisowe i tekst wiadomości w zakodowanej formie. Do automatyzacji można wykorzystać dwa podejścia: bezpośrednie połączenie przez API z biblioteką mikrotik-java lub pozyskiwanie danych przez e-mail za pomocą skryptu.
Skrypt formatuje odpowiedź routera w ciąg JSON dla każdego SMS i wysyła go na podany adres. Przykład zapisu:
{"phone":"+79011234567","timestamp":"2026-03-09 21:30:51+03:00","message":"jakiś tekst","pdu":"07919761980644F0040B919720481784F50000623090120315211BF377BB0CA297F17410FDFE06DDDF72F21C34AFC3E16F391D","source":"usb2,0","type":"class-0"}
Następnie aplikacja parsuje te dane, tworząc obiekty klasy Sms do dalszego przetwarzania.
Struktura PDU i wstępna analiza
PDU to szesnastkowy ciąg zawierający pola serwisowe i dane użytkownika. Dekodowanie rozpoczyna się od konwersji ciągu HEX na tablicę bajtów, po wcześniejszym oczyszczeniu z nieszesnastkowych znaków i zapewnieniu parzystej długości.
Kluczowe etapy wstępnej analizy PDU:
- SMSC (Service Center Address): pierwszy bajt wskazuje długość adresu centrum usług.
- First Octet: określa typ PDU, w tym flagę obecności User Data Header (UDHI) dla złożonych wiadomości.
- Originating Address: zawiera numer nadawcy z określeniem długości i formatu.
- PID (Protocol Identifier): zazwyczaj ma wartość 0x00 dla standardowych SMS.
- DCS (Data Coding Scheme): krytycznie ważne pole, określające kodowanie tekstu (7-bit, 8-bit lub UCS2).
- SCTS (Service Centre Time Stamp): znacznik czasowy otrzymania wiadomości.
- UDL (User Data Length): długość danych użytkownika, której interpretacja zależy od kodowania.
Przetwarzanie złożonych wiadomości i kodowań
Jeśli w First Octet ustawiona jest flaga UDHI (bit 0x40), SMS jest częścią długiej wiadomości. W tym przypadku obecny jest User Data Header (UDH), zawierający informacje do łączenia części. UDH obejmuje identyfikator wiadomości, całkowitą liczbę części i numer kolejny bieżącej części.
Algorytm przetwarzania UDH:
- Określenie długości nagłówka i jego typu (8-bit lub 16-bit reference).
- Wyodrębnienie numeru kolejnego części do późniejszego składania.
- Korekta indeksu danych i długości tekstu w zależności od kodowania.
Dla 7-bitowej kodowania UDH zajmuje określoną liczbę septetów, które należy pominąć przed dekodowaniem tekstu. Obliczenie wykonuje się według wzoru:
private static int getUdhSeptetsCount(int udhLen) {
return (udhLen * 8 + 6) / 7;
}
Dla kodowań UCS2 i 8-bit nagłówek jest po prostu odejmowany od całkowitej objętości danych.
Dekodowanie tekstu wiadomości
Finałowy etap to konwersja bajtów na czytelny tekst na podstawie DCS. Główne kodowania i metody przetwarzania:
- UCS2 (UTF-16BE): stosowane przy wartości bitów 2–3 w DCS równej 10xx. Tekst jest dekodowany przy użyciu
StandardCharsets.UTF_16BE. - 8-bit Data: odpowiada wartości 01xx w DCS, używane dla danych binarnych lub alternatywnych kodowań.
- 7-bit GSM: standardowe kodowanie dla łaciny i podstawowych symboli, wymaga specjalnego algorytmu rozpakowywania septetów na bajty.
Po dekodowaniu tekst może być wyświetlony w aplikacji lub użyty do dalszej logiki, na przykład powiadomień o zdarzeniach.
Co jest ważne
- RouterOS 7.15+ dostarcza PDU dla pełnej kontroli nad SMS.
- Złożone wiadomości wymagają przetwarzania UDH dla poprawnego łączenia.
- Kodowanie tekstu jest określone przez pole DCS i wpływa na metodę dekodowania.
- Automatyzacja przez skrypt e-mail upraszcza integrację z systemami zewnętrznymi.
- Poprawne przetwarzanie ciągów HEX i granic danych zapobiega błędom parsowania.
— Editorial Team
Brak komentarzy.