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.