Сергей Маликов
15.06.2020
1967

Настройка Kannel

Kannel — это WAP и SMS-шлюз с открытым исходным кодом. Kannel состоит из трех программ, обычно запускаемых как демоны: bearerbox,wapbox и smsbox . Они реализуют подключение к телефону (SMS или UDP), стек протоколов WAP и службы на основе SMS соответственно. SMS сервисы Работает как Pull и Push-шлюз Может обрабатывать 7-битные, 8-битные данные и данные Unicode Отчет о […]

Kannel — это WAP и SMS-шлюз с открытым исходным кодом. Kannel состоит из трех программ, обычно запускаемых как демоны: bearerbox,wapbox и smsbox . Они реализуют подключение к телефону (SMS или UDP), стек протоколов WAP и службы на основе SMS соответственно.

SMS сервисы

  • Работает как Pull и Push-шлюз
  • Может обрабатывать 7-битные, 8-битные данные и данные Unicode
  • Отчет о доставке
  • Возможно использование GMS и GSM модемов как SMS-центра
  • Может подключать различные шлюзы контента на основе HTTP
  • Может работать как агрегатор

WAP сервисы

  • WSP: режимы с установлением соединения и без соединения.
  • WML компилятор из текста в двоичную форму. Поддерживает несколько наборов символов.
  • Компилятор WMLScript: преобразующий исходный код WMLScript в байт-код.
  • WTP: класс 0, 1 и 2. Однако обработка ошибок не очень проверена.
  • WAP push

Kannel требуется следующее программное окружение:

  • Компилятор Си и библиотеки разработки и связанные инструменты
yum groupinstall "Development tools"*
  • Библиотека gnome-xml (libxml), версия 2.2.0 или новее. Рекомендуется использование libxml версии 2.2.5. Если вы устанавливаете его из пакетов своего дистрибутива, вам понадобится libxml2-dev в дополнение к библиотекам пакетов libxml2 во время выполнения.
  • GNU Make.
  • POSIX потоки (pthread.h).
  • GNU Bison 1.28, если вы измените компилятор WMLScript.

Установка Kannel из репозитория epel-release

yum install kannel

Установка исходного кода:

cd /usr/src
wget https://www.kannel.org/download/1.5.0/gateway-1.5.0.tar.gz --no-check-certificate
tar zxvf gateway-1.5.0.tar.gz
cd gateway-1.5.0
./configure  --prefix=/etc/kannel --enable-start-stop-daemon
make
make install
Установка Kannel
mkdir -p /etc/kannel
ln -s /etc/kannel.conf /etc/kannel/kannel.conf

В /etc/rc.conf или в /etc/default/kannel необходимо добавить:

kannel_bearerbox_enable="YES"
kannel_smsbox_enable="YES"
asterisk_enable="YES"

Создаем пользователя, директории для pid файлов, логов, smsc, изменяем права

useradd kannel
mkdir /etc/kannel/smscs ; mkdir /var/log/kannel ; mkdir /var/run/kannel
chown kannel /etc/kannel/smscs ; chown kannel /var/log/kannel ; chown kannel /var/run/kannel

Создаем конфигурационный файл kannel /etc/kannel.conf :

# Конфигурация для Kannel должна всегда включать группу для общей конфигурации

#bearerbox. Эта группа — «core» и должна быть первой группой в файле конфигурации.

#bearerbox – главный демон, прослушивающий порт для подключения остальных #демонов.

group = core
admin-port = 13000
admin-password = " Pa$$w0rd "

# лог файл в дополнение к stdout и любому файлу журнала, опред. в комадной

#строке. Лог-файл в группе ‘core’ используется только bearerbox

log-file = "/var/log/kannel/bearerbox.log"

#уровень логирования (число 0..5)

log-level = 1

#access-log используется для хранения информации о sms-запросах

access-log = "/var/log/kannel/access_kannel.log"
store-file = "/var/log/kannel/kannel_store"

#номер порта, к которому подключаются почтовые ящики, если таковые имеются.

