ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Архивные статьи в категории ‘VoIP’

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

Многие у кого в компании больше одного сервера Asterisk зачастую сталкиваются с задачей: экспорт состояния номеров на другом сервере

Например когда появляется желание мониторить состояние exten`а на другом сервере (BLF). Чтобы при том что ваш телефон подключен к одному Asterisk серверу, а второй телефон к другому. По научному это называется Distributed Device State.

Реализация подобной задачи возможна и самый распространенный путь это путь через Jabber (XMPP PubSub). Для этого соответственно вам будет необходим Jabber сервер, а так же настройка ваших Asterisk`ов.

Как то и сам я столкнулся с этой задачей. Понадобилось сделать BLF для нцать внутренних телефонов, которые находятся на другом сервере и как и следовало я углубился в доку.

Как выяснилось позднее — это не такая простая задача как может показаться на первый взгляд. У меня то ли лыжи не едут, то ли …

Делал несколько подходов к настройке данного безобразия, но нормально у меня это так и не заработало. Не буду углубляться в причины, т.к. речь в этой статье не о данном способе.

И вот не так давно на многим известном ресурсе asterisk.ru появляется очередная тема посвященная данному вопросу: Distributed Device State: SUBSCRIBE между двумя Астерисками

Как и водится начинается она как раз с выше обозначенного способа с XMPP, но затем пользователь litnimax высказывает следующую мысль:

Проблема не так просто решается.
На сегодня есть такие варианты (мне известные):
— Jabber сервер и res_xmpp для Asterisk: позволяет обмениваться состояниями, требует кучу времени на установку, жрет немерянно ресурсов (тяжелое Java приложение, зачем оно нужно на сервере телефонии?)
— PJSIP: в новом канале есть распределенные состояния (res_pjsip_pubsub.so), однако от примеров конфигов дымится моск.
— Ну и третий вариант — ØMQ модуль для астериск и скрипт ØMQ Asterisk Manager Interface (AMI) Broker — https://github.com/litnimax/zmq-ami-broker/

Автором третьего вариант является Ваш покорный слуга, который за#$% от того, что для связи двух и более серверов требуются какие-то индейские пляски.

После данного поста и почитав доку о ZMQ Broker меня прямо осенило ! Почему мой мозг так покорно уперся только в один единственный вариант с XMPP я объяснить не могу, но именно это привело к тому, что я не мыслил шире и сам не допетрил до подобной мысли, а именно собственный метод пересылки состояний. Ведь для этого у меня уже все есть:

  • возможность в Asterisk`е устанавливать Custom state для пира
  • Websocket сервер и Websocket клиент, которые создавались нами под другую задачу, но вполне могут быть применены и для этой задачи

А больше нам ничего и не надо. Точнее все же надо, но это уже другое, а именно светлая голова и прямые руки 🙂

Создадим тестовый стенд. Допишем в диалплан (файл extensions.conf) exten`ы с такими именами для наглядности:

[devstate_test]
exten => 1234,hint,Custom:mystate
exten => 1234,1,NoOp(Test custom state for exten 1234)
exten => set_inuse,1,Set(DEVICE_STATE(Custom:mystate)=INUSE)
exten => set_not_inuse,1,Set(DEVICE_STATE(Custom:mystate)=NOT_INUSE)
exten => check,1,NoOp(Custom:mystate is ${DEVICE_STATE(Custom:mystate)})

Затем инклюднем данный контекст в тот же контекст где ваш телефон и сделаем себе пару тестовых EXTEN для того чтобы вызывать set_inuse, set_not_inuse и check.

После чего можно будет набрать эти EXTEN`ы и смотреть в CLI, где будет нечто подобное:

-- Executing [set_inuse@devstate_test:1] Set("SIP/6003-00000f41", "DEVICE_STATE(Custom:mystate)=INUSE") in new stack
-- Executing [check@devstate_test:1] NoOp("SIP/6003-00000f43", "Custom:mystate is INUSE") in new stack
-- Executing [set_not_inuse@devstate_test:1] Set("SIP/6003-00000f44", "DEVICE_STATE(Custom:mystate)=NOT_INUSE") in new stack
-- Executing [check@devstate_test:1] NoOp("SIP/6003-00000f46", "Custom:mystate is NOT_INUSE") in new stack

Т.е. как мы видим все работает — состояние устанавливается. Теперь посмотрим что происходит с состоянием самого exten`а 1234, для которого и написан hint и создадим подписку (SUBSCRIBE) настроив свой телефонный аппарат путем настройки BLF на любой кнопке. После того как телефон подпишется на состояние 1234, то мы сможем это наблюдать в CLI:

*CLI> sip show subscriptions
172.16.10.12 6003 1800900375-6060 1234@users Idle dialog-info+xml <none> 000300

После чего снова вызовем set_inuse и посмотрим состояние снова:

  -- Executing [set_inuse@devstate_test:1] Set("SIP/6003-00000f6e", "DEVICE_STATE(Custom:mystate)=INUSE") in new stack
*CLI> sip show subscriptions
172.16.10.12 6003 1800900375-6060 1234@users InUse dialog-info+xml <none> 000300

Как мы можем видеть состояние изменилось на InUse и кнопка на моем телефоне покраснела.

Теперь вызовем set_not_inuse и снова посмотрим:

 -- Executing [set_not_inuse@devstate_test:1] Set("SIP/6003-00000f74", "DEVICE_STATE(Custom:mystate)=NOT_INUSE") in new stack
*CLI> sip show subscriptions
172.16.10.12 6003 1800900375-6060 1234@users Idle dialog-info+xml <none> 000300

Как мы видим состояние изменилось на Idle и кнопка на моем телефоне позеленела обратно.

Механизм работает, а значит пора приступать ко второй части — передачу состояния на другой сервер. Главное тут две вещи:

  • осознать как это должно работать
  • наладить канал поставки и импорта/экспорта состояний

Как это должно работать ? По такой схеме:

AMI <-> «Брокер» сервер А <-> «Брокер» сервер Б <-> AMI

Словами это можно представить так:

  • в AMI сервера А происходит событие изменения состояние exten
  • программный клиент, который подключен к AMI сервера А и слушает такие события передает их «Брокеру» сервера A
  • «Брокер» сервера A пересылает сообщения на «Брокер» сервера Б
  • «Брокер» сервера Б передает их программному клиенту, который в свою очередь подключен к AMI сервера Б
  • в AMI сервера Б исполняется команда

Соответственно в обратную сторону от сервера Б к серверу А все тоже самое.

Для экспорта состояния мы слушаем события в AMI, пример такого события:

Event: ExtensionStatus
Privilege: call,all
Exten: 1234
Context: devstate_test
Hint: Custom:inuse
Status: 0

Для импорта состояния в AMI мы выполняем команду Setvar:

