пятница, 21 ноября 2014 г.

Заставляем работать BLF на телефоне Cisco 9951 с Elastix 2.4


Есть у нас пара телефонов Cisco 9951. А один ко всему ещё и с консолью CKEM-C. Штука это довольно дорогая и нужно было прикрутить всё это к офисной IP-АТС Elastix 2.4. И прикрутить не просто чтобы звонки проходили, но и чтобы кнопки BLF работали как надо.
Задача не из простых, но вполне решаемая. Итак, поехали.
Есть у телефонов Cisco одна особенность, которая не позволяет корректно функционировать BLF в связке с чем либо, кроме родного Cisco Call Manager. Даже родная SIP-прошивка не спасает ситуацию. Это конечно же лечится. Лечится патчем исходных кодов Asterisk, чем мы и займёмся в первую очередь.

ВАЖНОЕ ЗАМЕЧАНИЕ! Я крайне не рекомендую делать всё нижеописанное на рабочей (боевой) системе. Хотя в моём случае данная методика отлично работает на боевой системе, лучшим выбором будет предварительно проверить работоспособность данного решения и разобраться в нём, смоделировав его, например, на виртуальной машине. И не забывайте про резервные копии конфигурации Elastix перед каждым серьёзным её изменением!

Прежде всего нам нужен сам Elastix. Подробности установки я описывать здесь не стану. Просто предположим, что он уже есть и работает.
В первую очередь нам потребуется пересобрать Asterisk (в Elastix 2.4 используется ветка 1.8).
Для этого делаем следующее:

1. Останавливаем сервисы и убираем старые версии модулей для избежания конфликтов после перекомпиляции:
service asterisk stop
service dahdi stop
для 32-битных систем
mv /usr/lib/asterisk/modules/ /usr/lib/asterisk/modules_bak/
для 64-битных систем
mv /usr/lib64/asterisk/modules/ /usr/lib64/asterisk/modules_bak/

2. Ставим все необходимые зависимости:
yum -y install patch ncurses-devel libxml2-devel openssl-devel mysql-devel sqlite-devel sqlite* e2fsprogs-devel  keyutils-libs-devel krb5-devel libogg libselinux-devel libsepol-devel libxml2-devel libtiff-devel gmp php-pear php php-gd php-mysql php-pdo kernel-devel ncurses-devel audiofile-devel libogg-devel openssl-devel zlib-devel perl-DateManip sox gcc-c++ make gnutls-devel kernel-devel libxml2-devel ncurses-devel subversion doxygen texinfo curl-devel net-snmp-devel neon-devel uuid-devel libuuid-devel sqlite-devel sqlite git gsm-devel
3. Получаем и распаковываем исходники DAHDI, libpri и Asterisk:
cd /usr/src
wget http://downloads.asterisk.org/pub/telephony/dahdi-linux-complete/dahdi-linux-complete-current.tar.gz
tar xzvf dahdi-linux-complete-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/libpri/libpri-1.4-current.tar.gz
tar xzvf libpri-1.4-current.tar.gz
wget http://downloads.asterisk.org/pub/telephony/asterisk/old-releases/asterisk-1.8.31.1.tar.gz
tar xzvf asterisk-1.8.31.1.tar.gz
4. Получаем патч для работы Cisco BLF на Asterisk и применяем его:
cd asterisk-*
wget https://issues.asterisk.org/jira/secure/attachment/32739/cisco-blf-asterisk.1.8.0.patch
patch -p1 < cisco-blf-asterisk.1.8.0.patch
cd ..
5. Собираем DAHDI
cd dahdi-linux-*
make all
make install
make config
cd ..
6. Собираем libpri
cd libpri-*
make
make install
cd ..
7. Собираем Asterisk
для 32-битных систем
./configure
для 64-битных систем
./configure --libdir=/usr/lib64
выбираем необходимые модули: 
make menuconfig
Для того, чтобы после пререкомпиляции Asterisk в Elastix не пропал функционал CDR, требуется в разделе Add-ons включить модули res_config_mysqlapp_mysql и cdr_mysql
Остальное можно оставить без изменений. Для выхода из меню нажимаем Esc и S для сохранения изменений. Теперь можно собирать Asterisk
make
make install
8. Запускаем DAHDI и Asterisk
service dahdi start
service asterisk start
или
amportal restart

