Program do obsługi wiadomości SMS i USSD
Ostatnia zmiana: 2024-07-26 10:33
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 (jest za duży) 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 oraz poleceń AT
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] at command
options:
-b <baudrate> (default: 115200)
-c coding scheme (for ussd, 0 - 7BIT, 2 - UCS2, default: detect)
-d <tty device> (default: /dev/ttyUSB0)
-D debug (for ussd)
-f <date/time format> (for sms/recv)
-j json output (for sms/recv)
-r use raw output (for ussd and sms/recv)
-R use raw input (for ussd)
-s <preferred storage> (for sms/recv/status)
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 na którym możliwa jest komunikacja z 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. Rozmiar wiadomości 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
# sms_tool -d /dev/ttyUSB2 send 316 "doladuj 5 xxxxxxxxx"
sms sent sucessfully: 5
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 ('?').
Numer telefonu należy poprzedzić prefiksem kraju (dla Polski jest to 48, bez znaku "+"). Jeżeli numer jest 5, 4 lub 3 znakowy to jest on traktowany jako "krótki" i nie należy go poprzedzać prefiksem kraju.
usuwanie (nazwa akcji: delete)
Usuwa jedną lub wszystkie wiadomości. Wymagane jest podanie opcji:
- all - usuwa wszystkie dostępne SMSy
- numer - usuwa określony 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
AT
Wysyłanie poleceń AT do modemu.
Przykład:
# sms_tool -d /dev/ttyUSB1 at "at+csq"
+csq: 24,99
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
githubMakefile dla OpenWrt/LEDE:
githubUwagi
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). Dekodowane są tylko wiadomości typu SMS-DELIVER, program nie obsługuje wszystkich możliwych typów i rodzajów SMS.