Raspberry Pi – skrypt php do wysyłania wiadomości SMS podając argumenty za pomocą gammu

W tym artykule zaprezentuję skrypt php do wysyłania wiadomości SMS za pomocą gammu. Skrypt zadziała na każdym systemie linux i z zainstalowanym php oraz podłączonym modemem usb, ja wybrałem model Huawei E3131. Jest to zwykły skrypt php którego ja używam z terminala systemu linux, ale można go również wykonać za pomocą przeglądarki przez stronę www, dając odpowiednie uprawnienia.

Zaprezentuje skrypt na przykładzie urządzenia Raspberry Pi z podłączonym modemem GSM do portu USB, model Huawei E3131. Za pomocą tego urządzenia skrypt można również wykonywać z innego serwera linux. Wszystko zostanie opisane w tym artykule.

Na początek kilka słów o Raspberry Pi.

Początkowo była to platforma edukacyjna, mająca na celu zapobiec stale obniżającemu się poziomowi wiedzy studentów. By zachęcić ich do nauki programowania i robotyki, stworzono minikomputer. Tak powstało tanie, niewielkie urządzenie dla majsterkowiczów i programistów. Z czasem okazało się, że platforma znajduje szersze zastosowanie.

Raspberry, o czym warto wiedzieć, to nie tylko komputery, ale i wiele różnych urządzeń peryferyjnych podłączanych do nich, a więc kamery, czujniki, układy jezdne, ekrany itp. System operacyjny „Malinki” to Raspberry Pi OS (Raspbian). Skojarzenia z Debianem są jak najbardziej uzasadnione, gdyż Raspbian to dystrybucja Linuxa i jest oparty właśnie na systemie Debian.

Ja na karcie pamięci 16 GB zainstalowałem system za pomocą Raspberry Pi Imager. Program można pobrać z tego linka, można w nim z góry ustawić nazwę użytkownika, hasło oraz usługi które mają być uruchomione np. ssh. Po włożeniu karty micro SD do urządzenia, po kilku minutach wszystko uruchomi się samo. Będziemy mogli zalogować się do Raspberry Pi po ssh za pomocą innego komputera np. za pomocą putty z systemu Windows lub przez terminal z systemu Linux.

Na Raspbianie doinstalowałem aplikacje apache2, php oraz dla ułatwienia pisania skryptów mc (Midnight Commander).

sudo apt update
sudo apt install apache2 php7.4 mc

Wersja php może być nowsza, nie stanowi to problemu przy wykonywaniu skryptu.

Instalacja modemu Huawei E3131.

Nie będę tego objaśniał bo pełno jest tutoriali jak to zrobić w necie, a obecna wersja Rasbian wykrywa modem poprawnie i nie trzeba nic robić żeby system poprawnie wykrył modem.

Instalacja i konfiguracja gammu w systemie Linux Rasbian.

Instalacja wygląda dokładnie tak samo w każdym systemie z rodziny debian.

sudo apt update
sudo apt install gammu

W obecnym systemie Raspbian nie jest konieczne wykonanie konfiguracji gammu, podczas wysyłania wyrzuca dwa błędy, ale nie za szkodzi wykonać konfiguracje. Zrobimy to tworząc plik .gammurc w głównym katalogu użytkownika:

sudo mcedit .gammurc
[gammu]
port = /dev/ttyUSB0
model =
connection = at19200
synchronizetime = yes
logfile =
logformat = nothing
use_locking =
gammuloc =

Teraz możemy sprawdzić czy wszystko działa poprawnie wysyłając wiadomość sms za pomocą polecenia:

echo "test" | gammu sendsms TEXT 601321321

*** Ciekawostka. Numer wpisujemy w postaci 9 cyfrowej (bez 48 lub +48), wiadomość w tym przykładzie test wpisujemy w cudzysłowiu ” chyba że chcemy wysłać wiadomość zawierającą tylko jedno słowo. Jeżeli spróbujemy wysłać wiadomość bez tego znacznika zawierającą kilka słów system potraktuje kolejne słowa jako kolejne argumenty a wiadomość dotrze tylko z pierwszym słowem. Reasumując poprawną formą dla jednego słowa jest polecenie:

echo test | gammu sendsms TEXT 601321321

A dla wiadomości zawierającej więcej słów:

echo "test test test" | gammu sendsms TEXT 601321321

Jak widać wiadomość została wysłana poprawnie, sieć zwróciła wiadomość OK. Jeżeli jednak coś pójdzie nie tak jak chcemy np. na karcie sim będzie zbyt mało środków, karta została zablokowana lub wpiszemy niepoprawny numer sieć zwróci błąd.

Przejdźmy do napisania kodu php który za pomocą podanych argumentów wyśle wiadomość sms. Kod:

<?php
//Zespol PGKOMP.PL
//smsSender-arg.php wysylanie wiadomosci sms na numer podajac argument nr. telefonu oraz wiadomosc
//przez modem gsm usb, z RaspberryPi przez aplikacje gammu

  //logujemy uruchomienie skryptu
  $log = fopen("log_RaspberryPi_smsSender.txt", "a");
  fwrite($log, date('Y-m-d H:i:s')."\tRaspberryPi\tsnsSender-arg.php:\tUruchomienie skryptu smsSender-arg.php.\n");
  fclose($log);
  
  //sprawdzamy czy wszystkie argumenty zostały podane
  if ($argc < 3) {
    die("\n\nPodano zbyt mało argumentów \n\n"
            . "argv: NIE PODANO ARGUMENTU\n\n");
    }

  //wpisujemy podane argumenty do zmiennych
  $numer = $argv[1];
  $wiadomosc = $argv[2];

  //wydajemy polecenie do wyslania wiadomosci sms za pomoca gammu wpisujac zmienna z zawarta wiadomoscia oraz zmienna z numerem telefonu
  $polecenie = "echo $wiadomosc |gammu sendsms TEXT $numer";
  //za pomocą zmiennej $message wykonujemy powyższe polecenie
  $message = shell_exec("$polecenie");

  //wywołujemy zmienną $message, czyli wykonujemy powyzsze polecenie wysłania sms
  echo $message;
  //wyświetlamy wiadomosc oraz wpisane argumenty
  echo "\nWyslano sms na numer: ".$numer ." o tresci: ".$wiadomosc.".\n\n";

  //powyzsze czynnosci zapisujemy w logu do pliku tekstowego
  $log = fopen("log_RaspberryPi_smsSender.txt", "a");
  fwrite($log, date('Y-m-d H:i:s')."\tRaspberryPi\tsmsSender-arg.php:\tWyslano sms na numer: ".$numer." o tresci: ".$wiadomosc.".\n");
  fwrite($log, date('Y-m-d H:i:s')."\tRaspberryPi\tsmsSender-arg.php:\tZakonczenie skryptu smsSender-arg.php.\n");
  fclose($log);

?>

Skrypt wykonujemy za pomocą polecenia:

sudo php smsSender-arg.php 601321321 "WiAdOmOsC TeStOwA"

Wysłanie wiadomości za pomocą powyższego skryptu jest logowane do pliku txt log_RaspberryPi_smsSender.txt żeby było wiadomo na jaki numer wysłaliśmy wiadomość i o jakiej treści.

Jeden komentarz do “Raspberry Pi – skrypt php do wysyłania wiadomości SMS podając argumenty za pomocą gammu

  1. Pingback: Instalacja, konfiguracja oraz opis funkcji oprogramowania gammu w systemie z rodziny debian. - BLOG.PGKOMP.PL

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *