Program do obsługi wiadomości SMS i USSD
Ostatnia zmiana: 2017-08-12 09:05

W moim repozytorum LEDE 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 nie obsługuje modemów typu hilink. 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:
        -d <tty device> (default: /dev/ttyUSB0)
        -b <baudrate> (default: 115200)
        -s <preferred storage> (for sms/recv/status)
        -f <date/time format> (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. Zwykle są one przechowywane w określonym miejscu (np. na karcie SIM lub pamięci modemu) i z niego są odczytywane. Podobnie jak w przypadku akcji "status" możliwy jest wybór określonego obszaru:

  • -s (domyślnie wartość ustalona przez modem), najczęściej spotykane inne opcje: SM - karta SIM, ME - pamięć modemu
Dostępna jest także opcja formatowania daty SMS (przydatne przy obróbce skryptami):

  • -f (domyślna wartość: "%D %T"), lista dostępnych opcji można znaleźć w internecie
Przykład:


    # sms_tool -d /dev/ttyUSB1 recv
    MSG: 0
    From: 48xxxxxxxxx
    Date/Time: 07/13/17 20:26:27
    Witaj świecie
    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: 2
    From: 8000
    Date/Time: 07/21/17 08:27:06
    Twoj pakiet #Freemium jest wazny do 23.7.2017 i zostanie automatycznie odnowiony. Jesli chcesz zrezygnowac z odnowienia pakietu, odpowiedz STOP.
    MSG: 3
    From: 8000
    Date/Time: 07/23/17 08:11:19
    Twoj pakiet #Freemium jest wazny do 23.7.2017 i zostanie automatycznie odnowiony. Jesli chcesz zrezygnowac z odnowienia pakietu, odpowiedz STOP.
    MSG: 4
    From: VIRGIN
    Date/Time: 07/24/17 09:50:43
    Witaj, wlasnie odnowilismy darmowy pakiet #Freemium: 30 minut i 30 SMS-ow do wszystkich sieci oraz 300 MB. Pozdrawiamy Virgin Mobile Polska
    MSG: 5
    From: VIRGIN
    Date/Time: 08/03/17 08:48:10
    W ramach #Freemium mozesz dokupic dodatkowe pakiety minut, SMS, Internetu jakich potrzebujesz. Sprawdz na virginmobile.pl/oferta. Pozdrawiamy
    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 świecie


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ć 160 znaków.

Przykład:


    # sms_tool -d /dev/ttyUSB1 send 48601123456 "Witaj swiecie"
    sending sms to +48601123456: "Witaj swiecie"
    pdu: 0011000B918406113254F60000B00DD7343DAC06CDEFE9F2385D06
    modem: 'AT+CMGS=26
    'modem: '> 
    'modem: '
    'modem: '+CMGS: 13
    '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 (to problem systemu nie programu).

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.

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

Instalacja

Jeżeli ktoś używa moich obrazów LEDE to wystarczy wykonać polecenia:


    # opkg update
    # opkg install sms_tool

Kody źródłowe

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