Action: Setvar
Variable: DEVICE_STATE(Custom:ВАШ_EXTEN)
Value: ЗНАЧЕНИЕ

Где «ВАШ_EXTEN» это номер который мы мониторим, а «Значение» это состояние (inuse, not_inuse или иное).

В моем случае у меня Asterisk 1.8 и потому для меня есть несколько НО:

  • у него в AMI нет «Event DeviceStateChange«, у него есть «Event ExtensionStatus«, так же отсутствует presence state (оно появилось начиная с Asterisk 11)
  • «Event ExtensionStatus» приходит только по тому номеру НА который звонят, а по тому КТО звонит ничего нет, но это решаемо, решаемо через «Event Newstate«

После того как вы доставили сообщение к AMI сервера, вам остается сделать контекст, в котором и выполнять hint`ы для таких экстеншенов.

В виду того что символ @ в названии exten не стоит использовать, т.к. у парсера Asterisk`а сносит крышу от этого когда в строке появляется две @ 
Потому я  для себя (пока или на совсем не знаю) выбрал такой формат: НОМЕР*DNS_ИМЯ_СЕРВЕРА

[externalStates]
exten => _XXX*[a-z].,hint,Custom:${EXTEN}
exten => _XXX*[a-z].,1,NoOp(Call to ${CUT(EXTEN,*,1)} on ${CUT(EXTEN,*,2)})

После чего мы можем инклюднуть этот контекст туда где живет ваш же телефон и в настройках вашего телефона настроить BLF на подписку на exten НОМЕР*my.domain.ru.

И вуаля. При вызове НОМЕР на сервере Б, ваш телефон который подключен к серверу А теперь видит, что состояние НОМЕР изменилось и моргает вам лампочкой 🙂

Как я уже писал выше в кач-ве «брокера» я у себя использовал Websocket.

Таким образом задача была решена и с тех пор все работает как часы и без надстроек в виде XMPP.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Уважайте чужой труд.

Автор: Николаев Дмитрий (virus (at) subnets.ru)

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (Еще не голосовали)
Загрузка...
Отправить на почту Отправить на почту

Возникла необходимость настроить телефон Cisco Unified IP Phone 7931G для работы по протоколу SIP и подключению его к серверу с Asterisk.

Ранее я не имела опыта по настройке данных аппаратов и пришлось разбираться с нуля.

Итак у нас имеется аппарат, который штатно работает по протоколу SCCP (Skinny Client Control Protocol, проприетарный протокол Cisco).
Первостепенная задача — перепрошить телефон SIP прошивкой, взятой с официального сайта.

На сайте есть прошивка версии 9+ и я сначала поставила ее, но возникли проблемы с конфигом. Примеров конфигурационного файла для 9ой версии в Инете не нашлось и телефон отказывался работать (даже с сокращенным до минимума конфигом для прошивок версии 8) я решила откатиться до версии 8.5(3)SR1 как самой популярной по мануалам из разных источников.

Для настройки телефона нам понадобится:

  • DHCP сервер
  • tftp сервер

В моем случае — все делалось на рабочей станции под OS FreeBSD.
IP-адрес машины для внутренней сети — 10.20.1.1/24
Если вдруг Ваш телефон не настроен на DHCP, то это можно изменить через меню телефона. Надо разблокировать возможность менять настройки комбинацией клавиш **#, и, покопавшись в не сильно просторном меню, выставить искомый параметр.

Для запуска tftp требуется расскоментировать (или добавить) строчку в /etc/inetd.conf
tftp dgram udp wait root /usr/libexec/tftpd tftpd -s /tftpboot

Создать директорию в корне (если она отсутствует):
#mkdir /tftpboot

Установить права доступа на эту директорию:
#chown -R nobody:nogroup /tftpboot

Далее запустить
#/etc/rc.d/inetd onestart

Для автозапуска, после перезагрузки системы, добавить в /etc/rc.conf:
inetd_enable=”YES”

Проверяем, запустился ли демон inetd:
#sockstat | grep :69
root inetd 1094 5 udp4 *:69 *:*

Настраиваем DHCP. Установила из портов сервер isc-dhcp42-server:
#cd /usr/ports/net/isc-dhcp42-server/
#make install clean

Далее правим конфиг DHCP и добавляем DHCP Option 66 и Option 150:
#ee /usr/local/etc/dhcpd.conf

option voip-tftp-server code 150 = { ip-address };
subnet 10.20.1.0 netmask 255.255.255.0 {
      ...skiped...
      option tftp-server-name "10.20.1.1";
      option voip-tftp-server "10.20.1.1";
      ...skiped...
}

Cisco Systems использует нестандартную опцию в DHCP – option 150 (проприетарная опция) для настройки своих аппаратов. Опция 66 — ее аналог.

Тоже самое можно сделать и на микротике, для этого в настройки DHCP сервера нужно добавить:
/ip dhcp-server option
add code=66 name=tftp66 value=»‘IP tftp‘»
add code=150 name=tftp150 value=»‘IP tftp’”

Где IP tftp это IP-адрес нашего TFTP сервера. Пишем его в одинарных кавычках, если добавлять через винбокс, а если через консоль, то в одинарных, а потом в двойных.

/ip dhcp-server network
add address=Network/mask dhcp-option=tftp66,tftp150 dns-server=DNS1,DNS2 gateway=IP-router netmask=24

В папку /tftpboot выкладываем файлы из скаченного архива с прошивкой.
Список файлов:

  • SIP31.8-5-3SR1S.loads
  • apps31.8-5-3ES4.sbn
  • cnu31.8-5-3ES4.sbn
  • cvm31sip.8-5-3ES4.sbn
  • dsp31.8-5-3ES4.sbn
  • jar31sip.8-5-3ES4.sbn
  • term31.default.loads

На этом приготовления окончены и мы приступаем к самому процессу.

Необходимо удалить с телефона старую прошивку. Для этого:

  • отключаем телефон от питания
  • включаем держа клавишу # до тех пор пока программируемые кнопки не начнут мигать по очереди оранжевым светом
  • отпускаем кнопку и вводим на телефоне код: 3491672850*#

Телефон должен начать мигать кнопками, красным цветом. Это значит процесс стирания старой прошивки пошел. Затем телефон выключается и визуально не видно, делает ли он что-либо. Следует спокойно подождать 3-5 минут.

А пока я смотрела в tcpdump трафика на интерфейсе в сторону телефона и логи tftp-сервера,  чтобы убедиться что есть обращения от телефона к DHCP и получения файлов по TFTP.

Итак телефон прошился новой прошивкой и загружается. Для его дальнейшей работы в /tftpboot нам требуется создать конфигурационный файл телефона в формате XML, который должен иметь название вида: SEP000000000000.cnf.xml
Где 000000000000 – МАС-адрес телефона, который написан на нем на наклейке сзади.

