Bramka SMS z Linuxem

Autor: Marzena Fąfara / kategoria: Linux / data: 10-03-2010

2

 Bramka SMS i serwer z GentooJak 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.



Komentarze (2)

Dzięki za info.

Dodaj komentarz