smstools3 w OpenWrt
Ostatnia zmiana: 2020-11-02 18:09
Wielu użytkowników korzysta z modemów komórkowych, w których często oprócz pakietu danych można dostać od operatora pewną pulę smsów. W prosty sposób można przekonać router do odbierania i wysyłania smsów (patrz:
gnokii), choć da się to także w prosty sposób zautomatyzować.
Z pomocą przyjdzie pakiet
smstools3, który umożliwia odbieranie i wysyłanie smsów oraz obsługę skryptów. Ma on dość duże możliwości konfiguracji, więc sugeruję na początku przejrzeć dokumentację zawartą na stronie projektu. Zastosowanie tego rozwiązania: wysyłanie powiadomień, zdalny nadzór routera (reboot, powiadamianie o zmianach w adresie czy konfiguracji). Rozwiązanie sprawdzono z modemem Huawei E3131 i kartą Orange.
Instalacja
# opkg update
# opkg install smstools3
Zostaną także zainstalowane zależności.
Konfiguracja
Plikiem konfiguracyjnym jest
smsd.conf umieszczony w katalogu
/etc. Ma on pewną budowę i możliwość ustawienia wielu opcji; wraz z pakietem smstools3 dostarczany jest ten plik na którym można się wzorować pisząc własną konfigurację.
Na początek wystarczy plik konfiguracyjny o następującej zawartości:
devices = GSM1
incoming = /var/spool/sms/incoming
outgoing = /var/spool/sms/outgoing
checked = /var/spool/sms/checked
failed = /var/spool/sms/failed
sent = /var/spool/sms/sent
#eventhandler = /usr/bin/obsluga_sms
[GSM1]
init = ATE0
device = /dev/ttyUSB2
incoming = yes
#pin = 1111
baudrate = 115200
rtscts = no
Należy go umieścić w pliku
/etc/smsd.conf. Opcję
pin należy podać stosownie do tego czy karta SIM posiada kod PIN czy nie, to samo dotyczy opcji
device - należy tam podać prawidłowy interfejs komunikacyjny. Numer portu zależy od posiadanego modemu.
Uruchomienie
Jeżeli korzystamy ze standardowego pliku konfiguracyjnego, to skrypt startowy samodzielnie tworzy katalogi wymagane przez program. Jeżeli podaliśmy inne katalogi, to należy najpierw je utworzyć:
# mkdir -p /var/spool/sms/outgoing
# mkdir -p /var/spool/sms/checked
# mkdir -p /var/spool/sms/failed
# mkdir -p /var/spool/sms/incoming
# mkdir -p /var/spool/sms/sent
itd. Następnie po prostu uruchamiamy program:
# /etc/init.d/smstools3 enable
# /etc/init.d/smstools3 start
Poleceniem
ps weryfikujemy czy proces jest uruchomiony, w logach (polecenie
logread) powinna też pojawić się informacja o uruchomieniu procesu.
Wysyłanie smsów
Jako test można wysłać smsa. Tworzymy plik
/tmp/sms o zawartości:
To: 48601112233
To jest test wiadomosci.
Następnie należy skopiować go do katalogu określonego przez parametr
outgoing czyli w tym przypadku:
# mv /tmp/sms /var/spool/sms/outgoing
W logach powinna pojawić się informacja o wysłaniu SMS, którego oczywiście po chwili powinniśmy odebrać na telefonie.
Odbiór i analiza wiadomości
Uważny czytelnik zauważy zakomentowaną opcję
eventhandler w pliku konfiguracyjnym. Dzięki niej możliwe jest uruchomienie dowolnego programu do obsługi smsów. Jako argument przyjmuje nazwę programu, który wywoływany przy wysyłaniu lub odbiorze smsa z kilkoma parametrami. Pierwszym jest nazwa akcji (np. "SENT", "RECEIVED", "FAILED"), drugim zaś nazwa pliku zawierająca treść SMSa. Nas interesuje odbiór czyli będziemy obsługiwać akcję "RECEIVED". Tworzymy plik
/usr/bin/obsluga_sms i uzupełniamy go o odpowiedni kod:
#!/bin/sh
if [ $1 != "RECEIVED" ]; then
exit 0
fi
TEL=$(awk '/^From:/ {print $2}' $2)
if grep -q status $2; then
echo "To: $TEL" > /tmp/sms
echo "" >> /tmp/sms
echo "jeszcze zyje" >> /tmp/sms
mv /tmp/sms /var/spool/sms/outgoing
fi
if grep -q reboot $2; then
reboot
fi
exit 0
Napisany jest prostym kodem, ale należy się kilka słów wyjaśnienia co ten skrypt robi:
- sprawdza czy został wywołany przy otrzymaniu smsa (pierwszy parametr ma być równy RECEIVED). Jeżeli nie jest - następuje wyjście ze skryptu.
- z pliku z treścią smsa wyciągany jest numer telefonu nadawcy
- przeszukiwany jest plik (grepem) i wyszukiwane odpowiednie polecenie. Ten skrypt reaguje na dwa polecenia: "status" oraz "reboot". Pierwszy odsyła smsem do nadawcy status routera (w tym przykładzie w postaci zwykłego napisu), drugi zaś - powoduje restart routera.
Tak utworzonemu plikowi nadajemy prawa wykonywania oraz odkomentujemy opcję
eventhandler:
# chmod 755 /usr/bin/obsluga_sms
# sed -i 's/#eventhandler/eventhandler/' /etc/smsd.conf
Testy
Wysyłamy smsa o treści "status" na numer karty w modemie (podpowiedź - jeżeli nie wiadomo jaki jest numer modemu to należy wcześniej wysłać do siebie smsa z modemu). Po kilku sekundach router powinien odpowiedzieć wiadomością. Jeżeli tak nie jest - szukamy w logach co jest przyczyną. Jeżeli sms nie został wysłany to przyczyna błędu powinna znaleźć się w jednym z plików w katalogu
/var/spool/sms/failed (katalog zdefiniowany przez opcję
failed w pliku konfiguracyjnym).
Zakończenie
Ten prosty skrypt warto rozbudować o kontrolę SMSów i zrobić listę dopuszczonych numerów. Ochroni to przez przypadkowym spamem smsowym, czy smsem sterującym wysyłanym z innego źródła.