Содержимое конфигурационного файла (наиболее интересные строки, на которые стоит обратить внимание, выделены синим):


<device>
<fullConfig>true</fullConfig>
 <deviceProtocol>SIP</deviceProtocol>
 <sshAccess>0</sshAccess>
 <sshPort>22</sshPort>
 <sshUserId>cisco</sshUserId>
 <sshPassword>cisco</sshPassword>
 <devicePool>

<dateTimeSetting>
 <dateTemplate>D.M.Y</dateTemplate>
 <timeZone>Russian Standard/Daylight Time</timeZone>
 <ntps>
 <ntp>
 <name>IP-address-ntp</name>
 <ntpMode>Unicast</ntpMode>
 </ntp>
 </ntps>
</dateTimeSetting>

<callManagerGroup>
 <tftpDefault>true</tftpDefault>
 <members>
 <member priority="0">
 <callManager>
 <name></name>
 <description></description>
 <ports>
 <ethernetPhonePort>2000</ethernetPhonePort>
 <sipPort>5060</sipPort>
 <securedSipPort>5061</securedSipPort>
 </ports>
<processNodeName>DNS-name-or-IP-address-Asterisk-server</processNodeName>
 </callManager>
 </member>
 </members>
 </callManagerGroup>
 </devicePool>

<commonProfile>
 <phonePassword></phonePassword>
 <backgroundImageAccess>true</backgroundImageAccess>
 <callLogBlfEnabled>0</callLogBlfEnabled>
 </commonProfile>
 <loadInformation>SIP31.8-5-3SR1S</loadInformation>
  <loadInformation434 model="Cisco 7931">SIP31.8-5-3SR1S</loadInformation434>
 <vendorConfig>
 <disableSpeaker>false</disableSpeaker>
 <disableSpeakerAndHeadset>false</disableSpeakerAndHeadset>
 <pcPort>0</pcPort>
 <settingsAccess>1</settingsAccess>
 <garp>0</garp>
<voiceVlanAccess>0</voiceVlanAccess>
 <videoCapability>0</videoCapability>
 <autoSelectLineEnable>0</autoSelectLineEnable>
 <daysDisplayNotActive>1,7</daysDisplayNotActive>
 <displayOnTime>10:30</displayOnTime>
 <displayOnDuration>06:05</displayOnDuration>
 <displayIdleTimeout>00:05</displayIdleTimeout>
 <webAccess>0</webAccess>
 <spanToPCPort>1</spanToPCPort>
 <loggingDisplay>1</loggingDisplay>
 <loadServer></loadServer>
</vendorConfig>

<userLocale>
 <name>Russian_Federation</name>
 <uid></uid>
 <langCode>en_En</langCode>
 <version>SIP31.8-5-3SR1S</version>
  <winCharSet>utf-8</winCharSet>
 </userLocale>
 <networkLocale>Russian_Federation</networkLocale>
 <networkLocaleInfo>
 <name>Russian_Federation</name>
 <uid></uid>
 <version>SIP31.8-5-3SR41S</version>
 </networkLocaleInfo>

<deviceSecurityMode>1</deviceSecurityMode>
 <idleTimeout>0</idleTimeout>
 <directoryURL></directoryURL>
 <servicesURL></servicesURL>
 <idleURL></idleURL>
 <messagesURL></messagesURL>
 <proxyServerURL></proxyServerURL>
 <dscpForSCCPPhoneConfig>96</dscpForSCCPPhoneConfig>
 <dscpForSCCPPhoneServices>0</dscpForSCCPPhoneServices>
 <dscpForCm2Dvce>96</dscpForCm2Dvce>
 <transportLayerProtocol>2</transportLayerProtocol>
 <capfAuthMode>0</capfAuthMode>
 <capfList>
 <capf>
 <phonePort>3804</phonePort>
 </capf>
 </capfList>
 <certHash></certHash>
<encrConfig>false</encrConfig>
 <sipProfile>
 <sipProxies>
 <backupProxy></backupProxy>
 <backupProxyPort></backupProxyPort>
 <emergencyProxy></emergencyProxy>
 <emergencyProxyPort></emergencyProxyPort>
 <outboundProxy></outboundProxy>
  <outboundProxyPort></outboundProxyPort>
  <registerWithProxy>true</registerWithProxy>
 </sipProxies>
 <sipCallFeatures>
 <cnfJoinEnabled>true</cnfJoinEnabled>
 <callForwardURI>x--serviceuri-cfwdall</callForwardURI>
 <callPickupURI>x-cisco-serviceuri-pickup</callPickupURI>
 <callPickupListURI>x-cisco-serviceuri-opickup</callPickupListURI>
 <callPickupGroupURI>x-cisco-serviceuri-gpickup</callPickupGroupURI>
 <meetMeServiceURI>x-cisco-serviceuri-meetme</meetMeServiceURI>
 <abbreviatedDialURI>x-cisco-serviceuri-abbrdial</abbreviatedDialURI>
 <rfc2543Hold>false</rfc2543Hold>
<callHoldRingback>2</callHoldRingback>
 <localCfwdEnable>false</localCfwdEnable>
 <semiAttendedTransfer>false</semiAttendedTransfer>
 <anonymousCallBlock>2</anonymousCallBlock>
 <callerIdBlocking>2</callerIdBlocking>
 <dndControl>0</dndControl>
 <remoteCcEnable>true</remoteCcEnable>
 </sipCallFeatures>
 <sipStack>
 <sipInviteRetx>6</sipInviteRetx>
 <sipRetx>10</sipRetx>
 <timerInviteExpires>180</timerInviteExpires>
 <timerRegisterExpires>300</timerRegisterExpires>
 <timerRegisterDelta>5</timerRegisterDelta>
 <timerKeepAliveExpires>120</timerKeepAliveExpires>
 <timerSubscribeExpires>120</timerSubscribeExpires>
<timerSubscribeDelta>5</timerSubscribeDelta>
 <timerT1>500</timerT1>
 <timerT2>4000</timerT2>
 <maxRedirects>70</maxRedirects>
 <remotePartyID>false</remotePartyID>
 <userInfo>None</userInfo>
 </sipStack>

<autoAnswerTimer>1</autoAnswerTimer>
 <autoAnswerAltBehavior>false</autoAnswerAltBehavior>
 <autoAnswerOverride>true</autoAnswerOverride>
 <transferOnhookEnabled>false</transferOnhookEnabled>
 <enableVad>false</enableVad>
 <preferredCodec>g711alaw</preferredCodec>
 <dtmfAvtPayload>101</dtmfAvtPayload>
 <dtmfDbLevel>3</dtmfDbLevel>
 <dtmfOutofBand>avt</dtmfOutofBand>
 <alwaysUsePrimeLine>false</alwaysUsePrimeLine>
 <alwaysUsePrimeLineVoiceMail>false</alwaysUsePrimeLineVoiceMail>
 <kpml>3</kpml>
 <stutterMsgWaiting>1</stutterMsgWaiting>
<callStats>true</callStats>
 <silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
 <disableLocalSpeedDialConfig>true</disableLocalSpeedDialConfig>
 <startMediaPort>16100</startMediaPort>
 <stopMediaPort>19300</stopMediaPort>
 <voipControlPort>5061</voipControlPort>
 <dscpForAudio>184</dscpForAudio>
 <ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>
 <dialTemplate></dialTemplate>
 <phoneLabel>301</phoneLabel>

<natReceivedProcessing>false</natReceivedProcessing>
<natEnabled>false</natEnabled>
<natAddress></natAddress>

<sipLines>
 <line button="1">
 <featureID>9</featureID>
<featureLabel>Number</featureLabel>
 <proxy>DNS-name-or-IP-address-Asterisk-server</proxy>
 <port>5060</port>
  <name>SIP-account-number</name>
  <displayName>SIP-account-number-or-Name</displayName>
 <autoAnswer>
 <autoAnswerEnabled>2</autoAnswerEnabled>
 </autoAnswer>
 <callWaiting>3</callWaiting>
 <authName>SIP-account-auth-name</authName>
  <authPassword>SIP-password</authPassword>
 <sharedLine>false</sharedLine>
 <messageWaitingLampPolicy>3</messageWaitingLampPolicy>
 <messagesNumber></messagesNumber>
 <ringSettingIdle>4</ringSettingIdle>
 <ringSettingActive>5</ringSettingActive>
 <contact>SIP-account-number</contact>
 <forwardCallInfoDisplay>
<callerName>true</callerName>
 <callerNumber>false</callerNumber>
 <redirectedNumber>false</redirectedNumber>
 <dialedNumber>true</dialedNumber>
 </forwardCallInfoDisplay>
 </line>
 <line button="2">
 <featureID>21</featureID>
 <featureLabel>Name</featureLabel>
 <speedDialNumber>Number</speedDialNumber>
 </line>
 </sipLines>
 </sipProfile>
 </device>

Следует отметить, что если телефон не принимает конфигурационный файл, например из-за наличия ошибок в нем, то он будет отображать на экране состояние «Unprovisioned» и каждые 30 секунд обращаться к tftp-серверу, пытаясь вновь скачать конфигурационный файл (вдруг, на этот раз он не будет содержать ошибок). Эти попытки прекрасно видны по tcpdump`у и в логах TFTP.
Для проверки корректности XML синтаксиса конфигурационного файла мне дали хороший совет: просто открыть файл конфига браузером. Лично мне это помогло, помогло осознать почему конфиг не принимается, а так же браузер точно указал в каком именно месте ошибка синтаксиса.

Пробежимся по настройкам:
dateTemplate — формат День — Месяц — Год.
timeZone — Временные зоны, например, перечислены тут
loadInformation — Версия прошивки, которую брать. Должно совпадать с названием файла .loads
phoneLabel — в правом верхнем углу будет висеть этот лейбл. Не длинее 12 символов.
preferredCodec — голосовой кодек, который будет использовать телефон

webAccess — Включение WEB-сервера на телефона. Обратите внимание, что для включение веб-интерфейса необходимо установить значение параметра в ноль.
sshAccess — Тоже самое касается ssh доступа на устройство.

Причем основная часть инструкций считает достаточным ввести 2 строки с UserID и Password для работы сервиса ssh, некоторые источники указывают еще верхние 2, и поясняют их актуальность только для версий прошивки старше 8.5.1. У меня не получилось подключиться по ssh ни в одном из найденных мной версий написания этих параметров.

Настройки сети:
registerWithProxy — для регистрации SIP линий
natEnable — ставим «true» если телефон находится за NAT
Если natEnable в «true», то телефону необходимо знать внешний IP-адрес NAT`а. Для этого есть две опции:

  • natReceivedProcessing — внешний IP-адрес будет автоматически браться из поля VIA (received=XXX.XXX.XXX.XXX) SIP-пакета 200 ОК полученный от сервера в ответ на пакет REGISTER от телефона, вместо поля Contact
  • natAddress — явное указание внешнего IP адрес NAT`a

При работе за NAT`ом выбрала установку natReceivedProcessing, а natAddress оставила пустым:

<natReceivedProcessing>true</natReceivedProcessing>
<natEnabled>true</natEnabled>
<natAddress></natAddress>

Указание диапазона RTP портов:

  • startMediaPort
  • stopMediaPort

voipControlPort — если значение пустое, то по умолчанию порт 5060. Обратите внимание, что в зависимости от значения параметра natEnabled поведение разное.
Если natEnabled «false», то этот порт используется в кач-ве SRC порта для отправки SIP пакетов. Если natEnabled «true», то телефон будет отправлять пакеты с непривилегированных портов, а на этом порту будет ожидать ОТВЕТЫ от SIP-сервера.
Таким образом, при установке телефона за NAT и без дополнительной настройки шлюза (проброс порта) он работать не будет.
Изыскания на эту тему написаны в топике «Cisco 7931g SIP» на forum.asterisk.ru:

1.1.1.16 — сервер
10.10.1.153 — Cisco 7931G

11:12:05.794376 IP (tos 0x60, ttl 64, id 249, offset 0, flags [none], proto UDP (17), length 609)
    10.10.1.153.49287 > 1.1.1.16.5060: SIP, length: 581
        REGISTER sip:1.1.1.16 SIP/2.0
        Via: SIP/2.0/UDP 10.10.1.153:5060;branch=z9hG4bKb92b2996
        From: <sip:7896@1.1.1.16>;tag=5cfc665d4f9a00100ee171b2-9eb423e6
        To: <sip:7896@1.1.1.16>
        Call-ID: 5cfc665d-4f9a0002-b7a3ced0-c1c67a5a@10.10.1.153
        Max-Forwards: 70
        Date: Tue, 01 Jun 2010 06:05:18 GMT
        CSeq: 110 REGISTER
        User-Agent: Cisco-CP7931G/8.5.3
        Contact: <sip:7896@10.10.1.153:5060;transport=udp>;+sip.instance="";+u.sip!model.ccm.cisco.com="348"
        Supported: (null),X-cisco-xsi-7.0.1
        Content-Length: 0
        Expires: 300

