Z powodzeniem od roku używam fizycznej bramki SMS, którą zbudowałem na podstawie energooszczędnego komputera Raspberry Pi oraz modemu GSM. Na rynku istnieją również sprzętowe alternatywy, jednak ich koszt dziesięciokrotnie przewyższa cenę za wszystkie niezbędne części, do budowy własnej bramki. Osobiście testowałem kilka takich urządzeń i okazuje się, że nie odbiegają one sprawnością działania i funkcjami od mojej bramki.
Poniżej przedstawię opisową instrukcję jak taką bramkę skonstruować i cieszyć się alertami SMS o zatrzymaniu się krytycznych usług na serwerze aplikacji o godzinie 3:20 w nocy.
Aby w ogóle rozpocząć budowę urządzenia, potrzebne nam będzie:
Na samym początku musimy przygotować sobie system operacyjny - oczywiście będzie to Debian dla Raspberry Pi. Polecam od razu wersję lite. Instalację systemu na karcie wykonujemy zgodnie z instrukcją zawartą na stronie raspberrypi.org (w skrócie, dla Linuksa:
unzip yyyy-mm-dd-raspbian-jessie-lite.zip; dd bs=4M if=yyyy-mm-dd-raspbian-jessie-lite.img of=/dev/mmcblko0, dla Windows na przykład z wykorzystaniem programu Win32DiskImager).
Następnie łączymy się z komputerkiem, albo bezpośrednio klawiaturą i monitorem, albo przez sieć, wpinając kabel sieciowy do swojego switcha/komputera, albo przez kabel szeregowy. Wstępnie konfigurujemy system: sudo raspi-config
Ustawiając Hostname, Locale oraz dostęp przez SSH.
Konfigurujemy sieć, zgodnie z życzeniem, ja zalecam dodać sobie adres IP do zarządzania (w przypadku gdy nie uda nam się ustalić jakie IP otrzymała bramka, gdy działa bez monitora). Do pliku /etc/network/interfaces można dodać:
auto eth0:0 iface eth0:0 inet static name failback address 192.168.139.253 netmask 255.255.255.0 network 192.168.139.0
Można przystąpić do instalacji niezbędnego oprogramowania. Zalecam jeszcze od razu dodanie repozytorium pakietów, które da nam możliwość instalacji PHP w wersji 7.0 (skrypty uruchamiają się o wiele szybciej). Do pliku /etc/apt/sources trzeba dopisać:
deb http://repozytorium.mati75.eu/raspbian jessie-backports main contrib non-free deb-src http://repozytorium.mati75.eu/raspbian jessie-backports main contrib non-freeoraz wykonać:
sudo gpg --keyserver pgpkeys.mit.edu --recv-key CCD91D6111A06851 sudo gpg --armor --export CCD91D6111A06851 | sudo apt-key add - apt update apt install nginx php7.0 php7.0-curl php7.0-gd php7.0-imap php7.0-json php7.0-mcrypt php7.0-mysql php7.0-mysqli php7.0-opcache php7.0-readline php7.0-fpm php7.0-xml php7.0-mbstring mysql-server mysql-client git curlInstalator powinien zapytać o hasło dla użytkownika root serwera SQL. Wpisujemy tam cokolwiek trudnego do zapamiętania dla każdego innego człowieka niż my, na przykład:
PostaramSiePamietac2HaslaKtoreUzywamDoTwitera&fejsbuka
oraz staramy się to zapamiętać. Warto też założyć od razu dedykowanego użytkownika dla oprogramowania playSMS:
echo "CREATE USER 'playsms'@'localhost' IDENTIFIED BY 'HasloKtoreZnaTylkoPrezydentRzeczypospolitejPolskiejIJestPrzyklejoneNaKlapieLaptopaSluzbowegoPokazywanegoBardzoCzestoWTelewizorze'; GRANT USAGE ON *.* TO 'playsms'@'localhost' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0; CREATE DATABASE IF NOT EXISTS `playsms`; GRANT ALL PRIVILEGES ON `playsms`.* TO 'playsms'@'localhost';" | mysql -u root -p
Należy wpisać hasło root, oczywiście w tym przykładzie: PostaramSiePamietac2HaslaKtoreUzywamDoTwitera&fejsbuka
Teraz możemy pobrać i zainstalować playSMS:
mkdir -p /var/www/ cd /var/www/ wget http://downloads.sourceforge.net/project/playsms/playsms/Version%201.4/playsms-1.4.tar.gz tar zxf playsms-1.4.tar.gz ln -s playsms-1.4 playsms cd playsms cp install.conf.dist install.conf nano install.conf rm playsms-1.4.tar.gzUstawiamy wszystkie niezbędne parametry, najważniejsze to:
DBUSER="playsms", DBPASS="HasloKtoreZnaTylkoPrezydentRzeczypospolitejPolskiejIJestPrzyklejoneNaKlapieLaptopaSluzbowegoPokazywanegoBardzoCzestoWTelewizorze", DBNAME="playsms", DBHOST="localhost", PATHWEB="/var/www/playsms".Dodatkowo, jeżeli wybraliśmy PHP w wersji 7.0 musimy zmienić
$core_config['db']['type'] = 'mysql';w pliku /var/www/playsms/config-dist.php na
$core_config['db']['type'] = 'mysqli';(PHP 7 nie obsługuje już połączeń typu mysql). Uruchamiamy:
/var/www/playsms/install-playsms.sh
Po pomyślnej instalacji dodajemy wpis do pliku /etc/rc.local
/usr/local/bin/playsmsd /etc/playsmsd.conf start
Teraz pozostaje nam konfiguracja serwera www (nginx). Tworzymy plik /etc/nginx/sites-available/playsms o następującej treści:
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/playsms; index index.php index.html index.htm; server_name _; location / { try_files $uri $uri/ =404; } location ~ \.php$ { fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_intercept_errors on; fastcgi_pass unix:/var/run/php7.0-fpm.sock; # Dla php5 będzie tu inna ścieżka: /var/run/php5-fpm.sock; fastcgi_index index.php; fastcgi_buffers 16 16k; fastcgi_buffer_size 32k; include fastcgi.conf; } location ~ /\.ht { deny all; } }I wykonujemy odpowiednie komendy:
ln -s /etc/nginx/sites-available/playsms /etc/nginx/sites-enabled rm /etc/nginx/sites-enabled/default nginx -tJeśli nie pojawiły się błędy, uruchamiamy nginx:
service nginx start
Możemy przystąpić do instalacji i konfiguracji modemu GSM. Podłączamy modem do wolnego portu USB oraz wykonujemy poniższe komendy:
apt install gammu-smsd gammu usb-modeswitch useradd -G gammu www-data mkdir -p /var/log/gammu chown gammu:gammu /var/log/gammu chmod g+s /var/log/gammuTworzymy plik /etc/gammu-smsrc, o następującej treści:
[gammu] port = /dev/ttyUSB0 connection = at115200 logfile = /var/log/gammu/gammu.log logformat = textall [smsd] Service = files InboxPath = /var/spool/gammu/inbox/ OutboxPath = /var/spool/gammu/outbox/ SentSMSPath = /var/spool/gammu/sent/ ErrorSMSPath = /var/spool/gammu/error/ InboxFormat = unicode OutboxFormat = unicode TransmitFormat = auto debugLevel = 0 LogFile = /var/log/gammu/smsd.log DeliveryReport = no CheckSecurity = 0Oraz robimy symlinka:
ln -s /etc/gammu-smsdrc /etc/gammurc
Aby modem zawsze był widziany jako modem (a nie np. jak CD-ROM) warto dodać odpowiednie reguły do udeva, aby przy podłączeniu uruchamiać usb_modeswitch. Poniżej zawartość dla obydwu wspomnianych w tekście modemów (plik /etc/udev/rules.d/80-gsm.rules
#E173: ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1446", RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 1446 -V 12d1 -P 1506 -M '55534243123456780000000000000011062000000100000000000000000000'" #E3131: ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14fe", RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 14fe -V 12d1 -P 1506 -M '55534243123456780000000000000011062000000100000000000000000000'"Możemy sprawdzić czy wszystko działa:
udevadm trigger
i powinny pojawić się interfejsy szeregowe (ls -l /dev/ttyUSB*
)
Zmieniamy jeszcze USER=gammu na USER=root w /etc/default/gammu-smsd (Nawet po dodaniu użytkownika gammu do grupy dialout daemon gammu miał problemy z łączeniem się z modemem).
Uruchamiamy usługę gammu-smsd:
systemctl start gammu-smsd
I ustawiamy, aby uruchamiała się przy starcie:
systemctl enable gammu-smsd
Teraz konfiguracja samego playSMS za pośrednictwem interfejsu WWW. Trzeba zalogować się do playSMS przez przeglądarkę, wybrać Settings->Manage Gateway & SMSC, kliknąć na gammu manage oraz wpisać w Spool folder /var/spool/gammu
i zapisać.
Następnie należy przejść w Settings -> Main Configuration i wybrać gammu
dla Default SMSC
/usr/bin/curl "http://127.0.0.1/index.php?app=ws&u=UZYTKOWNIK1&h=TAJNYHASHUZYTKOWNIKA1&op=pv&to=004800000000&msg=Test&nofooter=1"
Czasem zdarza się tak, że jakiś SMS nie dojdzie na skutek nieokreślonego błędu w deamonie gammu-smsd. Niestety w obecnej wersji playsms nie ma mechanizmu, który automatycznie ponowi próbę wysyłki, dlatego też zastosujemy rozwiązanie pomocnicze, tworząc plik /usr/local/bin/resendSMS.sh, o następującej treści:
#!/bin/bash /usr/bin/mysql -u playsms -pHasloKtoreZnaTylkoPrezydentRzeczypospolitejPolskiejIJestPrzyklejoneNaKlapieLaptopaSluzbowegoPokazywanegoBardzoCzestoWTelewizorze -hlocalhost playsms -N -e"SELECT id, p_dst as number, REPLACE(p_msg,'\n', '%0A') as message FROM playsms_tblSMSOutgoing WHERE p_status='2' ORDER BY c_timestamp DESC;" | while read id number message ; do msg=`echo -e $message` /usr/bin/curl -s -g "http://127.0.0.1/index.php?app=ws&u=UZYTKOWNIK1&h=TAJNYHASHUZYTKOWNIKA&op=pv&to=${number}&nofooter=1&msg=${msg}" && /bin/echo "UPDATE playsms.playsms_tblSMSOutgoing SET p_status='1' WHERE id ='$id'" | /usr/bin/mysql -u sys_playsms -pHasloKtoreZnaTylkoPrezydentRzeczypospolitejPolskiejIJestPrzyklejoneNaKlapieLaptopaSluzbowegoPokazywanegoBardzoCzestoWTelewizorze -hlocalhost playsms done exit 0
W skrypcie oczywiście należy zmienić UZYTKONIK i TAJNYHASHUZYTKOWNIKA na odpowiedni, zczytany z playsms, a następnie ustawić atrybut wykonywania chmod +x /usr/local/bin/resendSMS.sh
Teraz skrypt ten warto wykonywać co kilka minut (tutaj co 2 minuty), a wiec należy utworzyć plik /etc/cron.d/resendFailedSMS, zawierający:
*/2 * * * * root /usr/local/bin/resendSMS.sh > /dev/null 2>&1
Teraz pozostaje nam cieszyć się własną bramką SMS.