Всё. На этом патчинг и перекомпиляция Asterisk закончены. Теперь Asterisk умеет отсылать правильные сообщения телефонам Cisco для корректной работы BLF на них. Но это ещё не всё.
Так как Cisco 9951 работает исключительно по TCP, нам нужно включить поддержку TCP в Asterisk. Для этого открываем WEB-интерфейс Elastix и идём в PBX -> PBX Configuration -> Unembedded FreePBX -> Вкладка Tools -> Asterisk SIP Settings.
В самом низу страницы в Other SIP Settings добавляем:
tcpenable=yes
transport=tcp,udp
Сохраняем и применяем изменения.

Теперь нужно добавить несколько дополнительных параметров для экстеншена, на котором будет установлен телефон Cisco 9951 (пусть это будет номер 248). Для этого уже в командной строке редактируем конфигурационный файл:
vim /etc/asterisk/sip_custom_post.conf
и добавляем в этот файл следующее:
 [248](+)  
 mailbox=248  
 ciscounified=yes  
 dndbusy=yes  
 subscribe=215  
 subscribe=217  
 subscribe=201  
 subscribe=218  
 subscribe=209  
 subscribe=212  
 subscribe=247  
 subscribe=239  
 subscribe=208  
 subscribe=225  
 subscribe=219  
 subscribe=240  
 subscribe=295  
 subscribe=279  
 subscribe=220  
 subscribe=235  
 subscribe=250  
 subscribe=230  
 subscribe=293  
 subscribe=296  
Для чего всё это нужно:
mailbox=248 - требуется для корректной работы индикатора MWI на телефоне
ciscounified=yes - говорит Asterisk'у о том, что данному пиру при формировании уведомлений о состоянии линий следует отправлять сообщения в формате Cisco (pidf+xml).
subscribe= - указывается для каждого внутреннего номера, за которым будет "следить" наш Cisco 9951 (в моём случае телефон укомплектован 18-кнопочной консолью CKEM-C, поэтому так много подписок)

После внесения этих изменений даём в командной строке bash команду
asterisk -rx "sip reload"
и смело переходим к настройке телефона.

Конфигурация IP-телефона Cisco 9951 с консолью CKEM-C


Для того, чтобы телефон заработал, нам потребуется:

  • Работающий TFTP-сервер (есть в Elastix)
  • Работающий DHCP-сервер (желательно, но не обязательно. Уже есть в Elastix)
  • Комплект файлов с прошивкой
  • Русская локаль (по желанию)
  • Конфигурационные XML-файлы
Прошивку и локаль можно скачать со специального раздела сайта Cisco абсолютно свободно, но нужно пройти регистрацию. После регистрации будут доступны для скачивания все необходимые файлы (не требуется никаких сервисных контрактов или сертификатов).
Но для упрощения задачи я уже собрал полный комплект всего необходимого. Его можно скачать отсюда. После скачивания комплекта, распакуйте его и закиньте всё содержимое на TFTP-сервер.
Что есть в моём комплекте:
  • Прошивка SIP версии 9.4.1.9
  • Файлы русской локализации (интерфейс, g4-tones.xml)
  • Пример конфига SEP_MAC_.xml (для телефона с консолью CKEM-C)
  • Обои для рабочего стола телефона
  • Стандартные рингтоны
  • Каталог xmlservices, содержащий примеры адресной книги и других сервисов для IP-телефонов Cisco.
В приложенном примере конфига требуется заменить строку ELASTIX_IP_ADDRESS на IP-адрес вашего сервера Elastix. И конечно же нужно переименовать сам файл, заменив _MAC_ на реальный MAC-адрес вашего телефона (в верхнем регистре, без каких-либо разделителей). В конфиге включена поддержка HD-кодека G.722 (не забудьте включить его поддержку в вашем дистрибутиве Elastix).

Чтобы упростить задачу подключения телефона, нам потребуется активировать встроенный DHCP-сервер Elastix. Для этого идём в Система -> Network -> DHCP Server. Вводим там все настройки и нажимаем кнопку Enable DHCP. После выполнения этой операции, если IP-телефон находится в одной сети с сервером Elastix, он автоматически получит все сетевые настройки, включая адрес TFTP-сервера, после чего сам скачает и установит нужные файлы из вышеприведённого комплекта, полностью самостоятельно наделив себя работоспособным состоянием :)