11:12:05.831242 IP (tos 0x0, ttl 60, id 57479, offset 0, flags [none], proto UDP (17), length 588, bad cksum 0 (->8afc)!)
    1.1.1.16.5060 > 10.10.1.153.49287: SIP, length: 560
        SIP/2.0 401 Unauthorized
        Via: SIP/2.0/UDP 10.10.1.153:5060;branch=z9hG4bKb92b2996;received=1.1.1.16;rport=49287
        From: <sip:7896@1.1.1.16>;tag=5cfc665d4f9a00100ee171b2-9eb423e6
        To: <sip:7896@1.1.1.16>;tag=as35525338
        Call-ID: 5cfc665d-4f9a0002-b7a3ced0-c1c67a5a@10.10.1.153
        CSeq: 110 REGISTER
        Server: sip8.domain.com
        Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
        Supported: replaces, timer
        WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="070714aa"
        Content-Length: 0

После чего телефон утверждает udp port 49287 unreachable:

11:12:05.832048 IP (tos 0x0, ttl 64, id 250, offset 0, flags [none], proto ICMP (1), length 56)
10.10.1.153 > 1.1.1.16: ICMP 10.10.1.153 udp port 49287 unreachable, length 36
IP (tos 0x0, ttl 60, id 57479, offset 0, flags [none], proto UDP (17), length 588)
1.1.1.16.5060 > 10.10.1.153.49287: SIP, length: 560
[|sip]

….SKIPED….

Снова попробовал через NAT и наконец разобрался.
Могу сказать, что в предыдущий раз, это я ОЛЕНЬ (правда не пойму как так получилось), но судя по дампу, и наличию «rport» в конце строки VIA на которую я не обратил внимания, в пире в этот момент точно стояло nat=yes, а не nat=no.

Установил nat=no на стороне Asterisk, в конфиге телефона:

<voipControlPort>5061</voipControlPort>
<natReceivedProcessing>true</natReceivedProcessing>
<natEnabled>true</natEnabled>
<natAddress></natAddress>

И… и это не взлетело, но на этот раз причина ясна:

  • 1.1.68.16 — Asterisk
  • 1.1.68.72 — IPшник NAT`а
  • 10.10.1.153 — IPшник телефона

Прохождение пакета REGISTER от телефона: 10.10.1.153.49845 > 1.1.68.72.49845 > 1.1.68.16.5060 (поле Contact: <sip:7896@1.1.68.72:5061;transport=udp>)
Прохождение ответного пакета 401 Unauthorized: 1.1.68.16.5060 > 1.1.68.72.5061
Пакет доезжает до 1.1.68.72, но не проходит к 10.10.1.153 т.к. в таблице NAT трансляций отсутствует запись о 10.10.1.153:5061, т.к. изначальный пакет 10.10.1.153.49845, посему пакет просто отбрасывается.

Соответственно становится логично, что если сделать проброс порта 5061 с внешнего 1.1.68.72 на 10.10.1.153, то все конечно же заработает.
Делаем проброс 5061 и ч.т.д.

Дамп на стороне Asterisk`а:

11:04:44.251049 IP (tos 0x0, ttl 60, id 767, offset 0, flags [none], proto UDP (17), length 768)
1.1.68.72.49845 > 1.1.68.16.5060: SIP, length: 740
REGISTER sip:1.1.68.16 SIP/2.0
Via: SIP/2.0/UDP 1.1.68.72:5061;branch=z9hG4bKff66d16c
From: <sip:7896@1.1.68.16>;tag=5cfc665d4f9a003e6c2253cc-3c681c9c
To: <sip:7896@1.1.68.16>
Call-ID: 5cfc665d-4f9a0002-30c35668-66fda434@10.10.1.153
Max-Forwards: 70
Date: Wed, 28 Oct 2015 08:04:43 GMT
CSeq: 165 REGISTER
User-Agent: Cisco-CP7931G/8.5.3
Contact: <sip:7896@1.1.68.72:5061;transport=udp>;+sip.instance="<urn:uuid:00000000-0000-0000-0000-5cfc665d4f9a>";+u.sip!model.ccm.cisco.com="348"
Authorization: Digest username="7896",realm="asterisk",uri="sip:1.1.68.16",response="6a2ea6fed25e34d552573634601fb9d1",nonce="19016509",algorithm=MD5
Supported: (null),X-cisco-xsi-7.0.1
Content-Length: 0
Expires: 300

11:04:44.251109 IP (tos 0x0, ttl 64, id 63304, offset 0, flags [none], proto UDP (17), length 590)
1.1.68.16.5060 > 1.1.68.72.5061: SIP, length: 562
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 1.1.68.72:5061;branch=z9hG4bKff66d16c;received=1.1.68.72
From: <sip:7896@1.1.68.16>;tag=5cfc665d4f9a003e6c2253cc-3c681c9c
To: <sip:7896@1.1.68.16>;tag=as2a67ddfa
Call-ID: 5cfc665d-4f9a0002-30c35668-66fda434@10.10.1.153
CSeq: 165 REGISTER
Server: sip8.domain.com
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="4a6dbb1e", stale=true
Content-Length: 0

11:04:44.258586 IP (tos 0x0, ttl 60, id 768, offset 0, flags [none], proto UDP (17), length 768)
1.1.68.72.49846 > 1.1.68.16.5060: SIP, length: 740
REGISTER sip:1.1.68.16 SIP/2.0
Via: SIP/2.0/UDP 1.1.68.72:5061;branch=z9hG4bK398ff65c
From: <sip:7896@1.1.68.16>;tag=5cfc665d4f9a003e6c2253cc-3c681c9c
To: <sip:7896@1.1.68.16>
Call-ID: 5cfc665d-4f9a0002-30c35668-66fda434@10.10.1.153
Max-Forwards: 70
Date: Wed, 28 Oct 2015 08:04:43 GMT
CSeq: 166 REGISTER
User-Agent: Cisco-CP7931G/8.5.3
Contact: <sip:7896@1.1.68.72:5061;transport=udp>;+sip.instance="<urn:uuid:00000000-0000-0000-0000-5cfc665d4f9a>";+u.sip!model.ccm.cisco.com="348"
Authorization: Digest username="7896",realm="asterisk",uri="sip:1.1.68.16",response="4a56a3e3f5e1b272274fa7cc3ce48d19",nonce="4a6dbb1e",algorithm=MD5
Supported: (null),X-cisco-xsi-7.0.1
Content-Length: 0
Expires: 300


11:04:44.258686 IP (tos 0x0, ttl 64, id 63321, offset 0, flags [none], proto UDP (17), length 609)
1.1.68.16.5060 > 1.1.68.72.5061: SIP, length: 581
SIP/2.0 200 OK
Via: SIP/2.0/UDP 1.1.68.72:5061;branch=z9hG4bK398ff65c;received=1.1.68.72
From: <sip:7896@1.1.68.16>;tag=5cfc665d4f9a003e6c2253cc-3c681c9c
To: <sip:7896@1.1.68.16>;tag=as2a67ddfa
Call-ID: 5cfc665d-4f9a0002-30c35668-66fda434@10.10.1.153
CSeq: 166 REGISTER
Server: sip8.domain.com
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Expires: 300
Contact: <sip:7896@1.1.68.72:5061;transport=udp>;expires=300
Date: Wed, 28 Oct 2015 08:04:44 GMT
Content-Length: 0
Состояние регистрации на сервере:

