войти зарегистрироваться

IP-телефония

индекс
102,70

SMS и SIP шлюз — Мультифон, Asterisk, Kannel из песочницы

В данной статье дается описание того, каким образом можно объединить достоинства Asterisk как PBX или IVR, Kannel как SMS-шлюза используя один телефонный номер.

Для этого я использовал Freebsd 8.2 на сервере, модем Huawei E171, но можно использовать любой модем МТС или Мегафон производства huawei (так же было проверено на модеме E1551), сим-карту Мегафона. В качестве софтфонов использовались Telephone и SJphone.

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

Вставляем симку в телефон, скачиваем клиент Мультифона, для бета-версии доступны дистрибутивы для linux и Mac OS X.

Запускаем клиент, регистрируемся, получаем SMS с кодом, вводим код, устанавливаем пароль, убеждаемся, что с клиентом все работает.

Выключаем клиент Мультифона (важно, т.к. нельзя подключить 2 клиента к мультифону одновременно).

Отправляем USSD команду для подключения всех возможностей Мультифона *137#, подтверждаем включение услуги.

Добавляем в /etc/rc.conf:
kannel_bearerbox_enable="YES"
kannel_smsbox_enable="YES"
asterisk_enable="YES"

Установка и настройка Asterisk


cd /usr/ports/net/asterisk
make install clean
service asterisk start

В интернете есть много описаний, поэтому приведу только конфиг, основанный на официальном конфиге мегафона с некоторыми поправками и пояснениями.

Конфигурация Asterisk:
;#/usr/local/etc/asterisk/sip.conf
[general]
tcpenable=yes
allow=all

register => 79271111111@multifon.ru:paSSwoRD:79271111111@193.201.229.35:5060/79271111111

[multifon-out]
dtmfmode=inband
username=79271111111
type=peer
secret=paSSwoRD
host=sbc.megafon.ru
fromuser=79271111111
fromdomain = multifon.ru
port=5060
context=multifon-in
insecure=port,invite
canreinvite=no ;# без этого параметра исходящий звонок на принимающем телефоне сразу прерывается

[100];#софтофоны или другие sip-телефоны настраиваем в соответствии с этими разделами
type=friend
host=dynamic
secret=pass100
context=phones
username=100
nat=rfc3581 ;# без этого параметра не работает связь между софтфонами

[101]
type=friend
host=dynamic
secret=pass101
context=phones
username=101
nat=rfc3581

;#/usr/local/etc/asterisk/extensions.conf

;# Входящие вызовы на этот номер
[multifon-in]
exten=> 79271111111,1,Dial(SIP/100,60,t)
;# Исходящие вызовы, определяется маской
[out]
exten=>_7XXXXXXXXXX,1,Dial(SIP/multifon-out/${EXTEN})
exten=>_8XXXXXXXXXX,1,Dial(SIP/multifon-out/${EXTEN}) ;#позволяет звонить через 8
exten=>_+7XXXXXXXXXX,1,Dial(SIP/multifon-out/${EXTEN}) ;#позволяет звонить через +7
;#exten=>_7XXXXXXXXXX,1,Dial(SIP/${EXTEN}@multifon-out,30,r) ;#мегафоновский вариант
;# Локальные звонки между SIP телефонами
[local]
exten=>_1XX,1,Dial(SIP/${EXTEN},60,rt)
[phones]
include => multifon-in ;#честно говоря, не знаю зачем эта строка здесь у мегафона
include => local
include => out

;#/usr/local/etc/asterisk/rtp.conf
[general]
rtpstart=6001 ;#мегафон утверждает, что их RTP работает от 6001 порта
rtpend=20000

Запускаем консоль:
asterisk -vvvvr

перезагружаем конфигурации с помощью консоли:
reload

Проверяем подключение к мультифону и софтфонам:
sip show registry
sip show peers


Теперь следует включить работу телефона совместно с SIP запросив следующий URL:
https://sm.megafon.ru/sm/client/routing/set?login=79XXXXXXXXX@multifon.ru&password=PASSWORD&routing=2

Проверяем что изнутри и снаружи звонки проходят.

Подготовка модема


Вынимаем симку из телефона, вставляем ее в модем.
Вставляем модем в сервер, проверяем что устройства найдены:
ls /dev | grep cuaU
ls /dev | grep ttyU

