smstools3 w OpenWrt
Ostatnia zmiana: 2016-02-26 21:26

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

Zostanie także doinstalowana zależność w postaci pakietu libiconv-full.

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
    outgoing = /var/spool/sms/outgoing
    checked = /var/spool/sms/checked
    failed = /var/spool/sms/failed
    incoming = /var/spool/sms/incoming
    report = /var/spool/sms/report
    sent = /var/spool/sms/sent
    #eventhandler = /usr/bin/obsluga_sms

    [GSM1]
    init = ATE0
    device = /dev/ttyUSB2
    incoming = yes
    #pin = 1111
    baudrate = 19200
    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

Należy najpierw utworzyć odpowiednie katalogi zdefiniowane w pliku konfiguracyjnym:


    # 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/report
    # mkdir -p /var/spool/sms/sent

A następnie po prostu uruchamiamy program:


    # /usr/local/bin/smsd

Poleceniem ps weryfikujemy czy proces jest uruchomiony, w logach (polecenie logread) powinna też pojawić się informacja o uruchomieniu procesu.

Docelowo w/w polecenia można umieścić w pliku /etc/rc.local, choć można to zrobić w domyślny sposób:


    # /etc/init.d/smstools3 enable
    # /etc/init.d/smstools3 start

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.