7896/7896 1.1.68.72 D 5061 Unmonitored

Addr->IP : 1.1.68.72:5061

Useragent : Cisco-CP7931G/8.5.3

Reg. Contact : sip:7896@1.1.68.72:5061;transport=udp

Дамп на стороне NAT`а (после процесса NAT):

11:45:08.033612 IP (tos 0x60, ttl 64, id 25, offset 0, flags [none], proto UDP (17), length 762)
10.10.1.153.49182 > 1.1.68.16.5060: SIP, length: 734
REGISTER sip:1.1.68.16 SIP/2.0
Via: SIP/2.0/UDP 10.10.1.153:5061;branch=z9hG4bK79f75193
From: <sip:7896@1.1.68.16>;tag=5cfc665d4f9a0002a072f674-1c4da357
To: <sip:7896@1.1.68.16>
Call-ID: 5cfc665d-4f9a0002-f3129326-816fc831@10.10.1.153
Max-Forwards: 70
Date: Wed, 28 Oct 2015 08:45:05 GMT
CSeq: 103 REGISTER
User-Agent: Cisco-CP7931G/8.5.3
Contact: <sip:7896@10.10.1.153:5061;transport=udp>;+sip.instance="<urn:uuid:00000000-0000-0000-0000-5cfc665d4f9a>";+u.sip!model.ccm.cisco.com="348"
Authorization: Digest username="7896",realm="asterisk",uri="sip:1.1.68.16",response="7f6cf3decde843e30c6475cef15d7bc4",nonce="40839bef",algorithm=MD5
Supported: (null),X-cisco-xsi-7.0.1
Content-Length: 0
Expires: 0


11:45:08.035579 IP (tos 0x0, ttl 60, id 9145, offset 0, flags [none], proto UDP (17), length 588, bad cksum 0 (->47cb)!)
1.1.68.16.5060 > 10.10.1.153.5061: SIP, length: 560
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.10.1.153:5061;branch=z9hG4bK79f75193;received=1.1.68.72
From: <sip:7896@1.1.68.16>;tag=5cfc665d4f9a0002a072f674-1c4da357
To: <sip:7896@1.1.68.16>;tag=as31ab4c73
Call-ID: 5cfc665d-4f9a0002-f3129326-816fc831@10.10.1.153
CSeq: 103 REGISTER
Server: sip8.domain.com
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
WWW-Authenticate: Digest algorithm=MD5, realm="asterisk", nonce="10809208", stale=true
Content-Length: 0

11:45:08.041848 IP (tos 0x60, ttl 64, id 26, offset 0, flags [none], proto UDP (17), length 762)
10.10.1.153.49183 > 1.1.68.16.5060: SIP, length: 734
REGISTER sip:1.1.68.16 SIP/2.0
Via: SIP/2.0/UDP 10.10.1.153:5061;branch=z9hG4bK32b5e3e0
From: <sip:7896@1.1.68.16>;tag=5cfc665d4f9a0002a072f674-1c4da357
To: <sip:7896@1.1.68.16>
Call-ID: 5cfc665d-4f9a0002-f3129326-816fc831@10.10.1.153
Max-Forwards: 70
Date: Wed, 28 Oct 2015 08:45:05 GMT
CSeq: 104 REGISTER
User-Agent: Cisco-CP7931G/8.5.3
Contact: <sip:7896@10.10.1.153:5061;transport=udp>;+sip.instance="<urn:uuid:00000000-0000-0000-0000-5cfc665d4f9a>";+u.sip!model.ccm.cisco.com="348"
Authorization: Digest username="7896",realm="asterisk",uri="sip:1.1.68.16",response="7951fc7add50cbbceb0608a3a8b4379a",nonce="10809208",algorithm=MD5
Supported: (null),X-cisco-xsi-7.0.1
Content-Length: 0
Expires: 0


11:45:08.043572 IP (tos 0x0, ttl 60, id 9161, offset 0, flags [none], proto UDP (17), length 539, bad cksum 0 (->47ec)!)
1.1.68.16.5060 > 10.10.1.153.5061: SIP, length: 511
SIP/2.0 200 OK
Via: SIP/2.0/UDP 10.10.1.153:5061;branch=z9hG4bK32b5e3e0;received=1.1.68.72
From: <sip:7896@1.1.68.16>;tag=5cfc665d4f9a0002a072f674-1c4da357
To: <sip:7896@1.1.68.16>;tag=as31ab4c73
Call-ID: 5cfc665d-4f9a0002-f3129326-816fc831@10.10.1.153
CSeq: 104 REGISTER
Server: sip8.domain.com
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Expires: 0
Date: Wed, 28 Oct 2015 08:45:08 GMT
Content-Length: 0

SIP линии:
featureID — про этот параметр ниже
proxy- IP-адрес нашего сервера c Asterisk
port — SIP порт
name — Имя или номер SIP аккаунта
displayName — Отображаемое имя, соответственно указываем или имя или номер.
authName — имя вашего аккаунта для авторизации на сервере, обычно это ваш номер
authPassword — пароль вашего SIP аккаунта
contact — номер SIP аккаунта

Линия с Speed Dial
SD (Speed Dial — набор номера по нажатии кнопки) на программируемых кнопках (коих 24 штуки).
Хотелось настроить еще и BLF, но это оказалось все непросто с этим на этом телефоне. Идея была отодвинута (отлично гуглятся решения, вроде работы телефона с Cisco Call Manager),  т.к. необходимо пропатчить Астериск, а именно chan_sip.
Кнопки линий пронумерованы от 24 до 1 сверху вниз, чередуясь слева вправо. Соответвенно, 1 линия находится в правом нижнем углу.

featureLabel- выводимое описание
speedDialNumber — номер для набора

featureID — код фичи, то что будет делаться по нажатию кнопки:

  • feature id 1 last number redial
  • feature id 2 speed dial
  • feature id 3 hold
  • feature id 5 fwd all
  • feature id 9 line — Для SIP регистрации
  • feature id 19 private
  • feature id 20 service uri
  • featureid 21 speed dial — Для набора сохраненного номера
  • feature id 22 paging
  • feature id 27 Malicious call ID

Полезные ссылки:

P.S. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Уважайте чужой труд.

Автор: Гриднева Мария

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 3, среднее: 4,67 из 5)
Загрузка...
Отправить на почту Отправить на почту

Запускаем новый проект SUBNETS.RU -> http://rosreestr.subnets.ru/

Сервис для получения информации по принадлежности телефонных номеров операторам основываясь на данных из росреестра.

«Выросло» отсюда.

На сайте проекта можно скачать всю базу целиком или выполнить запрос.

Возможные типы GET запросов:

  • http://rosreestr.subnets.ru/?get=code&code=CODE — ответ в формате PLAIN TEXT (где CODE это код номера)
  • http://rosreestr.subnets.ru/?get=code&code=CODE&format=csv — ответ в формате CSV (где CODE это код номера)
  • http://rosreestr.subnets.ru/?get=code&code=CODE&format=xml — ответ в формате XML (где CODE это код номера)
  • http://rosreestr.subnets.ru/?get=code&code=CODE&format=json — ответ в формате JSON (где CODE это код номера)
  • http://rosreestr.subnets.ru/?get=num&num=NUMBER — ответ в формате JSON (где NUMBER это номер БЕЗ 8рки)
  • http://rosreestr.subnets.ru/?get=num&num=NUMBER&format=csv — ответ в формате CSV (где NUMBER это номер БЕЗ 8рки)
  • http://rosreestr.subnets.ru/?get=num&num=NUMBER&format=xml — ответ в формате XML (где NUMBER это номер БЕЗ 8рки)
  • http://rosreestr.subnets.ru/?get=num&num=NUMBER&format=json — ответ в формате JSON (где NUMBER это номер БЕЗ 8рки)

Ваши мысли, идеи => ПРИВЕТСТВУЮТСЯ => virus [СОБАЧКА-ГАВ-ГАВ] subnets.ru

Реестр Россвязи,Импорт реестра россвязи,Поиск телефона по реестру Россвязи,Экспорт реестра Россвязи

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (Еще не голосовали)
Загрузка...
Отправить на почту Отправить на почту

Всем трям !

После очередного взлома Asterisk`а клиента нашего клиента (простите за тавтологию :)) и отправки через него SIP вызовов на дорогие направления и данного топика на форуме мы снова между собой заговорили про давнюю идею…

