четверг, 2 февраля 2012 г.

SMS Gate своими руками

    Много разного железа хранится у каждого хорошего админа в кладовке.  Применения ему нет, а выкинуть какой-то старый но служивший верой и правдой "пень" - не подымается рука.
Вот такие вот древние монстры, зачастую, и становятся  полигоном для экспериментов и настроек всяких гаджетов делающих нашу работу более удобной или же просто добавляют изюминку...
    Речь о такой изюминке и пойдет в этой статье. Потребовалось как то мне делать рассылку  сообщений сотрудникам организации, да что бы каждому приходили нужные только ему данные, да только на его номер... В былые времена с этим прекрасно справлялся почтовый демон, отправляя письма на почту вида +380номер_телефона@провайдер.ком, но времена те прошли... Итого имеем задачу и реализовываем ее:

Необходимо настроить SMS демон который будет:
1.Отправлять сообщения SMS на все операторы
2.Хранить лог отправленных сообщений
3.Вести лог ошибок
4.Быть гибким и не требовательным
5.Работать с базой данных
6.Поддерживать возможность отправки отчетов из 1С (в данном случае 8.2)

    Всем этим требованиям отвечает замечательный продукт gnokii. Пусть вас не смущает его название  и описание поддерживаемых моделей телефонов. Мы его подружим с телефоном Siemens A75 (выпуска начала века) да еще и по СОМ порту, да еще и через такой переходник, что система по идее должна была выдать сообщение о невозможности бытия.... А работать сия чудесная связка будет на оборудование которое как я уже говорил выше - жалко выбросить.
Итого имеем :
Мать - древнее чудо
Память - 2х64= 128 Mb
Видеокарта - PCI S3 Virge (Потребовалось только для установки OS)
Процессор - Pentium III 500 Mhz
Винчестер - WD 10 Gb (Жужжит как шмель - но работает исправно)
В качестве ОС был выбран Ubuntu linux
Linux SmS 3.0.0-15-generic #26-Ubuntu SMP Fri Jan 20  i686 i386 GNU/Linux
 (от Gentoo и FreeBSD пришлось отказаться в виду отсутствия времени на сборку пакетов и системы, а так же места на HDD необходимого для хранения всяких там ненужных нам GCC и прочего..)
Телефон - Siemens A75
Шнур для телефона - хитроумно-самодельный объединяющий в себе кабель передачи данных и зарядное устройство.
Дабы не тратить время и силы на красивую и компактную сборку, "железяка" была собрана в "стендовом" формате и так же инсталирована на стену в серверной. Винт прикрутили на блок питания. Блок питания разместили рядом, удалив лишние провода. Телефон закрепили на материнской плате шлейфом от дисковода. Шнур связали через розетку RJ-45 (чо под рукой было) припаяв парочку резисторов с обратной стороны, благо в сети достаточно схем подключения и разводок. В итого все это чудо выглядит теперь так:


Гламурненько, нестандартно, по своему красиво, но тем не менее - работает стабильно и "кушать не просит"...
Далее - устанавливаем Ubuntu (Я выбрал минимальную инсталяцию). Процесс описывать не стану, так как сложности никакой нет. После установки обновляем систему и устанавливаем следующий перечень пакетов, необходимых нам в работе:
(В виду того что мне влом все время дописывать sudo - я делаю все из под root)
Update :
apt-get update && apt-get upgrade && apt-get dist-upgrade
Install soft:
aptitude install gnokii-cli gnokii-smsd  gnokii-smsd-mysql mysql-server
 этого достаточно для первоначальной настройки нашей системы. Далее нам необходимо отредактировать файл конфигурации gnokii. Учтите тот факт что если вы запускаете службу как демон - то используется файл конфигурации /etc/xdg/gnokii/config а если от пользователя то конфиг должен находиться в ~/.config/gnokii/config
Описывать весь файл я не буду, так как он и так достаточно документирован покажу лишь то, что получилось у меня:

root-> cat /root/.config/gnokii/config 
[global]
model = AT 
connection = serial
initlength = default    
port = /dev/ttyS1
serial_baudrate =9600
smsc_timeout = 100

 Этого достаточно для минимальных запросов.  Значение строк и варианты можно посмотреть в файле /etc/xdg/gnokii/config. Проверим что система видит наше устройство:

gnokii --monitor
Мы должны увидеть что то типа:

Entering monitor mode...
Network: MTS, Україна (255 01)
LAC: 0106 (1050), CellID: 00000089 (152)
RFLevel: 31
Battery: -1
SIM: Used 22, Free 138
Phone: Used 0, Free 0
DC: Used 22, Free 138
EN: Used 0, Free 0
FD: Used 0, Free 0
RC: Used 0, Free 0
CALL0: IDLE
CALL1: IDLE

Если у вас похожие данные - можем уже пробовать отправить СМС:

echo "Some message text"|gnokii --sendsms '+380501234567'

Осталось теперь настроить это все как демон и привязать базу данных.
Создадим базу данных и пользователя для нашего демона:
mysql -uroot -p  
mysql> create database smsd;
Создадим пользователя
mysql> GRANT ALL PRIVILEGES ON smsd.* TO smsduser@"%"

            |IDENTIFIED BY 'smsdpassword' WITH GRANT OPTION;
Выйдем из mysql и проверим что у нас все получилось

root-> mysql -usmsduser -psmsdpassword
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 58
Server version: 5.1.58-1ubuntu1 (Ubuntu)


Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| smsd              |
+--------------------+
2 rows in set (0.02 sec)

Далее нам необходимо создать структуру БД. У нас для этого есть уже готовый файл
 /usr/share/doc/gnokii-smsd-mysql/sms.tables.mysql.sql
