Авторы: Виктор Гижевский
www.unixman.ru,
Александр Симаков
В настоящее время рынок SMS и мультимедийного контента растет быстрыми
темпами. Для построения контент-провайдерского сервера предлагается
большое количество коммерческих решений. Но для построения данной
*платфомы* можно воспользоваться и открытыми решениями. Мы рассмотрим
пример построения сервера на базе WAP- и SMS-шлюза Kannel (
www.kannel.org) .
Самым распространенным протоколом для связи с СМС-центром на
сегодняшний день является протокол SMPP 3.4 (Short messages
point-to-point). Мы предполагаем, что вы уже получили сервисный номер и
SMPP-подключение у одного из операторов GSM или CDMA стандарта. В
принципе, Kannel поддерживает и работу с рядом GSM-модемов для связи с
GSM-сетью, но данная возможность не будет рассмотрена в данной статье.
Необходимые исходные данные:
С оператором обязательно согласовываем использование протокола SMPP
версии 3.4 (не 4.0). У провайдера сотовой связи должны быть получены
сервисный номер (не обязательно короткий, может быть и федеральный),
IP-адрес и порт СМС-центра, login и password, кодировка передаваемых
оператором в Ваш адрес сообщений, кодировка принимаемых оператором
сообщений, параметры source address ton, source address npi, destination
address ton, destination address npi.
Если у оператора СМСЦ российского производителя, то он может
поддерживать кодировку KOI8-R или CP1251. Это упростит Вашу задачу. Мы
же рассмотрим более универсальный вариант, когда используется кодировка
UCS-2 Big Endian, являющаяся стандартом в том числе и для кириллических
шрифтов в Восточной Европе при отправке СМС-сообщений. Данную кодировку
СМСЦ Вашего оператора наверняка поддерживает. Также Вам необходимо
узнать у оператора, поддерживает ли его СМСЦ "склейку" и какое
количество СМС позволяется "склеивать", разрешит или нет оператор Вам
подписываться каким-либо именем сервиса (как правило, оператор заменяет
Вашу подпись на свой вариант, все зависит от Ваших отношений с оператором).
Русифицируем консоль согласно
http://dreamcatcher.ru/docs/openbsd_rus.html.
Перед непосредственной установкой Kannel нам неоходимо выкачать и
сложить в рабочую папку (например, /tmp) следующие пакеты:
bash-3.0.16p1, gmake-3.80p1, libiconv-1.9.2p1, p5-HTML-Parser-3.45,
p5-MD5-1.7, gettext-0.10.40p3, libxml-2.6.16p5, p5-Compress-Zlib-1.35,
p5-HTML-Tagset-3.04, p5-URI-1.35, glib2-2.6.4, libghttp-1.0.9p0,
p5-Crypt-SSLeay-0.51, p5-HTTP-GHTTP-1.07, p5-libwww-5.803. Напоминаю,
что сборка из портов в OpenBSD не приветствуется из соображений
безопасности. Начинаем установку пакетов.
# cd /tmp
# pkg_add libiconv-1.9.2p1.tgz
# pkg_add gettext-0.10.40p3.tgz
# pkg_add glib2-2.6.4.tgz
# pkg_add libxml-2.6.16p5.tgz
# pkg_add bash-3.0.16p1.tgz
# pkg_add p5-libwww-5.803
Переходим непосредственно к установке Kannel. Выкачиваем с сайта
www.kannel.org стабильную версию kannel. Мы не рекомендуем использовать
девелоперскую версию, поскольку на момент написании статьи в
девелоперскую версию были добавлены дополнительные проверки, которые
привели к невозможности работы с кириллицей. Чтобы сделать девелоперскую
версию рабочей, нам пришлось исключить из исходного кода kannel часть
кода. В стабильной версии данные изменения вводить не требуется.
# wget -c http://www.kannel.org/download/1.4.0/gateway-1.4.0.tar.gz
# tar -zxvf gateway-1.4.0.tar.gz
# cd gateway-1.4.0.tar.gz
# ./configure --disable-ssl
# /usr/local/bin/gmake
# /usr/local/bin/gmake install
Добавляем группу _kannel и пользователя _kannel
# groupadd _kannel
# useradd -s /sbin/nologin -d /dev/null -g _kannel _kannel
Создаем вспомогательный скрипт /usr/local/sbin/killall:
#!/bin/sh
ps -aux | grep $1 | grep -v grep | grep -v killall | awk '{print$2}' |
xargs kill -9
Создаем старт-стоповый скрипт /usr/local/sbin/kannelctl следующего
содержания:
#!/bin/sh
# Configuration file
CONF=/etc/kannel/kannel.conf
# Kannel boxes
BEARERBOX=/usr/local/sbin/bearerbox
SMSBOX=/usr/local/sbin/smsbox
WAPBOX=/usr/local/sbin/wapbox
# Debug level: 0..4
DEBUGLEVEL=0
# Kannel user account
USER=_kannel
# Check that boxes and config are ok
[ -x $BEARERBOX ] || exit 0
[ -x $SMSBOX ] || exit 0
[ -f $CONF ] || exit 0
case "$1" in
start)
echo -n "Starting bearerbox... "
$BEARERBOX -v $DEBUGLEVEL --daemonize --user $USER $CONF &
echo "done"
echo -n
sleep 3
echo -n "Starting smsbox... "
$SMSBOX -v $DEBUGLEVEL --daemonize --user $USER $CONF &
echo "done"
;;
stop)
echo -n "Shutting down smsbox... "
/usr/local/sbin/killall smsbox
echo "done"
sleep 3
echo -n "Shutting down bearerbox... "
/usr/local/sbin/killall bearerbox
echo "done"
;;
restart)
$0 stop
sleep 3
$0 start
;;
*)
echo "Usage: kannelctl {start|stop|restart}"
exit 1
esac
exit 0
Не забываем установить права на запуск скриптов. Создаем каталоги для
лог-файлов и конфигурационного файла и приступаем к редактированию конфига.
# mkdir /var/log/kannel
# chown _kannel /var/log/kannel
# mkdir /etc/kannel
# cp /tmp/gateway/doc/examples/kannel.conf /etc/kannel
Редактируем файл и приводим его к следующему виду:
group = core
admin-port = 13000
admin-password = bar
admin-deny-ip = "*.*.*.*"
admin-allow-ip = "127.0.0.1"
#IP для администрирования
smsbox-port = 13012
wdp-interface-name = "*"
log-file = "/var/log/kannel/bearerbox.log"
box-deny-ip = "*.*.*.*"
box-allow-ip = "127.0.0.1"
#IP, с которых разрешена отправка СМС
group = smsc
smsc = smpp
host = 111.222.333.444
#IP СМСЦ провайдера
*port = 2001
#порт отправки СМСЦ провайдера
receive-port = 2001
#порт получения СМСЦ провайдера, может быть тем же,
что и port*
smsc-username = "smsc_username"
#выданный провайдером login
smsc-password = smsc_password
#выданный провайдером пароль
system-type = "KANNEL"
#любое имя
address-range = ""
source-addr-ton = 0
#параметр выдан провайдером
source-addr-npi = 1
#параметр выдан провайдером
dest-addr-ton = 1
#параметр выдан провайдером
dest-addr-npi = 1
#параметр выдан провайдером
group = smsbox
bearerbox-host = localhost
#Ваш IP для отправки СМС (IP Вашего сервера,
на котором будет слушать Kannel)
sendsms-port = 13013
#Порт на котором слушает Kannel
sendsms-chars = "0123456789+"
#Допустимые символы в номере абонента
access-log = "/var/log/kannel/sms-access.log"
log-file = "/var/log/kannel/smsbox.log"
log-level = 0
group = sendsms-user
username = your_user
#используя этот логин можно отправлять СМС с
помощью http-запроса
password = your_password
#используя этот пароль можно отправлять СМС с
помощью http-запроса
# TEST
group = sms-service
keyword = default
text = "INCORRECT REQUEST"
concatenation = true
#разрешена или нет склейка
max-messages = 3
#максимальное количество склеиваемых СМС
# HELLO WORLD
group = sms-service
keyword = 123
text = "HELLO WORLD"
#здесь может быть только латиница
concatenation = true
#разрешена или нет склейка
max-messages = 3
#максимальное количество склеиваемых СМС
# HELLO WORLD XML-CGI
group = sms-service
keyword = service
get-url =
"http://localhost:80/cgi-bin/service.pl?otkogo=%p&keyword=%a&komu=%P&time=%t"
# HELLO WORLD XML-HTML
group = sms-service
keyword = 234
get-url = "http://localhost:80/test.html"
Добавляем в /etc/rc.local следующие строки:
# Kannel SMS gateway
if [ -f /etc/kannel/kannel.conf ]; then
/usr/local/sbin/kannelctl start
fi
Для отправки кириллических СМС из командной строки нам потребуется
небольшая утилитка, откомпилированную версию для OpenBSD 3.8 которой
можно взять
http://unixman.ru/bin2hex .
Ниже приведен исходный текст на
С. Откомпилированную версию программы кладем в /usr/local/bin . Не
забываем про права на исполнение.
#include
int main()
{
int ch;
while ((ch = getchar()) != EOF) {
if (ch == '\n')
continue;
else
printf("%%%02X", ch);
}
}
Теперь перейдем непосредственно к программе для отправки СМС из
командной строки. Создаем файл sendsms.pl в каталоге /usr/local/sbin
следующего содержания:
#!/usr/bin/perl -w
use warnings;
use strict;
use HTTP::Request;
use HTTP::Response;
use LWP;
sub send_sms {
my ($from, $to, $text) = @_;
$text =~ s/\"/\'/g;
my $url =
'http://127.0.0.1:13013/cgi-bin/sendsms?username=your_user&password=your_password \
&validity=1440&coding=2&to=%2B_TO_&from=_FROM_&text=_TEXT_';
#Параметр "validity" - срок жизни СМС в минутах. В течении этого времени
СМСЦ будет делать попытки доставки абоненту.
$text = `echo "$text" | iconv -f koi8-r -t ucs-2be |
/usr/local/bin/bin2hex`;
$url =~ s/_FROM_/$from/;
$url =~ s/_TO_/$to/;
$url =~ s/_TEXT_/$text/;
my $ua = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => $url);
my $response = $ua->request($request);
}
Main();
sub Main {
if (@ARGV != 2) {
print "Usage: MSISDN TEXT\n";
exit(1);
}
send_sms("Provider", $ARGV[0], $ARGV[1]);
}
Запускаем Kannel командой:
# /usr/local/sbin/kannelctl start
Можем проверить связь с СМСЦ
# tail -f /var/log/kannel/bearerbox.log
# ^C
Логинимся в систему от пользователя с кириллической консолью и
отправляем СМС командой:
bash-3.0# cd /usr/local/sbin
bash-3.0# ./sendsms.pl 79XXXXXXXXX "Проверка отправки кириллицы"
Если все сделано верно, Вам придет на указанный номер СМС-сообщение.
Отправляем с мобильного телефона на Ваш сервисный номер СМС-сообщение с
текстом "123" - Вам в ответ должно прийти "HELLO WORLD".
Попробуем отправить СМС с произвольным текстом.
Следующим этапом для интерактивной обработки СМС-запросов абонентов нам
потребуется установленный http-сервер с cgi-bin или php, например
apache, установку и настройку www-сервера в этой статье мы рассматривать
не будем. Отметим лишь, что последние версии апача распространяются под
неприемлимой для OpenBSD лицензией, а в комплекте OpenBSD присутствуют и
другие весьма достойные серверы. Штатный уже установленный апач в
комплекте OpenBSD запускается в чруте. Для работы cgi-bin потребуется
копирование всех необходимых апачу библиотек в чрут, но временно для
тестов апач можно запустить не в чруте командой httpd -u . В целях
безопасности настраиваем pf Даниэля Хартмайера - разрешаем доступ на
порты kannel и http-сервера только с необходимых нам IP.
Принцип взаимодействия в случае нашего конфигурационного файла следующий
- kannel при получении СМС-сообщения с ключевым словом "service"
формирует http-запрос на указанный в конфиге URL
http://localhost:80/cgi-bin/service.pl?otkogo=%p&keyword=%a&komu=%P&time=%t.
В ответ httpd при обработке скрипта выдает xml-код (ВНИМАНИЕ!) в
кодировке UTF-8. В этом случае будет сформировано кириллическое сообщение.
В данном случае скрипту будут переданы параметры otkogo=(MSISDN
абонента), keyword=service, komu=(Ваш сервисный номер), time=(время
запроса).
Для примера ответного XML-сообщения Вы можете создать файл
http://localhost:80/test.html в кодировке UTF-8 следующего содержания:
ВАШ ТЕКСТ
2
А, например, данный код
Если слышна мелодия поддерживается EMS
820C8000424547494E3A494D454C4F44590D0A56455253494F4E3A312E300D0A464F524 \
D41543A434C415353312E300D0A4D454C4F44593A2A336633663366332363312364332364332 \
364336331723366336633663323633323663323663323663366332A \
342363332363332363332A332361310D0A454E443A494D454C4F44590D0A
2
TEST
сформирует EMS-сообщение и телефон проиграет мелодию (на телефонах,
поддерживающих EMS. Забавно, но Nokia до сих пор игнорирует этот
стандарт). Информацию о кодировании udh-заголовков и другие справочные
материалы по sms можно найти на сайте http://www.isms.ru .
Данный xml-код может быть находиться не только в статическом файле, но
также и может быть сформирован динамическим интерактивным
cgi-приложением или результатом работы php-скрипта.
Kannel обладает большими возможностями. Не забывайте, есть документация
на Kannel. Это, конечно, далеко не лучшая документация из всех нами
виденных, но, думаем, данная статья поможет Вам на начальном этапе с ней
разобраться.
Использованная литература
:
- Документация OpenBSD 3.8 http://www.openbsd.org/faq/index.html
- Документация Kannel
http://www.kannel.org/download/1.4.0/userguide-1.4.0/userguide.html
- Udh код для мелодии взят с сайта www.isms.ru
http://www.isms.ru/article.shtml?art_9_2