Bramka SMS na Raspberry PI - Michał Sternadel Bramka SMS na Raspberry PI

Światło: Zapal | Zgaś

Bramka SMS na Raspberry PI

Dodano: 01.03.2017, 07:26:52

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:

  • Raspberry Pi (ja używałem Raspberry Pi Model B+ 512MB RAM)
  • Karta microSD (ja użyłem 8GB)
  • Modem GSM na USB, zarówno Huaweii E173 jak i E3551/E3131 działają wspaniale
  • Zasilanie 5V (1A wystarczy w zupełności)
  • Według kaprysu: obudowa, przedłużacze USB, karta WiFi na USB

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-free
oraz 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 curl
Instalator 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.gz
Ustawiamy 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 -t
Jeś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/gammu
Tworzymy 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 = 0
Oraz 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

Pozostaje założyć sobie jakiegoś użytkownika, skonfigurować dostęp przez API oraz przetestować działanie, na przykład curlem:
/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.

Dodane obrazy:
Bramka SMS na Raspberry PI

Dodaj komentarz

Szybki kontakt:

Pozostaw zółtą karteczkę-wlepkę pod adresem:
Kraków, ul. Pawia 3 z id: #776AFFDA# oraz wiadomością. Jak nie zginie -- odczytam.

Ostatnie fotografie


Paproć
Paproć

Grzyb
Grzyb

  Więcej...