понедельник, 23 мая 2011 г.

Отправляем SMS при помощи kannel на базе CentOS 5.5 - Настройка.

Во второй части статьи мы кратко рассмотрели процесс установки kannel. Теперь начинается самое интересное - настройка.
Перед началом процесса настройки настоятельно рекомендую почитать официальную документацию на стабильный релиз. Без этого будет тяжеловато понимать логику работы программы.
Итак.
Kannel состоит из трех частей, которые разработчики называют boxes – bearerbox, smsbox и wapbox. Bearerbox – главный модуль, принимающий SMS-сообщения с мобильного телефона и пересылающий их в wapbox и smsbox. Поддерживается множество WAP- и SMS boxes. Wapbox в нашем случае нас не интересует (мы не собираемся предоставлять мобильный контент корпоративным пользователям), поэтому настройку wapbox в рамках этой статьи мы рассматривать не будем.
Вся настройка может храниться в одном файле - kannel.conf. После установки kannel из исходников (а почему мы сделали именно это, а не поставили его из готовых пакетов, коих в сети предостаточно, в том числе и в базовой конфигурации CentOS, я расскажу чуть позже) конфигурационный файл по умолчанию не создаётся, мы вольны расположить его где угодно. Я для этого использую папку /etc/kannel. Сам файл может быть как один, так и содержать в себе ссылки на файлы конфигурации отдельных boxes - если ваша конфигурация в результате разрастётся до неприличных размеров. Наша задача не такая большая, поэтому мы будем использовать один файл.
Первая секция - настройка самого bearerbox. Как уже говорилось - это основной модуль программы. Выглядит секция приблизительно так:
#Файл основной конфигурации kannel
#Секция bearerbox
#Описывает основные свойства и общую настройку kannel
#
#Обязательный параметр. Группа core присутствует ВСЕГДА
group = core
#Обязательный параметр. Номер порта, на котором находится
#административный интерфейс kannel. Через этот интерфейс мы
#можем управлять нашими боксами
admin-port = 13000
#Обязательный параметр. Без него административный
#http-интерфейс не работает.
admin-password = T[fkUhtrfXthtpHtre
#Номер порта, на котором слушается smsbox. Можно использовать другой номер.
smsbox-port = 13001
#Где лежат логи bearerbox и степень их детализации:
#0 - отладка (debug)
#1 - информация (info)
#2 - предупреждения (warning)
#3 - ошибки (error)
#4 - panic
log-file = /var/log/kannel/bearerbox.log
log-level = 0
access-log = /var/log/kannel/access.log
#Тип хранилища подтверждений о доставке сообщений на телефон абонента.
#При использовании в качестве SMS-центра модема доставка таких
#подтверждений не работает, поэтому можно не писать. :-) (DeLivery Report) 
dlr-storage = internal
#Тип хранилища сообщений. Может быть либо spool - тогда все сообщения
#хранятся в отдельном каталоге и для каждого из них создаётся отдельный
#файл, либо file - тогда все сообщения валятся в один файл. Сделано это
#для того, чтобы при падении kannel сообщения не пропали.
store-type = spool
store-location = /var/spool/kannel/
Вторая секция - настройка smsbox. Это тот модуль, который слушает определённый http-порт и при наличии на этом порту GET- или POST- (или какого либо ещё) запроса на отправку сообщения передаёт его соответствующему SMS-центру и рапортует при помощи http-response о выполении этой задачи.
#Секция smsbox
#Описывает настройку модуля smsbox
#
#Обязательный параметр. Говорит о типе бокса
group = smsbox
#Где находится основной модуль kannel. Из этого параметра следует,
#что в больших инсталляциях bearerbox может располагаться
#на другом сервере.
bearerbox-host = localhost
#Название нашего бокса. Будет отображаться в логах, служит
#идентификатором бокса, т.к. smsbox может быть несколько.
smsbox-id = My-smsbox
#Где лежат логи smsbox и степень их детализации:
#0 - отладка (debug)
#1 - информация (info)
#2 - предупреждения (warning)
#3 - ошибки (error)
#4 - panic
log-file = /var/log/kannel/smsbox.log
log-level = 0
#Порт, на котором слушаются запросы. Можно ставить свой номер.
sendsms-port = 13013
Третья секция - настройки SMS-центра. SMS-центр определяет, связь какого типа будет использоваться для передачи SMS. Это может быть и протокол SMPP, и SMS-центр Nokia CIMD версии 1.37 или 2.0, и различные http-релеи, пересылающие запросы соответствующим smsbox. Специально для нашего случая разработана секция, в которой в качестве оборудования используется GSM-модем или терминал. Её настройки мы и опишем.

#Секция smsc
#Описывает настройку модуля smsc
#
#Обязательный параметр. Говорит о типе бокса
group = smsc
#Тип используемого SMS-центра. Для модема - обязательно at.
smsc = at
#Название нашего SMS-центра. Будет отображаться в логах, служит
#идентификатором SMS-центра, т.к. их может быть несколько (например,
#три разных модема на трёх COM-портах)
smsc-id = APPM-smsc
#Тип используемого модема. Некоторые известные типы модемов отражены в
#документации, которая лежит по адресу /usr/src/gateway-1.4.3/doc/examples
#Если тип модема там не представлен, можно смело ставить auto.
modemtype = auto
#Порт, на котором живёт наш модем. В данном случае - COM1
device = /dev/ttyS0
#Список адресов, с которых разрешён доступ к нашему SMS-центру.
connect-allow-ip = 127.0.0.1
#Скорость последовательного порта
speed = 115200
#Хранить входящие сообщения в памяти sim-карты
sim-buffering = true
#Номер телефона SMS-центра оператора. Может быть прошит в вашей sim-карте,
#а может жёстко задаваться тут. Я выбрал второй путь - он прописывается
#в терминал перед отправкой каждого сообщения. Номер задаётся в
#международном формате.
sms-center = +79219909090
Четвёртая секция - описание собственно модема и правил работы с ним.

#Секция modems
#Описывает настройку GSM-терминала.
#
#Обязательный параметр. Говорит о типе бокса
group = modems
#Идентификатор и имя устройства
id = SIEMENS MC35i
name = "Siemens_MC35i"
#Если в выводе команды ATI содержатся эти две строки, то использовать
#описание и параметры этого модема
detect-string = "SIEMENS"
detect-string2 = "MC35i"
#Строка инициализации модема. Почти все грабли, которые можно собрать
#на этапе первоначальной настройки, связаны с неправильной строкой
#инициализации
init-string = "AT+CNMI=1,2,0,1,1"
#Использовать аппаратную синхронизацию потока
enable-hwhs = "AT\\Q3"
#При длительном неиспользовании модем может уснуть. Чтобы этого
#не случилось, говорят
need-sleep = true
#тип хранилища входящих сообщений.
message-storage = SM
Пятая секция - описание раздела авторизации пользователей при отправке SMS-сообщений. Если поля username и password в этой секции пусты, то отправить может любой. Если в этой секции присутствует поле default-sender, то в формируемом GET-запросе не надо будет указывать поле from=. (О структуре GET-запроса смотри ниже)

group = sendsms-user
username = ""
password = ""
default-sender = +79314114119
Шестая секция - описание http-интерфейса, предоставляющего доступ ко входящим сообщениям. Как я уже упоминал выше, нам это неактуально, поэтому в этой секции всё будет просто:

group = sms-service
keyword = default
text = "No service specified"
catch-all = true
Таким образом, в собранном воедино виде наш конфигурационный файл будет выглядеть следующим образом:
#kannel configuration file
group = core
admin-port = 13000
admin-password = T[fkUhtrfXthtpHtre
smsbox-port = 13001
log-file = /var/log/kannel/bearerbox.log
log-level = 0
access-log = /var/log/kannel/access.log
dlr-storage = internal
store-type = spool
store-location = /var/spool/kannel/

group = smsbox
bearerbox-host = localhost
smsbox-id = APPM-smsbox
log-file = /var/log/kannel/smsbox.log
log-level = 0
sendsms-port = 13013

group = smsc
smsc = at
smsc-id = APPM-smsc
#log-file = /var/log/kannel/smsc_at.log
#log-level = 0
modemtype = auto
device = /dev/ttyS0
connect-allow-ip = 127.0.0.1
speed = 115200
sim-buffering = true
sms-center = +79219909090

group = smsbox-route
smsbox-id = APPM-smsbox
smsc-id = APPM-smsc

group = modems
id = SIEMENS MC35i
name = "Siemens_MC35i"
detect-string = "SIEMENS"
detect-string2 = "MC35i"
init-string = "AT+CNMI=1,2,0,1,1"
enable-hwhs = "AT\\Q3"
need-sleep = true
message-storage = SM

group = sendsms-user
username = ""
password = ""
default-sender = +79314114119

group = sms-service
keyword = default
text = "No service specified"
catch-all = true
Всё готово к тому, чтобы стартовать kannel с тем, что мы натворили. На этапе отладки делать это лучше из двух разных окошек ssh-консоли (либо с двух разных локальных консолей). В первой консоли набираем:

bearerbox /etc/kannel/kannel.conf
и видим примерно такую картину:
Во втором окне выполняем запуск smsbox:

smsbox /etc/kannel/kannel.conf
Выглядит это так:

Теперь можно открыть третье окошко ssh-консоли (или третий локальный терминал, Alt+F3) и посмотреть, работает ли web-сервер, который поднимается из-под bearerbox:
Ок, всё работает!
Теперь попробуем отослать SMS.
Здесь мне придётся сделать некоторое лирическое отступление.
Как я ни пытался, но мне так и не удалось отправить SMS на номер, сформированный по правилам, привычным мне с момента начала пользования мобильным телефоном - +7МММХХХХХХХ. Что с плюсом впереди, что без плюса - в результате формировалась PDU, у которой в типе номера телефона в поле DA всегда стояло 81h. А наш любимый оператор Мегафон такие SMS не принимает, считая, что номер указан не в международном формате. После трёх дней экспериментов и плотного общения с инженерами Мегафон и разработчиками kannel на канале users@kannel.org было обнаружено, что SMS уходят без проблем в двух случаях: если вместо "+" в номере получателя ставится регулярное выражение %2B или номер телефона получателя пишется в ПОЛНОМ международном формате - +007МММХХХХХХХ. Теоретически для определения префиксов кодов стран в конфигурационном файле kannel служит специальная переменная, unified-prefix. Но разобраться с форматом этой переменной для России я так и не смог - куда и как бы я её не подставлял, номер телефона получателя всё равно ставился с 81h в поле DA.
Итак, для отправки SMS с помощью GET-запроса вводим в адресную строку вашего любимого браузера следующую строку:

http://smsgate.appm.local:13013/cgi-bin/sendsms?username=&password=&to=+007MMMXXXXXX&text=Test from Kannel
Если у нас всё правильно настроено, то в двух окнах, в которых запущены процессы bearerbox и smsbox вы увидите процесс отправки SMS, а само сообщение прилетит к вам на телефон.
Поздравляю, теперь любой ваш мониторинг сможет оповещать вас посредством отправки SMS-сообщения на ваш телефон!

У нас осталась последняя часть рассказа - как всё, что мы сейчас сделали, прикрутить к мониторингу от Paessler (который PRTG Network Monitor)

4 комментария:

  1. Здравствуй ... хорошо написано ... но у меня так и не получилось соединиться с контент провайдером смс ... помоги разобраться

    ОтветитьУдалить
    Ответы
    1. 1. service kannel stop
      2. bearerbox /etc/kannel/kannel.conf
      3. smsbox /etc/kannel/kannel.conf
      Kannel conf
      # Default kannel configuration file
      group = core
      admin-port = 13000
      admin-password = ""
      status-password = ""
      admin-deny-ip = "*.*.*.*"
      admin-allow-ip = "127.0.0.1"
      smsbox-port = 13001
      #wapbox-port = 13002
      box-deny-ip = "*.*.*.*"
      box-allow-ip = "127.0.0.1"
      wdp-interface-name = "*"
      log-file = "/var/log/kannel/bearerbox.log"
      log-level = 0


      group = sendsms-user
      username = ""
      password = ""
      default-sender = +7 (my number)
      concatenation = true
      max-messages = 20

      group = smsc
      smsc = at
      modemtype = auto
      device = /dev/ttyUSB0
      connect-allow-ip = "127.0.0.1"
      speed = 115200
      host="localhost"
      sim-buffering = true
      sms-center = +79126313431 (sms centr mts)

      group = modems
      id = huawei_e1550
      name = "Huawei E1550"
      detect-string = "huawei"
      init-string = "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
      message-storage = SM

      group = smsbox
      bearerbox-host = "127.0.0.1"
      log-file= "/var/log/kannel/smsbox.log"
      log-level = 1
      sendsms-port = 13003
      4. отправка смс через строку
      http://127.0.0.1:13003/cgi-bin/sendsms?user=&password=&to=+7(телефон)&text=Kannel_SMS_Server_yra

      Удалить
  2. на русском

    http://192.1*,,,:13003/cgi-bin/sendsms?user=&password=&to=+792,,*&text=+текст+&coding=2&charset=UTF-8')

    ОтветитьУдалить