но его нужно немного изменить. Дело в том, что отправляя смс руками, gnokii  автоматом разбивает длинные сообщения на несколько смс, а вот демон отправляет только одно, отсекая все лишнее. Нас это конечно не устраивает, поэтому перед импортом открываем файл
vim /usr/share/doc/gnokii-smsd-mysql/sms.tables.mysql.sql  (вместо vim можно другой редактор)
находим секцию:
CREATE TABLE outbox 
и меняем в ней параметр
 text varchar(160) default NULL,
на
 text varchar(1000) default NULL,
После чего делаем импорт
root-> mysql -usmsduser -psmsdpassword smsd </usr/share/doc/gnokii-smsd-mysql/sms.tables.mysql.sql
Ну и на последок сделаем наш сервер базы данных доступным по сети, для чего в файле

 /etc/mysql/my.cnf  заменим параметр bind-adress на наш IP

#bind-address           = 127.0.0.1
bind-address            = 10.0.0.100
(Вообще не совсем верный ход, но в данной статье мы не ищем сложных путей)
Осталось только добавить демон в автозагрузку:
создадим файл  /usr/sbin/smsdstart
с таким содержимым:
#!/bin/sh
/usr/sbin/smsd -u smsduser -p smsdpassword -d smsd -c localhost -m mysql -f /var/log/smsdaemon.log
Сделаем файл исполняемым 
chmod +x /usr/sbin/smsdstart
и добавим его в автозапуск
root-> cat /etc/rc.local 
#!/bin/sh -e
# rc.local
#Start SMS daemon script
/usr/sbin/smsdstart
exit 0
Создаем файл лога
touch  /var/log/smsdaemon.log

Перезагружаем систему и убеждаемся что все работает:

root-> ps aux|grep smsd
root       684  0.3  1.9  26412  3676 ?        Sl   Feb01   3:12 /usr/sbin/smsd -u xxxxxxxxx -p xxxxxxxxxxxxx -d xxxxx -c xxxxxxxxx -m mysql -f /var/log/smsdaemon.log
root       918  0.0  0.2   4040   504 pts/2    S+   Feb01   0:00 tail -f /var/log/smsdaemon.log
root      2049  0.0  0.4   4204   772 pts/3    S+   09:41   0:00 grep smsd
root-> ps aux|grep mysql
mysql      583  0.2 10.1 138652 18704 ?        Ssl  Feb01   2:55 /usr/sbin/mysqld
root       684  0.3  1.9  26412  3676 ?        Sl   Feb01   3:12 /usr/sbin/smsd -u xxxxxxxxx -p xxxxxxxxxxxxx -d xxxxx -c xxxxxxxxx -m mysql -f /var/log/smsdaemon.log
root      2051  0.0  0.4   4204   768 pts/3    S+   09:41   0:00 grep mysql

Осталось проверить работоспособность системы. Для того что бы демон отправил смс - необходимо, добавить данные в таблицу outbox:
Синтаксис такой:
insert into outbox (number,text) values ('+380501234567','Super mega demon test');
Пример:
root-> mysql -usmsduser -psmsdpassword
mysql> use smsd;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> insert into outbox (number,text) values ('+380501234567','Super mega demon test');
Query OK, 1 row affected (0.01 sec)

Смотрим отчет в таблице 

mysql> select * from outbox;
+----+---------------+---------------------+---------------------+-----------------------+-------+-----------+-------+---------+------------+-----------+
| id | number        | processed_date      | insertdate          | text                  | phone | processed | error | dreport | not_before | not_after |
+----+---------------+---------------------+---------------------+-----------------------+-------+-----------+-------+---------+------------+-----------+
| 52 | +380501234567 | 2012-02-02 09:54:38 | 2012-02-02 09:54:23 | Super mega demon test |  NULL |         1 |     0 |       0 | 00:00:00   | 23:59:59  |
+----+---------------+---------------------+---------------------+-----------------------+-------+-----------+-------+---------+------------+-----------+
1 row in set (0.00 sec)

root-> tail -f /var/log/smsdaemon.log 
31 січ 2012 21:03:57: Sending to +380501234567 successful.

Все работает! СмС мы получили! Остался последний этап. Необходимо заставить нашу 1С отправлять нам отчеты *(создавать записи в нашей таблице)
Для чего пишем примерно такой вот код 

СоединениеССервером = "Provider=MSDASQL.1; Driver={MySQL ODBC 5.1 Driver}; Server=10.0.0.100; Database=smsd; UID=smsduser; PWD=smsdpassword";
СтрокаВMySQL = "insert into outbox (number,text) values('"+Тел+"','"+ТекстСообщения+"')";
Попытка
Соединение.Execute(СтрокаВMySQL);
ЗаписьЖурналаРегистрации("Отправка СМС",
УровеньЖурналаРегистрации.Информация, , ,
"Сообщение (" + ТекстСообщения + ") отправлено : "+Результат.Пользователь + " на телефон " + Результат.Телефон);
Исключение
ЗаписьЖурналаРегистрации("Отправка СМС",
УровеньЖурналаРегистрации.Ошибка, , ,
"Сообщение не отправлено : "+Результат.Пользователь + " на телефон " + Результат.Телефон + " " + ОписаниеОшибки());
КонецПопытки;

Что конкретно отправлять, какие данные формировать и так далее - каждый разберется уже самостоятельно, так как у каждого свои задачи.
Ну и собственно что бы это все работало с виндауз машинки - необходимо установить ODBC драйвер .

Кроме того можно настроить демон на работу с файлами, добавить выполнение действий на входящие смс и так далее. Возможно я рассмотрю эти пункты в следующих статьях. Отдельная благодарность создателю чудо шнура, моему коллеге  digitec а также оригиналу статьи по настройке gnokii.