Program do obsługi wiadomości SMS i USSD
Ostatnia zmiana: 2019-03-30 07:28

W moim repozytorum OpenWrt pojawił się pakiet o nazwie sms-tool. Szukałem projektu który mógłby zastąpić gnokii (w domyśle - jako dodatek do easyconfig), projekt smstools3 średnio się do tego celu nadaje więc skłonny byłem do napisania czegoś nowego. Po krótkim szukaniu w sieci znalazłem taki projekt, porzucony kilka lat temu, który prawie idealnie nadał się do tego celu. Po kilkunastu różnych modyfikacjach uznałem że nadaje się do upublicznienia.

sms_tool jest narzędziem obsługującym wiadomości SMS i USSD dla modemów wyposażonych w interfejs szeregowy. Umożliwia:
- wyświetlanie statusu (liczba odebranych SMSów)
- wyświetlanie odebranych SMSów
- wysyłanie SMS
- usuwanie SMS
- bonusowo: obsługę kodów USSD

sms_tool obsługuje zarówno kodowanie PDU jak i UCS2, więc nie powinno być problemów ze znakami narodowymi (przynajmniej przy wyświetlaniu odebranych SMSów). Obsługuje także SMSy wieloczęściowe oraz dekoduje poprawnie nadawcę (w postaci numeru lub nazwy alfanumerycznej). Program wymaga modemu z interfejsem szeregowym (nie obsługuje modemów typu Hilink czy RNDIS). Zaletą programu jest jego minimalna wielkość oraz brak zewnętrznych zależności.

Opis programu



    # sms_tool
    usage: [options] send phoneNumber message
            [options] recv
            [options] delete msg_index | all
            [options] status
            [options] ussd code
    options:
        -b <baudrate> (default: 115200)
        -d <tty device> (default: /dev/ttyUSB0)
        -D debug (for ussd)
        -s <preferred storage> (for sms/recv/status)
        -f <date/time format> (for sms/recv)
        -j json output (for sms/recv)
        -R use raw input (for ussd)
        -r use raw output (for ussd and sms/recv)

Program posiada kilka dodatkowych opcji; część jest wspólna dla wszystkich poleceń, część jest specyficzna dla określonej akcji. Opcje wspólne:

  • -b umożliwia zmianę szybkości komunikacji z modemem (baud rate - domyślnie 115200). Należy ją stosować tylko dla modemów które wymagają ustawienia innej prędkości
  • -d określa interfejs komunikacyjny modemu (domyślnie /dev/ttyUSB0). Wymagane jest podane interfejsu szeregowego z którym można porozumieć się modemem, jest on różny w zależności od typu modemu

SMS

status (nazwa akcji: status)

Wyświetlane jest miejsce przechowywania, liczba odebranych SMSów oraz maksymalna liczba wiadomości które można pomieścić. SMSy są przechowywane w określonym miejscu (np. na karcie SIM lub pamięci modemu), ale w zależności od typu urządzenia mogą być dostępne także inne obszary. Program odczytuje wiadomości z domyślnego obszaru; przez podanie odpowiedniej opcji można sterować jego wyborem:

  • -s (domyślnie wartość ustalona przez modem), najczęściej spotykane są obszary o nazwach SM - karta SIM, ME - pamięć modemu. Listę dostępnych rodzajów pamięci można znaleźć w dokumentacji modemu lub internecie.
Przykład:


    # sms_tool -d /dev/ttyUSB1 status
    Storage type: ME, used: 0, total: 23
    # sms_tool -s SM -d /dev/ttyUSB1 status
    Storage type: SM, used: 11, total: 25

Wybrany obszar jest pamiętany przez modem do następnej zmiany obszaru lub restartu samego modemu.

odbieranie (nazwa akcji: recv)

Wyświetlane są wszystkie SMS które zostały odebrane przez modem. Zwykle są one przechowywane w określonym miejscu (np. na karcie SIM lub pamięci modemu) i z niego są odczytywane. Pozostałe opcje przydatne przy odczycie SMSów:

  • -s (domyślnie wartość ustalona przez modem), wybór obszaru z którego odczytywane są SMSy, najczęściej spotykane są obszary o nazwach SM - karta SIM, ME - pamięć modemu. Listę dostępnych rodzajów pamięci można znaleźć w dokumentacji modemu lub internecie
  • -f (domyślna wartość: "%D %T"), opcja formatowania daty SMS (przydatne przy obróbce skryptami), lista dostępnych opcji można znaleźć w internecie
  • -j umożliwia wyświetlanie smsów w formacje json