Каталог xmlservices требуется поместить в /var/www/html, но предварительно нужно добавить его в исключения SSL, т.к. IP-телефоны Cisco не умеют работать по https. Для этого нужно отредактировать файл /etc/httpd/conf.d/elastix.conf и после RewriteEngine On добавить следующее:
RewriteCond %{HTTPS} off
    RewriteCond %{REQUEST_URI} !(/xmlservices/*)
далее сохраняем файл и перезапускаем apache
service httpd restart
В каталоге xmlservices есть приложение-информер Гисметео. не забудьте поправить код города в строке
$source = 'http://informer.gismeteo.ru/xml/_код_вашего_города_.xml';
в файле gismeteo_rus.php

Теперь вкратце опишу основные элементы XML-конфига.
Настройка часового пояса, даты/времени и формата их отображения:
<dateTimeSetting>
<dateTemplate>D.M.Y</dateTemplate>
<timeZone>Russian Standard/Daylight Time</timeZone>
<ntps>
<ntp>
<name>ELASTIX_IP_ADDRESS</name>
<ntpMode>Unicast</ntpMode>
</ntp>
</ntps>
</dateTimeSetting>
Основной параметр, в котором указывается IP-адрес сервера Elastix. В дельнейшем на него идёт ссылка через USECALLMANAGER:
<processNodeName>ELASTIX_IP_ADDRESS</processNodeName>
Ссылка на файл с прошивкой:
<loadInformation>sip9951.9-4-1-9</loadInformation>
Описание подключённого модуля консоли CKEM-C:
<addOnModules>
<addOnModule uuid="" idx="1">
<deviceType>CKEM</deviceType>
<deviceLine>36</deviceLine>
<loadInformation></loadInformation>
<phoneTemplateId></phoneTemplateId>
</addOnModule>
</addOnModules>
Описание учётной записи SIP:
<line button="1" lineIndex="1">
<featureID>9</featureID>
<featureLabel>Внутр. 248</featureLabel>
<name>248</name>
<displayName>248</displayName>
<contact></contact>
<proxy>USECALLMANAGER</proxy>
<port>5060</port>
<autoAnswer>
<autoAnswerEnabled>2</autoAnswerEnabled>
</autoAnswer>
<callWaiting>3</callWaiting>
<authName>248</authName>
<authPassword>vEry_str0ng_pAssW0rD</authPassword>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>3</messageWaitingLampPolicy>
<messageWaitingAMWI>1</messageWaitingAMWI>
<messagesNumber>*97</messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>false</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
<maxNumCalls>4</maxNumCalls>
<busyTrigger>2</busyTrigger>
</line>
Важные параметры здесь опишу подробнее:
<featureID>9</featureID> - говорит телефону, что функция данной кнопки - прямой доступ к учётной записи SIP
<featureLabel>Внутр. 248</featureLabel> - То, что будет написано на дисплее под кнопкой с учётной записью
<name>248</name> - номер экстеншена
<displayName>248</displayName>  - номер экстеншена
<authName>248</authName>  - номер экстеншена
<authPassword>vEry_str0ng_pAssW0rD</authPassword> - пароль учётной записи
<messagesNumber>*97</messagesNumber> - номер голосовой почты на сервере (будет под аппаратной кнопкой на IP-телефоне)

Описание кнопки BLF:
<line  button="4">
  <featureID>21</featureID>
    <featureLabel>Директор</featureLabel>
      <speedDialNumber>215</speedDialNumber>
        <featureOptionMask>1</featureOptionMask>
        </line>
Описание дополнительных сервисов телефона, таких как адресная книга или различные информационные сервисы:
<phoneService type="1" category="0">
    <name>Сотрудники офиса</name>
    <url>http://ELASTIX_IP_ADDRESS/xmlservices/directory_9951.xml</url>
    <vendor></vendor>
    <version></version>
</phoneService>
Глубже разобраться, что за что отвечает в XML файле конфигурации поможет вот этот ресурс, полностью посвящённый всем тонкостям работы IP-телефонов Cisco с Asterisk.

После того как файл конфигурации сформирован, перезапускаем телефон и радуемся его почти полноценной работе с Asterisk :)
Почему "почти" полноценной:

  • не все функции работают без допиливания на стороне Asterisk. Некоторые вообще будут работать только с CUCM.
  • Кнопки отображают только три состояния отслеживаемой линии "Idle", "Rinding" и "Busy". Причём в состоянии Idle нет зелёной индикации на клавише BLF. Мне это победить пока не удалось.
  • Возможно, есть ещё скрытые глюки, которые я пока не выявил.

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

Возможно, вас заинтересует и процесс настройки IP-телефона Cisco CP-7911G

12 комментариев:

  1. Спасибо за полезную информацию!

    Телефон Cisco 8861 подключил к Asterisk 11.22.0, использовал информацию с Вашей заметки и http://docs.acsdata.co.nz/asterisk-cisco/.

    Проблема - не отображается Имя звонящего абонента, только номер.
    Подключена адресная книга через , но вероятно телефон не берет информацию из нее.

    Вопрос: У Вас при входящем звонке отображается имя звонящего, если да то как Вы это реализовали?

    ОтветитьУдалить
    Ответы
    1. Благодарю за отзыв!
      Я для отображения имени звонящего ничего специально не делал на телефоне - всё идёт с астериска (Elastix).
      В консоли астериска есть информация, что CALLERID(name) передаётся на телефон?

      Удалить
    2. Используя Вашу подсказку сделал адресную книгу средствами Астериск + MySQL. Спасибо!

      1. На моем телефоне (Cisco 8861) слева и справа от экрана по 5 кнопок.
      К левой части кнопок можно привязать BLF функционал, а вот как управлять правыми не понятно. Телефон игнорирует настройку этих кнопок через SEP_MAC_.xml или я не правильно к ним обращаюсь.

      2. Любопытно можно ли выводить прогноз погоды и другие XML сервисы сразу на экран, без нажатия дополнительных кнопок.

      Удалить
    3. 1. Правые кнопки нельзя назначить как BLF/быстрый набор. Они позволяют выбирать аккаунты для совершения вызова (в случае использования нескольких аккаунтов) или работают как контекстные клавиши быстрого доступа к списку пропущенных вызовов или новым сообщениям голосовой почты.
      2. К сожалению, не могу ответить на этот вопрос, т.к. не пытался так сделать. У меня всё собрано в XML-меню под кнопкой

      Удалить
  2. Спасибо за конфиг телефона с панелью. Уже хотел его по sccp подключать. Кастати, может подскажите как реализовать - есть общий mailbox 500, в который валиться voicemail при неответе от группы операторов. Как заставить телефоны показывать наличие сообщений в этом ящике для группы телефонов? Первое что приходит в голову - прописать им линию 500 с ящиком 500, но, как мне кажется, это не кошерно...

    ОтветитьУдалить
    Ответы
    1. Линия не нужна. Я вот здесь почти про такую же ситуацию писал http://www.voip-blog.org/2015/04/freepbx.html
      См. пункты 3 и 4

      Удалить
  3. Приветствую и спасибо за статью!
    У вас на этих аппаратах под Elastix работает NTP?
    CISCO 9951 под SIP, не хочет брать время с NTP настроенный на маршрутизаторе CISCO.

    ОтветитьУдалить
  4. Спасибо за статью! Вопрос с кнопкой переадресации всех вызовов на cp-9971 - не получается настроить - есть варианты?

    ОтветитьУдалить
    Ответы
    1. В интернет находил пару вариантов как это сделать, но ни один к сожалению на этом телефоне так и не заработал. У меня эта проблема не побеждена по сей день, переадресацию делает астериск. Не очень наглядно, но хоть как-то.

      Удалить
  5. Мужики, помогите подключить 9971 к Астериску. Не понимаю где туплю... 32 телефона работают (SIP 7821, SIP 7861, SCCP 7925) А данную модель прикрутить не могу. Причем прошивка обновляется, имя, тел. подтягиваются... Но не обновляется дата и время, хотя ntp поднят. И не регистрируется в SIP SHOW PEERS...

    ОтветитьУдалить
    Ответы
    1. А что телефон в статусе пишет? По tftp логам видно, что он что-то тянет? И что за версия астериска?

      Удалить