#параметр должен быть установлен, если вы хотите обрабатывать любой SMS-трафик

smsbox-port = 13001

# dir-storage определяет способ хранения DLR(хранение отчета о внешней доставке).

#Поддерживается встроенное хранилище в памяти, которое очень быстрое, но не имеет постоянства. При повторном запуске bearerbox информация DLR будет

#потеряна.

#По умолчанию установлено как внутреннее.

dlr-storage = internal

# Максимальное количество повторных попыток для временно неудачных сообщений. #По умолчанию -1, (не ограничено).

sms-resend-retry = 1

#настройки sms центра

#kannel будет искать сообщения в модеме (в памяти, либо в SIM)

group = smsc
smsc = at

# smsc-id используется для идентификации SMS-центра, из которого пришло сообщение.

smsc-id = huawei0

# Модемы разных производителей ведут себя немного по-разному. Необходимо знать,

#какой тип модема используется. Используйте параметр «auto» или пропустите, чтобы

#Kannel автоматически определял тип модема. (некоторые типы не должны

#распознаваться автоматически).

modemtype = huawei0

# Устройство, к которому подключен модем, например / dev / ttyS0

device=/dev/ttyU0.2 

#sms центр для отправки сообщений.

sms-center="+79991234567"

#номер телефона (необязательно)

my-number="+79991234567"

# kannel будет пинговать модем в течение установленных keepalive секунд.

#Если попытка неуспешна, — попытка подключиться к нему.

# Установите в 0, чтобы отключить эту функцию.

keepalive=5

#конфигурация модема

group=modems
id=huawei0

# Имя  конфигурации модема. Используется в логах

name="huawei0"

#необходимо определить группу ‘smsbox’ в файле конфигурации, чтобы иметь

#возможность использовать SMS Kannel.

group = smsbox

#хост, где находится главный демон bearerbox

bearerbox-host = localhost

# порт, по которому прослушиваются HTTP запросы sendms.

sendsms-port = 13003

#тел. номер отправителя

global-sender = "+79271111111"
log-file = /var/log/kannel/smsbox.log
log-level = 0
access-log = /var/log/kannel/access_smsbox.log

# Конфигурации пользователя SendSMS

#Чтобы включить отправку SMS, вы должны установить sendms-порт в группу #smsbox и определить одну или несколько групп sendms-user.

#Каждая из этих групп определяет одну учетную запись, которую можно использовать

#для отправки SMS через HTTP-интерфейс

group = sendsms-user
username = "user"
password = "Pa$$w0rd"

# Если отправляемое сообщение длиннее максимальной длины SMS, оно будет

#разбито на несколько частей. max-messages позволяет указать максимальное

#количество отдельных SMS-сообщений, которые можно использовать.

#Если для max-messages установлено значение 0, ответ не отправляется, за

#исключением сообщений об ошибках.

max-messages = 20

# сервис default: если входящее сообщение не направлено ни на какой другой сервис, используется группа sms-service default.

#Необходимо всегда определять службу по умолчанию.

group = sms-service
keyword = default

# Запрашиваемый URL.

#URL-адрес может содержать список параметров, которые анализируются до

#получения URL-адреса. Всегда соответствует ключевому слову, независимо от

#соответствия шаблону.

post-url = "http://localhost/service.php?tel=%p&time=%t&coding=%c&smsc=%i"
max-messages = 0
При наличии поднятого файервола также необходимо не забыть открыть указанные использующиеся порты для обращений снаружи.

Подключаем usb модем с установленной сим картой, проверка подключения

ls -la /dev/ | grep ttyUSB
Проверка отображения подключенного usb модема

Создаем init скрипт

touch /etc/init.d/kannel

chmod a+x /etc/init.d/kannel

nano /etc/init.d/kannel

Содержимое init файла

#!/bin/sh
 
BOXPATH=/etc/kannel/sbin
PIDFILES=/var/run/kannel
CONFDIR=/etc/kannel
CONF=$CONFDIR/kannel.conf
 
USER=kannel
VERSION=""
 
RB=$BOXPATH/run_kannel_box$VERSION
BB=$BOXPATH/bearerbox$VERSION
WB=$BOXPATH/wapbox$VERSION
SB=$BOXPATH/smsbox$VERSION
SSD=$BOXPATH/start-stop-daemon$VERSION
 
PATH=$BOXPATH:$PATH
 
case "$1" in
  start)
    echo -n "Starting WAP gateway: bearerbox"
    $SSD --start --quiet --pidfile $PIDFILES/kannel_bearerbox.pid --exec $RB -- --pidfile $PIDFILES/kannel_bearerbox.pid $BB -- $CONF
    echo -n " smsbox"
    $SSD --start --quiet --pidfile $PIDFILES/kannel_smsbox.pid --exec $RB -- --pidfile $PIDFILES/kannel_smsbox.pid $SB -- $CONF
    echo "."
    ;;
 
  stop)
    echo -n "Stopping WAP gateway: "
    echo -n " smsbox"
    $SSD --stop --quiet --pidfile $PIDFILES/kannel_smsbox.pid --exec $RB
    echo -n " bearerbox"
    $SSD --stop --quiet --pidfile $PIDFILES/kannel_bearerbox.pid --exec $RB
    echo "."
    ;;
 
  status)
    CORE_CONF=$(grep -r 'group[[:space:]]*=[[:space:]]*core' $CONFDIR | cut -d: -f1)
    ADMIN_PORT=$(grep '^admin-port' $CORE_CONF | sed "s/.*=[[:space:]]*//")
    ADMIN_PASS=$(grep '^admin-password' $CORE_CONF | sed "s/.*=[[:space:]]*//")
    STATUS_URL="http://127.0.0.1:${ADMIN_PORT}/status?password=${ADMIN_PASS}"
    lynx -source $STATUS_URL
    ;;
 
  reload)
    # We don't have support for this yet.
    exit 1
    ;;
 
  restart|force-reload)
    $0 stop
    sleep 1
    $0 start
    ;;
 
  *)
    echo "Usage: $0 {start|stop|status|reload|restart|force-reload}"
    exit 1
 
esac
 
exit 0

Запускаем kannel

service kannel start
Запуск сервиса kannel

Проверка статуса

curl 'http://127.0.0.1:13000/status.txt?password=Pa$$w0rd'
Проверка статуса kannel

Для реализации простого обмена сообщений между внутренними абонентами (SIP клиентами или SIP телефонами, поддерживающими прием и отправку сообщений) в Астериск необходимо добавить соответствующие параметры.

Во Freepbx в веб-интерфейсе Settings->SIP Settings, в блок Other SIP Settings, в Asterisk Vanilla – в файл sip.conf.

Параметры, необходимые для отправки/получения сообщений

И контекст send-msg, обрабатывающий прием/отправку сообщений, в extensions_custom.conf (в чистом Астериске – в extensions.conf)

[send-msg]
exten => _XXX,1,NoOp(New message sent from ${MESSAGE(from)})
exten => _XXX,n,Set(LOCALTO=${CUT(MESSAGE(to),@,1)})
exten => _XXX,n,MessageSend(${LOCALTO},${MESSAGE(from)})
exten => _XXX,n,NoOp(Send status is ${MESSAGE_SEND_STATUS})
exten => _XXX,n,Hangup()
Обмен локальными сообщениями

Для отправки SMS сообщений на внешние номера в контекст send-msg необходимо добавить в этот конфигурационный файл контекст (send-sms) и включить его в send-msg (в send-msg добавить директиву  include => send-sms )

[send-sms]
exten => _.,1,NoOp(Send SMS to ${MESSAGE(to)} from ${MESSAGE(from)})
same => n,Set(SMSTO=${EXTEN})
;Вызов agi скрипта для отправки sms
same => n,AGI(send_sms.php, ${MESSAGE(from)},${SMSTO},"${MESSAGE(body)}")
same => n,Hangup()

/var/lib/asterisk/agi-bin/send_sms.php:

<?php 
require('phpagi.php');
$agi = new AGI(); //подключаем библиотеку phpagi.php
$stdin = fopen('php://stdin', 'r');
$stdout = fopen('php://stdout', 'w');
function send ($from, $to, $message_text)
{
$message_text=urlencode(iconv("utf-8","ucs-2be",$message_text));
$url = "http://server_name:13003/cgi-bin/sendsms?user=user&pass=Pa$$w0rd&from=$from&coding=2&to=$to&text=$message_text";
file_get_contents($url);    
}

send ($argv[1], $argv[2], $argv[3]);
fclose ($stdin);
fclose ($stdlog);
exit(0);
?>
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Остались вопросы?

Я - Компаниец Никита, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

10 доводов в пользу Asterisk

Распространяется бесплатно.

Asterisk – программное обеспечение с открытым исходным кодом, распространяется по лицензии GPL. Следовательно, установив один раз Asterisk вам не придется дополнительно платить за новых абонентов, подключение новых транков, расширение функционала и прочие лицензии. Это приближает стоимость владения станцией к нулю.

Безопасен в использовании.

Любое программное обеспечение может стать объектом интереса злоумышленников, в том числе телефонная станция. Однако, сам Asterisk, а также операционная система, на которой он работает, дают множество инструментов защиты от любых атак. При грамотной настройке безопасности у злоумышленников нет никаких шансов попасть на станцию.

Надежен в эксплуатации.

Время работы серверов некоторых наших клиентов исчисляется годами. Это значит, что Asterisk работает несколько лет, ему не требуются никакие перезагрузки или принудительные отключения. А еще это говорит о том, что в районе отличная ситуация с электроэнергией, но это уже не заслуга Asterisk.

Гибкий в настройке.

Зачастую возможности Asterisk ограничивает только фантазия пользователя. Ни один конструктор шаблонов не сравнится с Asterisk по гибкости настройки. Это позволяет решать с помощью Asterisk любые бизнес задачи, даже те, в которых выбор в его пользу не кажется изначально очевидным.

Имеет огромный функционал.

Во многом именно Asterisk показал какой должна быть современная телефонная станция. За многие годы развития функциональность Asterisk расширилась, а все основные возможности по-прежнему доступны бесплатно сразу после установки.

Интегрируется с любыми системами.

То, что Asterisk не умеет сам, он позволяет реализовать за счет интеграции. Это могут быть интеграции с коммерческими телефонными станциями, CRM, ERP системами, биллингом, сервисами колл-трекинга, колл-бэка и модулями статистики и аналитики.

Позволяет телефонизировать офис за считанные часы.

В нашей практике были проекты, реализованные за один рабочий день. Это значит, что утром к нам обращался клиент, а уже через несколько часов он пользовался новой IP-АТС. Безусловно, такая скорость редкость, ведь АТС – инструмент зарабатывания денег для многих компаний и спешка во внедрении не уместна. Но в случае острой необходимости Asterisk готов к быстрому старту.

Отличная масштабируемость.

Очень утомительно постоянно возвращаться к одному и тому же вопросу. Такое часто бывает в случае некачественного исполнения работ или выбора заведомо неподходящего бизнес-решения. С Asterisk точно не будет такой проблемы! Телефонная станция, построенная на Asterisk может быть масштабируема до немыслимых размеров. Главное – правильно подобрать оборудование.

Повышает управляемость бизнеса.

Asterisk дает не просто набор полезных функций, он повышает управляемость организации, качества и комфортности управления, а также увеличивает прозрачность бизнеса для руководства. Достичь этого можно, например, за счет автоматизации отчетов, подключения бота в Telegram, санкционированного доступа к станции из любой точки мира.

Снижает расходы на связь.

Связь между внутренними абонентами IP-АТС бесплатна всегда, независимо от их географического расположения. Также к Asterisk можно подключить любых операторов телефонии, в том числе GSM сим-карты и настроить маршрутизацию вызовов по наиболее выгодному тарифу. Всё это позволяет экономить с первых минут пользования станцией.