Bramka SMS z Linuxem
Autor: Marzena Fąfara / kategoria: Linux / data: 10-03-2010
2
Jak wykorzystać stary telefon komórkowy?
Można podłączyć go do komputera i zrobić z niego funkcjonalną bramkę SMS, dzięki której możemy otrzymywać na bieżąco informację o stanie serwera oraz o stanie wszelkich urządzeń podpiętych do serwera. Za pomocą komórki możemy także uruchamiać określone procesy na naszym serwerze. Możemy np. sms-em uruchomić proces odpowiedzialny za włączenie nagrywania w kamerze podpiętej do serwera.
Aby uruchomić takie rozwiązanie potrzebujesz:
- komputer z linuksem
- telefon komórkowy z kartą SIM i tanimi SMS-ami
– na stronie projektu Gnokii znajdziemy listę modeli, dla których rozwiązanie jest wspierane i zostało przetestowane - kabel do transmisji danych (najlepiej sprawdzić na Cable Support GnokiiWiki czy nasz kabel będzie działać), można naturalnie korzystać z bluetooth-a czy Irda jednak połączenie kablowe będzie najbardziej odporne na zakłócenia
Mój zestaw stanowi „domowy serwer” z Gentoo, Nokia 6020 oraz kabelek CA-42
Po podłączeniu telefonu na usb powinniśmy już coś zobaczyć:
$ lsusb
Bus 006 Device 005: ID 0421:0802 Nokia Mobile Phones CA-42 Phone Parent
Należy zwrócić uwagę na USB ID.. Na stronie projektu gnokii znajdziemy informacje o sterowniku, który powinien współpracować z naszym kablem. Jeżeli nie posiadamy danego sterownika prawdopodobnie będzie trzeba skompilować dany moduł. Dla mojej konfiguracji wygląda to tak:
| USB ID | Linux kernel driver | Status | Comments |
|---|---|---|---|
| 0×0421:0×0802 | usbserial + cdc_acm | probably works | http://www.qbik.ch/usb/devices/showdev.php?id=3251
The CA-42 runs the standard usb-to-serial protocol (usbcdc). Thus the usbserial driver can be used. Before plugging the cable use the insmod to bind the usbserial driver to the cable: insmod usbserial vendor=0×0421 product=0×0802. As soon as you plug in the cable a /dev/ttyACMX node should be created. |
Jak się później okaże „probably works” tak naprawdę „works”. Wracając do naszego połączenia po wpięciu kabelka powinniśmy sprawdzić w jaki sposób widzi go jądro:
$ dmesg
usb 8-2: new full speed USB device using uhci_hcd and address 2 usb 8-2: configuration #1 chosen from 1 choice cdc_acm 8-2:1.0: This device cannot do calls on its own. It is not a modem. cdc_acm 8-2:1.0: ttyACM0: USB ACM device usbcore: registered new interface driver cdc_acm cdc_acm: v0.26:USB Abstract Control Model driver for USB modems and ISDN adapters
Jak widać Linux znalazł sterownik cdc_acm do mojego urządzenia. Od tej pory będzie operować na utworzonym pliku urządzenia /dev/ttyACM0. Jedyne co pozostało to zainstalować program, który będzie wysyłał sms-y. Skorzystamy w tym celu z pakietu gnokii. W zależności od tego jaki typ połączenia zastosujemy włączamy stosowne flagi (irda, bluetooth). Warto też rozważyć kompilację z flagami mysql i postgres. Musimy tylko zapamiętać nasze ustawienia w pliku /etc/portage/package.use
app-mobilephone/gnokii sms postgres irda
Ponieważ zależy mi na wysyłaniu/odbieraniu sms’ów oraz pakowaniu wszystkiego do bazy mysql włączam następujące flagi:
$ USE="sms mysql" emerge -pv gnokii
These are the packages that would be merged, in order: Calculating dependencies... done! [ebuild N ] sys-apps/pcsc-lite-1.5.5 USE="hal usb -static" 456 kB [ebuild N ] app-mobilephone/gnokii-0.6.27-r2 USE="X bluetooth mysql nls sms usb -debug -ical -irda -postgres" LINGUAS="pl -cs -de -et -fi -fr -it -nl -pt -sk -sl -sv -zh_CN" 1,457 kB
Po zainstalowaniu pakietu należy dokonać paru zmian w pliku konfiguracyjnym /etc/gnokiirc. Chodzi głównie o port oraz model telefonu. Moja konfiguracja wygląda mniej więcej następująco:
[global] port = /dev/ttyACM0 model = 6020 initlength = default connection = serial use_locking = yes serial_baudrate = 19200 smsc_timeout = 10 [xgnokii] allow_breakage = 0 [gnokiid] bindir = /usr/sbin/ [connect_script] TELEPHONE = 12345678 [disconnect_script] [logging] debug = on rlpdebug = off xdebug = off [phone_fake] port = foobar model = fake connection = serial
Jeżeli prawidłowo uzupełniliśmy wpisy w pliku możemy przystąpić do przetestowania naszej konfiguracji:
$ gnokii --identify
a w odpowiedzi powinniśmy otrzymać informacje o modelu telefonu, producencie oraz numerze IMEI.
GNOKII wersja 0.6.27 Received model RM-30 IMEI : xxxxxxxxxxxxxxx Producent : Nokia Found model "RM-30" Model : 6020 Nazwa produktu : RM-30 Wydanie : V 04.90 Serial device: closing device
Identyfikacja może chwilę potrwać, po drodze program wysypuje nam jeszcze mnóstwo logów, ale tak naprawdę ważny jest efekt końcowy. Jeżeli program zakończy działanie z błędem, prawdopodobnie nie ma komunikacji na porcie. Mówiąc krótko – u mnie działa
Dlatego mogę już w tym momencie wysłać próbnego smsa:
$ echo "Moj testowy sms." | gnokii --sendsms +48XXXXXXXXX
który pojawia się w skrzynce odbiorczej telefonu, a na konsoli dostaję:
. . . Message received: 0x02 / 0x000e 01 74 00 03 00 01 0c 08 00 00 2a 55 55 00 Received message type 02 Frame of type 0x02 (SMS handling) received! SMS sent (reference: 42) Udane wysłanie. Numer referencyjny wiadomości: 42 Serial device: closing device
Tak więc – działa!
Przejdźmy teraz do ustawień smsd, który będzie wysyłał moje sms’y. Daemon sms periodycznie sprawdza czy w bazie są jakieś smsy do wysłania (a konkretnie sprawdza wartość w polu ‘processed’ tablicy outbox – jeżeli jest FALSE, wtedy podejmuję próbę wysłania wiadomości pod wskazany numer telefonu. Natomiast wszystkie smsy przychodzące trafiają do tablicy ‘inbox’ . Dokładniejszy opis znajdziecie w dalszej części artykułu. Przykładowe pliki z tabelkami dla mysql powinniśmy znaleźć razem z pakietem gnokii. Do postgresa raczej nie będzie, ale wystarczy zmodyfikować składnię pliku mysql pod kątem postgresa.
Najpierw musimy stworzyć bazę danych. Przykładowy plik dla mysql znajdziemy w katalogu /usr/share/doc/gnokii/smsd. Wygląda on następująco:
-- CREATE DATABASE smsd; -- USE smsd; CREATE TABLE inbox ( id int(10) unsigned NOT NULL auto_increment, number varchar(20) NOT NULL default '', smsdate datetime NOT NULL default '0000-00-00 00:00:00', -- Warning (Code 1287): 'TIMESTAMP(14)' is deprecated; use 'TIMESTAMP' instead insertdate timestamp(14) NOT NULL, text text, phone tinyint(4), processed tinyint(4) NOT NULL default '0', PRIMARY KEY (id) ); CREATE TABLE outbox ( id int(10) unsigned NOT NULL auto_increment, number varchar(20) NOT NULL default '', -- Warning (Code 1287): 'TIMESTAMP(14)' is deprecated; use 'TIMESTAMP' instead processed_date timestamp(14) NOT NULL, -- Warning (Code 1287): 'TIMESTAMP(14)' is deprecated; use 'TIMESTAMP' instead insertdate timestamp(14) NOT NULL, text varchar(160) default NULL, phone tinyint(4), processed tinyint(4) NOT NULL default '0', error tinyint(4) NOT NULL default '-1', dreport tinyint(4) NOT NULL default '0', not_before time NOT NULL default '00:00:00', not_after time NOT NULL default '23:59:59', PRIMARY KEY (id) ); CREATE TABLE multipartinbox ( id int(10) unsigned NOT NULL auto_increment, number varchar(20) NOT NULL default '', smsdate datetime NOT NULL default '0000-00-00 00:00:00', -- Warning (Code 1287): 'TIMESTAMP(14)' is deprecated; use 'TIMESTAMP' instead insertdate timestamp(14) NOT NULL, text text, phone tinyint(4), processed tinyint(4) NOT NULL default '0', refnum int(8) default NULL, maxnum int(8) default NULL, curnum int(8) default NULL, PRIMARY KEY (id) ); -- CREATE INDEX outbox_processed_ix ON outbox (processed); -- GRANT SELECT, INSERT, UPDATE, DELETE ON smsd.* TO smsd@localhost;
Jak już wcześniej wspomniałam SMSD (demon SMS) przeznaczony jest do odbierania i wysyłania SMS-ów we współpracy z serwerem SQL. W chwili obecnej obsługiwane są bazy PostgreSQL, MySQL i specjalny moduł „file”, który pozwala na działanie bez bazy danych SQL. W bazie danych przechowywane są sms-y przychodzące oraz wychodzące. Należy utworzyć bazę danych (domyślna nazwa to „sms”) oraz tabele inbox (dla sms’ów odbieranych) i outbox (dla sms’ów wychodzących). Najważniejsze pola w tabeli inbox to:
- number – numer telefonu, z którego jest odbierany sms
- smsdate – data ustawiona przez centrum SMS
- insertdate – data wprowadzenia sms-a do tabeli
- text – treść SMS
- phone – numer telefonu do wykorzystania. Jeśli uruchamiamy SMSD bez opcji-t można pominąć tę kolumnę.
- processed – SMSD ustawia tutaj zawsze wartość FALSE.
W momencie gdy na telefon przyjdzie SMS, SMSD przenosi go do tablicy ‘inbox’ i jednocześnie usuwa go z telefonu.
Tabela ‘outbox’ przeznaczona jest dla SMS-ów wychodziących. SMSD okresowo sprawdza zawartość tabeli i wyszukuje wierszy, w których kolumna „processed” ma ustawiony atrybut FALSE, a następnie wysyła sms pod numer ustawiony w polu „number:
- number – numer telefonu pod, który wysyłany jest sms
- insertdate – data wprowadzenia SMS-a do tabeli
- text – treść SMS
- phone – numer telefonu do wykorzystania. Jeśli uruchamiamy SMSD bez opcji-t można pominąć tę kolumnę.
- processed – SMS-y do wysłania muszą mieć status FALSE. SMSD wysyłając SMS-a ustawia w polu ‘processed’ wartość TRUE.
- error – w polu tym znajduje się wartość zwrócona przez funkcję gn_sms_send(). Szczegółowe informacje wyjaśniające znaczenie kodów błędu znajdziemy w pliku <gnokii/error.h> w źródłach pakietu.
- dreport – żądanie raportu doręczenia wiadomości (0 – wyłączony, 1 – włączony).
- not_before – sms nie zostanie wysłany przed godziną xx:xx:xx (domyślnie 00:00:00).
- not_after – sms nie zostanie wysłany po godzinie xx:xx:xx (domyślnie 23:59:59).
Pozostaje nam jeszcze dodać użytkownika sms, który będzie miał uprawnienia do korzystania z bazy:
CREATE USER 'smsuser'@'localhost' IDENTIFIED BY 'mypassword'; GRANT SELECT , INSERT , UPDATE , DELETE ON `sms` . * TO 'sms'@'localhost';
Teraz pozostaje nam jedynie uruchomić demona sms. Z pomocą man’a (man smsd) odpalamy nasz proces:
$ smsd --user smsuser --password mypassword --db sms --host localhost --module mysql --logfile /var/log/smsd --inbox IN
W wolnej chwili dopiszę jeszcze jakiś interfejs www w PHP do obsługi bazy danych, ale o tym napiszę w kolejnych artykułach.








[...] Bramka SMS z Linuxem – [...]
Dzięki za info.