Если наших устройств не видно, то пересобираем ядро, добавив
device u3g

Установка и настройка Kannel


Рекомендуется устанавливаеть kannel из SVN, однако я не испытывал проблем и с данной версией, поэтому установим его из портов.
cd /usr/ports/www/kannel
make install clean
service kannel start

Стоит отметить, что Kannel не создает сам пользователя, поэтому сделаем это сами:
adduser

А так же он не заботится о создании директории для PID файлов, сделаем сами:
mkdir /var/run/kannel
chown kannel /var/run/kannel

Конфигурация Kannel:
#/usr/local/etc/kannel.conf

group = core
admin-port = 13000
admin-password = " paSsWoRd "
log-file = "/var/log/kannel/bearerbox.log"
log-level = 1
access-log = "/var/log/kannel/access_kannel.log"
store-file = "/var/log/kannel/store_sms"
smsbox-port = 13001
dlr-storage = internal
sms-resend-retry = 1

group = smsc
smsc = at
smsc-id = huawei0
modemtype = huawei0
device=/dev/ttyU0.2 # либо /dev/ttyU0.3, если он существует
sms-center="+79271111111"
my-number="+79271111111"
keepalive=5

group=modems
id=huawei0
name="huawei0"

group = smsbox
bearerbox-host = localhost
sendsms-port = 13003
global-sender = "+79271111111"
log-file = /var/log/kannel/smsbox.log
log-level = 0
access-log = /var/log/kannel/access_smsbox.log

group = sendsms-user
username = "user"
password = "paSsWoRd"
concatenation = true
max-messages = 20


#Перенаправляем sms на php скрипт
group = sms-service
keyword = default
post-url = "http://localhost/service.php?tel=%p&time=%t&coding=%c&smsc=%i"
concatenation = true
max-messages = 0 #для того чтобы отправлять sms вручную с помощью smssend


Еще раз перезапускаем kannel
service kannel restart

Убеждаемся что подключение к SMSC в статусе online по адресу
localhost:13000/status

Русскоязычные sms приходят и уходят в кодировке ucs-2be, поэтому преобразуем их. Например в PHP:
$text=urlencode(iconv("utf-8","ucs-2be",$text));#

Отправка SMS:
file_get_contents("http://localhost:13003/cgi-bin/sendsms?smsc=$smsc&username=user&password=paSsWoRd&coding=2&to=$to&text=$text");#

coding=2 соответствует опять же кодировке ucs-2be.

Не забываем открыть порты (в том числе порты для RTP, т.к. иначе не будет звука/видео), если включен ipfw, добавляем в скрипт или конфиг:
ipfw add allow tcp from any to ${IpOut} 5060 via ${LanOut} #SIP
ipfw add allow udp from any to ${IpOut} 5060 via ${LanOut} #SIP
ipfw add allow udp from any to ${IpOut} 6000-20000 via ${LanOut} #RTP


Таким образом, мы имеем работающий SMS-шлюз и колл-центр на одном номере. Помимо этого, можно организовать IVR с помощью Asterisk, чтобы получать информацию в цифровом виде не только по SMS, но еще и с помощью интерактивного голосового взаимодействия с конечным пользователем.

Прямое подключения симки к Asterisk описано здесь, но стоит заметить, похоже, при первом подключении модем переходит в режим «только модем» и при повторном подключении исчезают устройства, поэтому передергиваем модем и меняем параметры на
audio=/dev/cuaU0.1      ;# Порт для аудио
data=/dev/cuaU0.2       ;# Порт для команд

Если слишком громко, то меняем параметры на
rxgain=0
txgain=0

Хорошая книга про Asterisk
Отличный официальный мануал для Kannel
Инструкция по подключению от мегафона
Конфиг-файлы от мегафона (с ними у меня были проблемы со звонками наружу)
Конфиг-файлы ядра если не определяется устройство во FreeBSD

комментарии (20)

  • Спасибо, отличная статья. А как насчет встроенных 3G-модемов, например, Gobi 2000?
    • Для подключения мультифона и SIP модем вообще не требуется, а для SMS-гейта, если модем будет виден из ОС, я думаю, можно попробовать kannel с этими настройками, если не получится, то играться с параметром init-string.
  • Не совсем понятно зачем Kannel? chan_datacard уже умеет принимать отправлять смс

    • Верно. Причем даже можно прикрутить ngsms для организации http сервиса (чтобы работать с внешними запросами). Однако на мой взгляд kannel является лучшим опенсорсным решением для SMS-центра и более интуитивным в этом плане. Например я не нашел информации о возможности организовать SMPP клиент и сервер под *, который нужен мне для прямой связи с опсосом. А так же можно использовать kannel независимо, о чем хотел бы рассказать в дальнейших статьях (т.к. kannel вообще не раскрыт на хабре).
    • У chan_datacard пока есть достаточно много проблем с обработкой SMS.
      Как минимум:
      1. Не может читать SMS, которые уже сохранены в буфере модема (они там могут появиться при, к примеру, рестарте астериска)
      2. Часть SMS теряется при приходе сразу же нескольких SMS

      Для себя эту задачу частично решил написанием отдельного perl скрипта (не хотелось связываться с Kannel), лишенного недостатков chan_datacard'а.
      • Использовали Perl модуль Net::SMPP? Можете ли показать свои наработки?
        • Нет.
          SMPP предназначен для общения с SMS-центром оператора через IP, тут же речь про USB GSM модем.
          Т.е. общение с GSM модемом идёт как с обычным модемом через AT команды.

          А с Net::SMPP возился лет 5 назад, совсем не понравился.
          Если надо подключиться — отправить десяток сообщений — отключиться, то да, тут он подходит.
          А вот когда потребовалось постоянно держать SMPP сессию, то тут проблемы и начались.
  • Отличная статья, +1
  • Прикольный пост, kannel очень интересная тема.
    С вашего позволения я разместил вашу прекрасную статью сюда.
  • Скажите пожалуйста, какой у вас версии Kannel, что вы вот так просто смогли его подружить с модемами от Huawei, и E171 в частности?
    • Я использовал далеко не свежую версию 1.4.3 — из портов. Всё как написано в статье. Никаких проблем возникнуть не должно (главное правильно указывать порт. Если отправляется и не принимается, то, возможно, следует проверить другие порты).
      Но на продакшене я (и разработчики kannel со мной солидарны) рекомендую использовать последнюю версию из SVN.
      • *имею в виду версию из портов FreeBSD, а стоит проверить другие COM-порты из /dev/ttyU*. Некоторая путаница вышла.
      • Странно, но мне так и не удалось подружить E171 с kannel 1.4.3.
        В конце концов был куплен универсальный Flyer U2, взлетевший из коробки.
        • Возможно проблема совместимости с прошивкой или конкретным провайдером (например, говорят, Билайн не анлочится). Либо если вы использовали linux, то я не в курсе работает ли там данная связка, т.к. хоть системы и схожи, однако драйвера отличаются.
          Я использовал самые свежие E171 от МТС коннект.
          • Да, я настраивал на Debian GNU/Linux, возможно проблема именно в драйверах.
            Спасибо за пояснения.
  • А отправлять SMS через аккаунт Мультифона без модема, интересно, никак нельзя?
    • Присоединюсь к вопросу. Можно прикрутить к этому: szf.megafon.ru/corporate/mobile/kompleksnye_resheniya_dlya_biznesa/korporativnye_sms-servisy/konnekt/
      • Здесь имеется в виду подключение по SMPP. Для этого можете использовать kannel. Я собираюсь написать статью на тему прямого подключения к опсосу для отправки/приема sms.
    • Во-первых, можно через программу мультифон. Во-вторых, согласно ВиО на офсайте:
      sbc.megafon.ru — 5060 TCP+UDP (SIP) — для установки голосовых соединений, обмена статусами присутствия и текстовыми сообщениями;
      Поэтому, скорее всего, это реально, т.к. мультифон клиент это использует, однако в таком случае я не вижу средства интеграции с kannel. И я погуглил на тему asterisk sms over sip, не нашел при беглом осмотре полезной информации на эту тему. Буду рад если кто-то найдет решение.
    • Можно через YATE (http://yate.null.ro), инструкция: github.com/vir/yate/wiki/Multifon-sms
Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.