Идея, которая сидит не только в наших головах, до которой пока ни у кого толком руки так не дошли…

Идея проста: для email есть тот же Spamcop, а для VoIP ? Хм… да ничего нету… И вот этот пробел хорошо бы устранить.

Что необходимо ?

Online сервис, в последствии распределенный сервис, который будет содержать список фродовых номеров и/или направлений и предоставлять возможность обращаться к нему за этим данными, например перед тем как разрешить совершение вызова.

Что это даст ?

Ну как минимум: клиенту это может сэкономить его деньги, а нам это даст сохранение клиента, своих нервов и попыток доказать клиенту, что его система все же совершала вызовы на дорогие направления.

Ведь наверняка и у вас было когда клиент говорил «это не мое !» и потом «тогда я отключаюсь от вас».

Так было принято решение: brain -> hands -> service 🙂

Встречайте пилотную версию нового проекта subnets.ru -> frod.subnets.ru

Надо же с чего то начинать.

Вот вкратце как предполагается  использовать и уже сейчас можно использовать:

Asterisk dialplan

DNS + ENUMLOOKUP

Пример контекста:

[tests]
exten => test,1,Set(DIAL=${ENUMLOOKUP(${EXTEN},,,,frod.subnets.ru.)})
exten => test,n,NoOp(${DIAL})
exten => test,n,GotoIf($["${DIAL}" = ""]?dial:frod)
exten => test,n(dial),NoOp(Dial(SIP/prov/${EXTEN},60,ti))
exten => test,n,Hangup
exten => test,n(frod),NoOp(Frod detected, skip dial)
exten => test,n,Hangup

В CLI Asterisk будет:

-- Executing [test@tests:1] Set("SIP/6003-000002b2", "DIAL=810972592132872@127.0.0.1") in new stack
-- Executing [test@tests:2] NoOp("SIP/6003-000002b2", "810972592132872@127.0.0.1") in new stack
-- Executing [test@tests:3] GotoIf("SIP/6003-000002b2", "0?dial:frod") in new stack
-- Goto (tests,test,6)
-- Executing [test@tests:6] NoOp("SIP/6003-000002b2", "Frod detected, skip dial") in new stack
-- Executing [test@tests:7] Hangup("SIP/6003-000002b2", "") in new stack

API Для тех кому нужно будет большее чем DNS запрос, будет доступно API:

Консоль

# nslookup 7781046406664700.frod.subnets.ru
Server: 91.217.137.1
Address: 91.217.137.1#53

Name: 7781046406664700.frod.subnets.ru
Address: 216.121.95.194

Вышеописанное уже есть на данный момент, а далее… далее очень много вопросов. Вопросов таких как:

  • получение данных извне
  • обработка данных (добавление номера в список, кол-во времени хранения и т.п.)
  •  удаление номера из базы извне

Это конечно не полный список вопросов, которые нужно решить и которые будут решаться. Если у вас есть данные о фродовых вызовах с ваших серверов/железа и вы готовы ими поделиться с остальными, то отправка этих данных нам приветствуется 🙂 Если у вас есть мысли, идеи, то они так же приветствуются. Можно написать тут в комментах, можно отправить на virus [СОБАЧКА-ГАВ-ГАВ] subnets.ru Пока нет логики обработки данных, то пока данные из базы будут представляться as-is.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА ! Уважайте чужой труд.

Автор: Николаев Дмитрий (virus (at) subnets.ru)

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 2, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Channel Event Logging (CEL)

Дано:

  • FreeBSD 8.1-RELEASE
  • Asterisk 1.8.17.0

Полученные от CEL данные будем складывать в csv и MySQL.

MySQL CEL Backend:

Using MySQL for Channel Event records is supported by using ODBC and the cel_odbc module.

Ставим порты для ODBC

  • /usr/ports/databases/unixODBC
  • /usr/ports/databases/mysql-connector-odbc

# pkg_info | grep ODBC
mysql-connector-odbc-unixodbc-mysql55-5.1.9 ODBC driver for MySQL55 / unixodbc
unixODBC-2.3.1 ODBC library suite for Unix

# ls -la /usr/local/lib/libmyodbc*
-rwxr-xr-x 1 root wheel 260880 18 сен 09:21 /usr/local/lib/libmyodbc5.so

Смотрим расположение конфиг файлов:

# odbcinst -j

unixODBC 2.3.1
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
FILE DATA SOURCES..: /usr/local/etc/ODBCDataSources
USER DATA SOURCES..: /root/.odbc.ini
SQLULEN Size.......: 4
SQLLEN Size........: 4
SQLSETPOSIROW Size.: 2

Правим /usr/local/etc/odbcinst.ini

[MySQL]
Description=ODBC for MySQL
Driver=/usr/local/lib/libmyodbc5.so
UsageCount=20001