Przykład:


    # sms_tool -d /dev/ttyUSB1 recv
    MSG: 0
    From: 48xxxxxxxxx
    Date/Time: 07/13/17 20:26:27
    Witaj swiecie
    MSG: 1
    From: 8000
    Date/Time: 07/20/17 06:57:43
    Limit szybkiej transmisji danych zostal wykorzystany. Wybierz *222*0# sprawdz oferte #pakiety_internetowe. Aktywuj pakiet bez obaw o predkosc transmisji danych.
    MSG: 8
    From: VIRGIN
    Date/Time: 07/27/17 08:28:30
    Jezeli wykorzystasz darmowe minuty, SMSy czy Internet z #Freemium to nic nie szkodzi, bo mamy oferte dodatkowych pakietow ZA POLDARMO: virginmobile.pl/oferta
    MSG: 9
    From: 48xxxxxxxxx
    Date/Time: 08/05/17 18:01:47
    Test
    Test
    Test
    MSG: 10
    From: 48xxxxxxxxx
    Date/Time: 08/05/17 18:41:40
    SMS segment 1 of 3
    To jest test bardzo długiej wiadomości. To jest test bardzo długiej
    MSG: 11
    From: 48xxxxxxxxx
    Date/Time: 08/05/17 18:41:40
    SMS segment 2 of 3
        wiadomości. To jest test bardzo długiej wiadomości. To jest test b
    MSG: 12
    From: 48xxxxxxxxx
    Date/Time: 08/05/17 18:41:40
    SMS segment 3 of 3
    ardzo długiej wiadomości.

Formatowanie czasu odbioru SMSa:


    # sms_tool -d /dev/ttyUSB1 -f "%Y-%m-%d %H:%M" recv
    MSG: 0
    From: 48xxxxxxxxx
    Date/Time: 2017-07-13 20:26
    Witaj swiecie

Wynik w formacje json:


    # sms_tool -d /dev/ttyUSB1 -j recv
    {"msg":[{"index":0,"sender":"48xxxxxxxxx","timestamp":"07/13/17 20:26:27","content":"Witaj swiecie"}]}


wysyłanie (nazwa akcji: send)

Aby wysłać SMS należy podać dwa dodatkowe argumenty: numer odbiorcy oraz treść wiadomości. Numer należy poprzedzić prefiksem kraju (dla Polski jest to 48, bez znaku "+"), rozmiar wiadomości zaś nie może przekroczyć 80 do 160 znaków (w zależności o wykorzystywanych znaków specjalnych).

Przykład:


    # sms_tool -d /dev/ttyUSB1 send 48601123456 "Witaj swiecie"
    sms sent sucessfully: 13

Konsola OpenWrt/LEDE domyślnie nie obsługuje znaków narodowych (locales), więc może być problem z wysyłaniem SMSów ze znakami narodowymi. Wysyłane wiadomości są w kodzie GSM7bit; wszystkie znaki narodowe czy specjalnie zamienione zostaną na znaki zapytania ('?').

usuwanie (nazwa akcji: delete)

Usuwa jedną lub wszystkie wiadomości. Wymagane jest podanie opcji: "all" - usuwa wszystkie dostępne SMSy lub określonego numeru wiadomości (wyświetla się on podczas odczytu SMSów)

Przykład:


    # sms_tool -d /dev/ttyUSB1 delete 6
    delete msg from 6 to 6
    Deleted message 6

USSD

Program umożliwia wysyłanie kodów USSD i odbieranie wyniku. Domyślnie wiadomość jest wysyłana i dekodowania w PDU, ale dostępne są dodatkowe opcje którymi można sterować zachowaniem programu:

  • -R powoduje wysyłanie kodu USSD jawnym teksem, tak jak podano go jako parametr wywołania. Nie jest wykonywanie przekodowanie polecenia na PDU
  • -r powoduje odebranie wiadomości i wyświetlenie jej zawartości, bez dekodowania jej jako PDU
W/w opcje przeznaczone są dla modemów które oczekują polecenia czystym tekstem lub wyświetlają odpowiedź tekstowo bez potrzeby dekodowania odpowiedzi.

  • -D dodaje wyświetlanie komunikatu wysyłanego bezpośrednio do modemu oraz wyświetlanie wyniku (o ile zostanie odebrany)
Przykład:


    # sms_tool -d /dev/ttyUSB1 ussd "*222#"
    Teraz korzystasz z pakietu #Freemium. Masz 25 SMS, 30 min do wszystkich i 0 minut do sieci i 228 MB. Pakiet wazny do 23-08-2017

W chwili obecnej program obsługuje tylko jedno liniowe komunikaty USSD.

Instalacja

Jeżeli ktoś używa moich obrazów z eko.one.pl to wystarczy wykonać polecenia:


    # opkg update
    # opkg install sms-tool

(pakiet nazywa się sms-tool, program w nim zawarty zaś sms_tool).

Kody źródłowe

Źródła programu: mój github
Makefile dla OpenWrt/LEDE: github

Uwagi

Dla niektórych sieci wysyłanie i odbieranie USSD lub/i SMS możliwe jest tylko po połączeniu modemu w trybie 3G (nie 4G/LTE). Program nie obsługuje wszystkich możliwych typów SMS.