Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
otpravka_opoveschenij_po_jabber_iz_asterisk [2013/11/18 16:33]
ansealk
otpravka_opoveschenij_po_jabber_iz_asterisk [2013/11/18 16:46] (текущий)
Строка 1: Строка 1:
 +====== Отправка оповещений по jabber из asterisk о пропущенных звонках ======
  
 +Настройка самого джаббера очень проста. Нам потребуется создать аккаунт на сервере:​
 +  * login: asterisk
 +  * pass: secret
 +И прописать данные о нем и сервере в конфиге ​
 +<file ini jabber.conf>​
 +[general]
 +;​debug=yes ​                             ;;Turn on debugging by default.
 +;​autoprune=yes ​                         ;;Auto remove users from buddy list.
 +;​autoregister=yes ​                      ;;​Auto register users from buddy list.
 +
 +[asterisk] ​                             ;;label
 +type=client ​                            ;;​Client or Component connection
 +serverhost=jabber.company.ru ​                    ;;​Route to server for example,
 +                                        ;;      talk.google.com
 +username=asterisk@jabber.company.ru/​office ​       ;;Username with optional roster.
 +secret=secret ​                          ;;​Password
 +port=5222 ​                              ;;​Port to use defaults to 5222
 +usetls=no ​                              ;;Use tls or not
 +usesasl=no ​                             ;;Use sasl or not
 +;​buddy=mogorman@astjab.org ​             ;;Manual addition of buddy to list.
 +;​statusmessage="​I am available" ​        ;;​Have custom status message for
 +                                        ;;Asterisk.
 +;​timeout=100 ​                           ;;Timeout on the message stack.
 +</​file>​
 +После этого надо обновить конфиги перезапуском asterisk, либо набором в консоли jabber reload. ​
 +
 +На этом настройка джаббера закончена и пришла пора переходить к экстеншам. Описание отправки сообщений в extensions.conf выглядит примерно следующим образом:​
 +<code lua>
 +exten => busy,n, jabbersend(asterisk|${called_jid}|Пропущенный звонок от ${caller_num} (${caller_name}) по причине:​ АБОНЕНТ ЗАНЯТ ${called_num} (${called_name}).)
 +</​code>​
 +
 +Для корректного отображения кириллицы,​ нужно использовать кодировку UTF8.
 +
 +Теперь я расскажу,​ откуда собственно астериск узнает Jabber-ы пользователей. Первой моей идеей было использование callerid, чтобы адрес собирался таким образом:​ ${CALLERID}@jabber.company.ru . Однако бывают ситуации,​ когда на одном телефоне может быть несколько пользователей с разными jabber-ами и таком случае данная схема неприменима. В итоге я пришел к созданию MySQL БД с информацией о пользователях. Структура ее получилась такая:
 +<code sql>
 +--
 +-- Структура таблицы `abonents`
 +--
 +
 +CREATE TABLE IF NOT EXISTS `abonents` (
 +  `num` int(11) NOT NULL,
 +  `name` text NOT NULL,
 +  `name_trans` text NOT NULL,
 +  `jid1` text NOT NULL,
 +  `jid2` text NOT NULL,
 +  `jid3` text NOT NULL,
 +  `cellphone` text NOT NULL
 +) ENGINE=MyISAM DEFAULT CHARSET=utf8;​
 +</​code>​
 +
 +Опять же, все записи ОБЯЗАТЕЛЬНО В UTF8.
 +
 +Здесь:
 +  * num — внутренний номер пользователя (100)
 +  * name — полное имя на русском языке (Иванова Вика)
 +  * name_trans — фамилия в транслите (Ivanova)
 +  * jid1, jid2, jid3 — jid-ы пользователей данного телефона (ivanova@jabber.company.ru , petrova@jabber.company.ru …)
 +
 +После внесения информации о всех абонентах можно делать само оповещение. Для начала нам нужно получить в переменные номера вызываемого и звонящего абонентов:​
 +<code lua>
 +;здесь нужно описать получение в перменную номера звонящего
 +exten => 1XX,​n(busy),​ Set(caller_num=${CALLERID})
 +;а здесь - номера вызываемого абонента
 +exten => 1XX,n, Set(called_num=${EXTEN})
 +</​code>​
 +
 +Далее нужно получить информацию о пользователях из MySQL следующими запросами:​
 +<code lua>
 +exten => 1XX,​n(mysqlget_start),​ NoOp
 +exten => 1XX,n, MYSQL(Connect connid 10.1.1.1 asteriskuser asteriskpassword asteriskdb)
 +exten => 1XX,n, MYSQL(Query resultid ${connid} SELECT\ name\,​jid1\,​jid2\,​jid3\ from\ abonents\ where\ num=${caller_num})
 +exten => 1XX,n, MYSQL(Fetch fetchid ${resultid} caller_name caller_jid1 caller_jid2 caller_jid3)
 +exten => 1XX,n, MYSQL(Clear ${resultid})
 +exten => 1XX,n, MYSQL(Query resultid ${connid} SELECT\ name\,​jid1\,​jid2\,​jid3\ from\ abonents\ where\ num=${called_num})
 +exten => 1XX,n, MYSQL(Fetch fetchid ${resultid} called_name called_jid1 called_jid2 called_jid3)
 +exten => 1XX,n, MYSQL(Clear ${resultid})
 +exten => 1XX,n, MYSQL(Disconnect ${connid})
 +exten => 1XX,​n(mysqlget_end),​ NoOp
 +</​code>​
 +
 +Теперь у нас есть вся необходимая информация. Остается только отправить само сообщение:​
 +<code lua>
 +exten => busy,​n(jabbersend_start),​ NoOp
 +exten => 1XX,​n(jid1send),​ GoToIf($["​${called_jid1}"​!=""​]?:​jid2send)
 +exten => 1XX,n, jabbersend(asterisk|${called_jid1}|Пропущенный звонок от ${caller_num} (${caller_name}) по причине:​ АБОНЕНТ ЗАНЯТ ${called_num} (${called_name}).)
 +exten => 1XX,​n(jid2send),​ GoToIf($["​${called_jid2}"​!=""​]?:​jid3send)
 +exten => 1XX,n, jabbersend(asterisk|${called_jid2}|Пропущенный звонок от ${caller_num} (${caller_name}) по причине:​ АБОНЕНТ ЗАНЯТ ${called_num} (${called_name}).)
 +exten => 1XX,​n(jid3send),​ GoToIf($["​${called_jid3}"​!=""​]?:​jabbersend_end)
 +exten => 1XX,n, jabbersend(asterisk|${called_jid3}|Пропущенный звонок от ${caller_num} (${caller_name}) по причине:​ АБОНЕНТ ЗАНЯТ ${called_num} (${called_name}).)
 +exten => 1XX,​n(jabbersend_end),​ NoOp
 +</​code>​
 +Опять же, не забываем про UTF8 icon smile Отправка оповещений по jabber из asterisk На этом настройка отправки сообщений заканчивается.
 +
 +===== Для ленивых:​ готовые конфиги =====
 +<file ini  jabber.conf>​
 +[general]
 +debug=no ​                             ;;Turn on debugging by default.
 +autoprune=yes ​                         ;;Auto remove users from buddy list.
 +autoregister=yes ​                      ;;​Auto register users from buddy list.
 +
 +[asterisk] ​                             ;;label
 +type=client ​                            ;;​Client or Component connection
 +serverhost=jabber.ru ​                    ;;​Route to server for example,
 +                                        ;;      talk.google.com
 +username=asterisk@jabber.ru/​мегажабер ​       ;;Username with optional roster.
 +secret=**** ​                          ;;​Password
 +port=5222 ​                              ;;​Port to use defaults to 5222
 +;​usetls=no ​                              ;;Use tls or not
 +;​usesasl=no ​                             ;;Use sasl or not
 +buddy=xrays72@jabber.ru ​             ;;Manual addition of buddy to list.
 +status=online
 +statusmessage="​какой-то статус чтобы значть что астериск живой =)" ​        ;;​Have custom status message for
 +                                        ;;Asterisk.
 +timeout=5
 +</​file>​
 +
 +Макрос для отправки сообщений в jabber: [вырезка и файла «extensions_custom.conf»]
 +<file lua extensions_custom.conf>​
 +[macro-jabba]
 +exten = s,​1,​Set(acc=_rokky_@jabber.ru)
 +exten = s,​n,​Jabberstatus(Asterisk,​${acc},​STATUS) ;; получаем статус jabber контакта,​ которому хотим отправить сообщение
 +exten = s,​n,​ExecIf($[${STATUS}>​5]?​Set(acc=xrays72@jabber.ru)) ;; если он офлайн,  ​
 +exten = s,​n,​Jabberstatus(Asterisk,​${acc},​STATUS) ;; то получаем статус следующего контакта,​ который почти всегда онлайн
 +exten = s,​n,​Set(multiText=${BASE64_DECODE(${ARG2})}) ;; декодируем текст сообщения на случай того если это смс из нескольких сообщений
 +exten = s,​n,​Jabbersend(Asterisk,​${acc},​${ARG1} ${multiText}) ;; наконец-то отправляем сообщение через jabber
 +</​file>​
 +
 +Теперь переходим к вызову макроса,​ у меня за это так же отвечал файл «extensions_custom.conf»:​
 +<file lua extensions_custom.conf>​
 +[dongle-incoming]
 +; sms
 +exten = sms,​1,​Verbose(Incoming SMS from ${CALLERID(num)} ${SMS})
 +exten = sms,​n,​Set(multiText=${SMS_BASE64})
 +exten = sms,​n,​Macro(jabba,​${DONGLENUMBER} - ${CALLERID(num)},​${multiText})
 +exten = sms,​n,​System(echo '​${STRFTIME(${EPOCH},,​%Y-%m-%d %H:%M:%S)} - ${DONGLENUMBER} - ${CALLERID(num)}:​ ${multiText}'​ >> /​home/​voip/​monitor/​sms.txt)
 +exten = sms,​n,​Hangup()
 +
 +; ussd
 +exten = ussd,​1,​Verbose(Incoming USSD: ${USSD})
 +exten = ussd,​n,​Set(multiText=${USSD_BASE64})
 +exten = ussd,​n,​Macro(jabba,​${DONGLENUMBER},​${multiText})
 +exten = ussd,​n,​System(echo '​${STRFTIME(${EPOCH},,​%Y-%m-%d %H:%M:%S)} - ${DONGLENUMBER}:​ ${multiText}'​ >> /​home/​voip/​monitor/​ussd.txt)
 +exten = ussd,​n,​Hangup()  ​
 +                    ​
 +; входящий
 +exten = s,​1,​Answer() ; поднимаем трубку при входящем звонке
 +....
 +exten = s,​n,​Macro(jabba,​Звонок от ${CALLERID(num)})
 +...
 +</​file>​
otpravka_opoveschenij_po_jabber_iz_asterisk.txt · Последние изменения: 2013/11/18 16:46 (внешнее изменение)
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Яндекс.Метрика