Инсталим драйвер:

# odbcinst -i -d -f /usr/local/etc/odbcinst.ini

Правим /usr/local/etc/odbc.ini:

[mysql-odbc-ini-asterisk]
Driver=MySQL
SERVER=127.0.0.1
PORT=3306
DATABASE=asterisk
USER=asterisk
PASSWORD=password
OPTION=4194304

Проверяем список доступных DSN:

# odbcinst -s -q

[mysql-odbc-ini-asterisk]

Настраиваем конфиги в Asterisk

/usr/local/etc/asterisk/cel.conf:

[general]
enable=yes
;apps=dial,park
;events=APP_START,CHAN_START,CHAN_END,ANSWER,HANGUP,BRIDGE_START,BRIDGE_END
apps=all
events=all
dateformat = %F %T

[manager]
enabled=no

[radius]

В /usr/local/etc/asterisk/cel_custom.conf раскомментируем секцию [mappings].
Проверим наличие директории /var/log/asterisk/cel-custom, если её нет то создадим ей и не забываем установить необходимые права, чтобы asterisk смог осуществить запись.

/usr/local/etc/asterisk/res_odbc.conf:
[asterisk-res-odbc]
enabled => yes
dsn => mysql-odbc-ini-asterisk
username => asterisk
password => password
pre-connect => yes

/usr/local/etc/asterisk/cel_odbc.conf:
[first]
connection=asterisk-res-odbc
table=cel
loguniqueid=yes

Создаем таблицу в базе:

CREATE TABLE IF NOT EXISTS `cel` (
  `id` int(11) NOT NULL auto_increment,
  `eventtype` varchar(30) NOT NULL,
  `eventtime` datetime NOT NULL,
  `cid_name` varchar(80) NOT NULL,
  `cid_num` varchar(80) NOT NULL,
  `cid_ani` varchar(80) NOT NULL,
  `cid_rdnis` varchar(80) NOT NULL,
  `cid_dnid` varchar(80) NOT NULL,
  `exten` varchar(80) NOT NULL,
  `context` varchar(80) NOT NULL,
  `channame` varchar(80) NOT NULL,
  `src` varchar(80) NOT NULL,
  `dst` varchar(80) NOT NULL,
  `channel` varchar(80) NOT NULL,
  `dstchannel` varchar(80) NOT NULL,
  `appname` varchar(80) NOT NULL,
  `appdata` varchar(80) NOT NULL,
  `amaflags` int(11) NOT NULL,
  `accountcode` varchar(20) NOT NULL,
  `uniqueid` varchar(32) NOT NULL,
  `linkedid` varchar(32) NOT NULL,
  `peer` varchar(80) NOT NULL,
  `userdeftype` varchar(255) NOT NULL,
  `eventextra` varchar(255) NOT NULL,
  `userfield` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `uniqueid_index` (`uniqueid`),
  KEY `linkedid_index` (`linkedid`)
);

Перезапускаем:
# asterisk -r
asterisk*CLI> module reload res_odbc.so
— Reloading module ‘res_odbc.so’ (ODBC resource)
== Parsing ‘/usr/local/etc/asterisk/res_odbc.conf’: == Found
[Sep 18 10:05:59] NOTICE[84181]: res_odbc.c:1531 odbc_obj_connect: Connecting asterisk-res-odbc
[Sep 18 10:05:59] NOTICE[84181]: res_odbc.c:1563 odbc_obj_connect: res_odbc: Connected to asterisk-res-odbc [mysql-odbc-ini-asterisk]
[Sep 18 10:05:59] NOTICE[84181]: res_odbc.c:920 load_odbc_config: Registered ODBC class ‘asterisk-res-odbc’ dsn->[mysql-odbc-ini-asterisk]
[Sep 18 10:05:59] DEBUG[84181]: res_odbc.c:1504 odbc_obj_disconnect: Database handle 0x2a9a6000 deallocated

asterisk*CLI> module reload cel_odbc.so
— Reloading module ‘cel_odbc.so’ (ODBC CEL backend)
== Parsing ‘/usr/local/etc/asterisk/cel_odbc.conf’: == Found
— Found CEL table cel@asterisk-res-odbc.

asterisk*CLI> module reload cel_custom.so
— Reloading module ‘cel_custom.so’ (Customizable Comma Separated Values CEL Backend)
== Parsing ‘/usr/local/etc/asterisk/cel_custom.conf’: == Found

Проверяем:
asterisk*CLI> cel show status
CEL Logging: Enabled
CEL Tracking Event: ALL
CEL Tracking Event: CHAN_START
CEL Tracking Event: CHAN_END
CEL Tracking Event: HANGUP
CEL Tracking Event: ANSWER
CEL Tracking Event: APP_START
CEL Tracking Event: APP_END
CEL Tracking Event: BRIDGE_START
CEL Tracking Event: BRIDGE_END
CEL Tracking Event: CONF_START
CEL Tracking Event: CONF_END
CEL Tracking Event: PARK_START
CEL Tracking Event: PARK_END
CEL Tracking Event: BLINDTRANSFER
CEL Tracking Event: ATTENDEDTRANSFER
CEL Tracking Event: TRANSFER
CEL Tracking Event: HOOKFLASH
CEL Tracking Event: 3WAY_START
CEL Tracking Event: 3WAY_END
CEL Tracking Event: CONF_ENTER
CEL Tracking Event: CONF_EXIT
CEL Tracking Event: USER_DEFINED
CEL Tracking Event: LINKEDID_END
CEL Tracking Event: BRIDGE_UPDATE
CEL Tracking Event: PICKUP
CEL Tracking Event: FORWARD
CEL Tracking Application: all
CEL Event Subscriber: ODBC CEL backend
CEL Event Subscriber: CEL Custom CSV Logging

asterisk*CLI> odbc show

ODBC DSN Settings
——————

Name: asterisk-res-odbc
DSN: mysql-odbc-ini-asterisk
Last connection attempt: 1970-01-01 03:00:00
Pooled: No
Connected: Yes

После чего при прохождении вызовов должна будет заполняться таблица cel в БД asteriskб так же файл /var/log/asterisk/cel-custom/Master.csv.

Описание: CEL Events and Fields

Существует возможность генерить свои event`ы: CELGenUserEvent Application:

asterisk*CLI> core show application CELGenUserEvent

  -= Info about application 'CELGenUserEvent' =-

[Synopsis]
Generates a CEL User Defined Event.

[Description]
A CEL event will be immediately generated by this channel, with the supplied
name for a type.

[Syntax]
CELGenUserEvent(event-name[,extra])

[Arguments]
extra
    Extra text to be included with the event.

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор:  Николаев Дмитрий (virus (at) subnets.ru

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 1, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту