Ранее специалистами нашей компании было проведено тестирование телефонов Digium с системой унифицированных коммуникаций Switchvox и одним из самых распространенных бесплатных дистрибутивов AsteriskNow. И вот наконец-то мы добрались до “голого” Asterisk'a.
В данном обзоре мы рассмотрим конфигурирование аппарата с помощью модуля взаимодествия телефонов Digium с Asterisk – DPMA (Digium Phone Module for Asterisk), а также настройку Smart BLF.
Всех заинтересовавшихся прошу под кат.
Итак, начнем.
Прежде всего, нужно заказать лицензию DPMA на официальном сайте производителя: store.digium.com/productview.php?product_code=804-00032
Лицензия бесплатная, но тем не менее продукт все равно требует регистрации. Буквально через несколько минут на почту приходит письмо от Digium с кодом активации. Естественно, чтобы получить лицензию нужно зарегистрироваться на сайте.
После получения лицензии необходимо скачать утилиту register:
wget http://downloads.digium.com/pub/register/x86-32/register
Далее меняем права доступа для утилиты register:
chmod 500 /root/register
И запускаем ее:
/root/register
Далее следуя подсказкам визарда выполняем все необходимые манипуляции:
Нажимаем 1, затем 11.
И, наконец, вводим ключик, присланный нам от Digium.
“Читаем” условия лицензионного соглашения, вводим необходимые данные для регистрации.
И видим в терминале надпись, что лицензия успешно записана.
Стоит отметить, что для того, чтобы лицензия успешно активировалась, сервер должен иметь выход в интернет, т.к. утилита лезет на сервера Digium для регистрации.
Переходим к следующему шагу: скачиваем модуль DPMA
# cd /root
# wget http://downloads.digium.com/pub/telephony/res_digium_phone/asterisk-11.0/x86-32/res_digium_phone-11.0_1.4.0.tar.gz
Разархивируем и копируем файл res_digium_phone.so в папку с модулями Asterisk (по умолчанию /usr/lib/asterisk/modules/):
tar xzvf res_digium_phone-11.0_1.4.0.tar.gz
# cp /root/res_digium_phone-11.0_1.4.0/res_digium_phone.so /usr/lib/asterisk/modules
Копируем файл конфигурации в папку конфигов asterisk (по умолчанию /etc/asterisk/):
cp /root/res_digium_phone-11.0_1.4.0/res_digium_phone.conf.sample /etc/asterisk/res_digium_phone.conf
Загружаем модуль:
asterisk -rx "module load res_digium_phone.so"
Подключаемся к Asterisk, проверяем валидность лицензии:
#asterisk -rvvv
*CLI> digium_phones license status
OK, Valid product license found
Лицензия DPMA привязывается к mac-адресу вашей сетевой карты, в случае ее замены, либо придется перерегистрировать модуль, либо подменять mac-адрес новой сетевой карты
Итак, переходим к настройке телефонов.
[000] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=000 qualify=yes [111] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=111 qualify=yes [222] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=222 qualify=yes [333] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=333 qualify=yes [444] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=444 qualify=yes [555] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=555 qualify=yes [666] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=666 qualify=yes [777] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=777 qualify=yes [888] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=888 qualify=yes [999] type=friend host=dynamic context=dpma_phones secret=qwaszx mailbox=999 qualify=yes
Для удобства я назвал их номерами телефонов.
[general] accept_outofcall_message = yes outofcall_message_context = dpma_message_context auth_message_requests = no callcounter=yes [dpma_phones] include=parkedcalls exten => XXX,hint,SIP/${EXTEN} exten => XXX,1,Dial(SIP/${EXTEN},20) same => n,Voicemail(${EXTEN},${IF($["{DIALSTATUS}" = "BUSY"]?b:u)}) same => n,Hangup()
[default] 000 => 1234,000 111 => 1234,111 222 => 1234,222 333 => 1234,333 444 => 1234,444 555 => 1234,555 666 => 1234,666 777 => 1234,777 888 => 1234,888 999 => 1234,999
Далее непосредственно переходим к файлу конфигурации res_digium_phone.conf.
Структура файла делится на несколько обязательных секций:
- general
- network
- phone
- line
- external_line
- application
- ringtone
- alert
- firmware
- translation
Остановимся поподробнее на каждой:
server_uuid | строка | Уникальное имя для вашего сервера. Используется приложением “Голосовая почта” для предоставления доступа к абонентским почтовым ящикам. Опционально. |
globalpin | число; например: 10101019 | Опциональный пин-код для получения телефоном конфига и прошивки |
userlist_auth | disabled, globalpin | Указывает на метод аутентификации получения контакт-листа. Два значения: либо отключено, либо авторизация по глобальному пин-коду. |
config_auth | mac, pin, globalpin, disabled | Указывает на метод получения конфига. Либо аутентификация по mac-адресу, либо по пин-коду, либо по глобальному пин-коду, либо отключена и любой телефон может забрать любой конфиг |
mdns_address | IP адресс или имя хоста | Адрес сервера, с которого DPMA будет получать конфиг через mDNS |
mdns_port | Порт, по умолчанию 5060 | Порт, на который будет стучаться DPMA |
service_name | Строка, например Digium Phones Config Server | Имя сервера |
service_discovery_enabled | yes / no | Разрешение на поиск серверов конфигурации |
file_directory | Директория, например /var/lib/asterisk/digium_phones | Папка в которой лежат xml-файлы контактов |
alias | Строка, например MyNetwork | Имя сети |
alternate_registration_address | IP адрес или имя хоста | Альтернативный адрес регистрации (если не доступен основной) |
alternate_registration_port | Порт, число, например: 5060 | Альтернативный порт регистрации (если не доступен основной) |
cidr | CIDR, например 198.51.100.1/24 | Адрес сети, маска |
file_url_prefix | URL, например: http://10.10.10.10/file_package_directory | Префикс URL, с которого телефон должен получать информацию о прошивке, логотипе, рингтоне и smart blf (обязательно! Для корректной работы необходим веб-сервер, например apache) |
network_vlan_discovery_mode | NONE, MANUAL, LLDP | Информация о vlan |
network_vlan_id | 0-4095 | Присваивает номер vlan (если есть) |
ntp_server | hostname, IP address, e.g. ntp.mycompany.com | NTP сервер |
pc_qos | Integer (0-7) | QoS для PC-порта |
pc_vlan_id | (Integer (0-4095) | Назначает vlan PC-портуS |
public_firmware_url_prefix | URL | Префикс публичного URL, с которого телефон должен получать информацию о прошивке в случае недоступности основного сервера, ведет на сервера Digium. Должен иметь вид: /VERSION/VERSION_MODEL_firmware.eff |
registration_address | IP address or Hostname | Адрес сервера регистрации |
registration_port | Port, as an Integer; e.g 5060 | Порт сервера регистрации |
rtp_dscp | Integer (0-63) | DSCP RTP |
rtp_qos | Integer (0-7) | RTP QoS |
sip_dscp | Integer (0-63) | SIP DSCP |
sip_qos | Integer (0-7) | SIP QoS |
syslog_level | debug, error, warning, information | Уровень логирования системных сообщений |
syslog_port | порт, например 514 | Порт, на который шлются системные сообщения, по умолчанию — 514. |
syslog_server | hostname, IP address, например syslog.mycompay.com | Адрес сервера, на который шлются системные сообщения |
udp_ka_interval | Время в секундах | Определяет интервал, с которым телефоны шлют keep-alive сообщения, по умолчанию – 0, никогда |
network | "network" в res_digium_phone.conf | Имя сети, заданное в предыдущей секции |
firmware | "firmware" в res_digium_phone.conf | Имя прошивки |
mac | MAC-адрес, например 0123456789ab | Mac-адрес |
pin | число, например 10101019 | Пин-код для получения конфигов |
group_pin | число, например 101010109 | Пин-код для телефонов, объединенных в группу |
line | line в res_digium_phone.conf | линия(должна быть названа также, как юзер в sip.conf) |
external_line | external_line в res_digium_phone.conf | Внешняя линия, не зарегистрированная на вашем сервере asterisk |
application | приложение | приложение |
config_file | файл, например mycustomconfig.xml | DPMA автоматически генерирует конфигурационный файл для каждого телефона исходя из линий, которые к телефону привязаны, но можно создать отдельный файл конфигурации. |
full_name | строка, например Bob Johnson | Полное имя абонента |
contact | файл, например contacts.xml | XML-файл контактов |
contacts_display_rules | файл, например mydisplayrules.xml | XML-файл из file_directory с правилами отображения контактов. |
blf_contact_group | Строка, например “office-contacts” | Группа. Обязательное поле |
blf_items | файл, например blfitems.xml | Xml-файл с настройками “поведения” кнопок быстрого набора |
contacts_max_subscriptions | число, например 40 | Максимальное кол-во регистраций телефонов, по умолчанию 40 |
timezone | Временная зона, например America/Chicago |
Временная зона |
ntp_resync | время в секундах | Интервал ntp-синхронизации |
parking_exten | extension, например, 700 | Номер парковки |
parking_transfer_type | blind / attended | Тип трансфера |
ringtone | Название рингтона | Опция, загружающая необходимые рингтоны на телефон |
active_ringtone | Alarm, Chimes, Digium, GuitarStrum, Jingle, Office2, Office, RotaryPhone, SteelDrum, Techno, Theme, Tweedle, Twinkle, Vibe или имя вашего рингтона |
Активный рингтон |
web_ui_enabled | no / yes | Доступность веб-интерфейса телефона, по умолчанию при использовании DPMA – отключена возможность зайти на телефон через веб-интерфейс f |
record_own_calls | no / yes | Опция, позволяющая записывать собственные разговоры. Во время активного разговора при включенной опции на дисплее появится кнопко “record”, по умолчанию отключена |
alert | имя | Имя сообщения-предупреждения |
blf_unused_linekeys | no / yes | Опция, позволяющая использовать кнопки линий в качестве кнопок быстрого набора |
send_to_vm | yes / no | Опция, при неактивности которой с телефона убирается кнопка “отправить в почтовый ящик” |
use_local_storage | yes / no | При использовании данной опции контакты будут храниться непосредственно в телефоне |
d40_logo_file | строка | Логотип для Digium D40, png 150x45 пикселей, 10кб |
d50_logo_file | строка | Логотип для Digium D50, png 150x45 пикселей, 10кб |
d70_logo_file | строка | Логотип для Digium D40, png 205x85 пикселей, 10кб |
ehs | auto, plantronics, jabra_iq | Определяет типа подключаемой гарнитуры |
lock_preferences | yes / no | Опция позволяет закрепить настройки за определенным телефоном |
login_password | число, например 789 | Пароль для входа в веб-интерфейс |
accept_local_calls | any, host | Позволяет принимать звонки либо с SIP-сервера, на котором телефон зарегистрирован, либо отовсюду |
display_mc_notification | yes / no | Опция, определяющая вывод на дисплей информации о пропущенных звонках |
brightness | число, 0-10 | Яркость, по умолчанию 5 |
contrast | число, 0-10 | Контрастность, по умолчанию 5 |
dim_backlight | yes, no | Затемнение экрана |
backlight_timeout | число, в секундах (0-3200) | Время до затемнения экрана |
backlight_dim_level | число (0-10) | Уровень яркости при затемненном экране |
active_locale | de_DE, en_AU, en_CA, en_GB, en_US, es_ES, es_MX, fr_BE, fr_CA, fr_FR, it_IT, nl_BE, nl_NL, pt_BR, pt_PT |
Настройки локализации |
ringer_volume | число (0-10) | Громкость звонка |
speaker_volume | число (0-10) | Громкость микрофона |
handset_volume | число (0-10) | Громкость динамик трубки |
headset_volume | число (0-10) | Громкость гарнитуры |
handset_sidetone_db | число, например -25 | Коэффициент увелечения сигнала трубки, Дб |
headset_sidetone_db | число, например -15 | Коэффициент увелечения сигнала гарнитуры, Дб |
reset_call_volume | yes / no | Если опция включена, но настройки громкости во время одного разговора не сохраняются после его завершения |
headset_answer | yes / no | Задает использовать гарнитуру или трубку |
name_format | first_last, last_first | Настройка показывания полного имени контакта |
lan_port_mode | auto, 10hd, 10fd, 100hd, 100fd, 1000fd | Режим работы LAN-порта |
pc_port_mode | auto, 10hd, 10fd, 100hd, 100fd, 1000fd, off | Режим работы PC-порта |
enable_check_sync | yes / no | Разрешение отвечать на SIP-запросы синхронизации |
exten | строка, например 1000 | Extension из файла sip.conf |
digit_map | строка | Правила набора номеров |
line_label | строка | Название линии, которой будет отображаться на телефоне |
mailbox | почтовый ящик из voicemail.conf | Почтовый ящик из voicemail.conf |
voicemail_uri | стоока, в формате sip:user@host | URI вашего почтового ящика, доступный по нажатию кнопки “Msgs” |
outboundproxy_address | Хост / IP адрес | Адрес вашего SIP-сервера |
outboundproxy_port | Порт | Порт вашего SIP-сервера |
transport | udp, tcp | Метод транспорта |
reregistration_timeout | число, в секундах | Количество секунд до перерегистрации |
registration_retry_interval | число, в секундах | Интервал в секундах между запросами на разрешение повторной регистрации |
registration_max_retries | число, в секундах | Максимальное кол-во попыток регистрации |
secret | строка, mymagicpassword | Пароль, обязателен если информация об экстеншене в ARA, а не в sip.conf |
context | Asterisk dialplan context | Контекст, обязателен если информация об экстеншене в ARA, а не в sip.conf |
callerid | caller id string, e.g. "Bob Jones" <1234> | Caller-ID, обязателен если информация об экстеншене в ARA, а не в sip.conf |
subscribecontext | Asterisk dialplan context | Контекст, если определен здесь, то перезаписывает данные о контексте, затирая данные из sip.conf |
server_address | строка, например otherpbx.othercompany.com | Адрес SIP-сервера |
server_port | число | Порт SIP-сервера |
transport | tcp or udp | Метод транспорта |
secondary_server_address | строка, например backuppbx.othercompany.com | Адрес SIP-сервера, к которому будет обращаться телефон в случае не доступности основного |
secondary_server_port | число | Порт SIP-сервера, к которому будет обращаться телефон в случае не доступности основного |
secondary_server_transport | tcp or udp | Метод транспорта |
userid | строка, например bob1234 | Username, по умолчанию = имя линии |
authname | строка, например bob1234 | SIP authorization name, если отличается от userid, поле должно быть ззаполнено |
secret | строка | пароль |
register | yes / no | регистрация |
callerid | строка | Caller ID |
Queues Application (очередь)
queue | string | Идентификатор очереди, определен в файое queues.conf |
membername | string | Имя члена очереди, по умолчанию = fullname из раздела [phone] |
location | Asterisk queue member location, e.g. Local/6002@ext-queue/n | Местоположение согласно заданному образцу |
member | yes / no | Член/не член очереди |
permission | status, overview, details | Уровень доступа юзера к очереди |
login_exten | Asterisk extension@context, e.g. *451234@ext-queue | Номер, который нужно набрать, чтобы залогиниться в очередь |
logout_exten | Asterisk extension@context, e.g. *451234@ext-queue | Номер, который нужно набрать, чтобы разлогиниться из очереди |
Status Application (приложение статуса)
status | available, dnd, away, xa, chat | Тип статуса |
substatus | string | Доп. статус |
send486 | yes / no | Если устанвлено – телефон вернет ошибку 486 Asterisk'у |
Parking Application (приложение парковки)
parkinglot | string | Имя экстеншена парковки, заданное в файле features.conf |
Voicemail Applications (приложение голосовой почты)
translation | identifier of a type=voicemail section | Задает локализацию голосвой почты |
Custom Applications (ваше собственное приложение, написанное на javascript)
name | string | имя |
filename | string | файл .zip архива с приложением, который лежит в папке определенной параметром file_url_prefix. |
autostart | yes / no | Автозагрузка при запуске телефона |
key | value | Опциональные параметры, которые могут быть переданы в приложение |
alias | string | Имя рингтона, например FancyRinger. |
filename | string | Имя вашего собственного рингтона, 16-bit 16kHz mono, не .wav, должен лежать в file_url_prefix. |
alert_info | string | Заголовок alert-сообщения, который должен ждать телефон, в случае использования данной опции |
ring_type | normal, answer, ring-answer, visual | Тип звонка |
ringtone | Alarm, Chimes, Digium, GuitarStrum, Jingle, Office2, Office, RotaryPhone, SteelDrum, Techno, Theme, Tweedle, Twinkle, Vibe, or one of the context names where type=ringtone |
рингтон |
model | D40, D50, D70 | Модель телефона |
version | version string identifier of firmware | Версия ПО, файл с расширением ”.eff” |
file | string | Имя файла ПО, лежащего в папке, определенной в file_url_prefix network |
public_firmware | yes, no | использвоание ПО на публичном сервере Digium, в случае недоступности вашего сервера |
key | строка | Устанавливает значение, которое будет заменено на заданное |
Например:
[voicemail_de_DE]
type=translation
INBOX=INBOX
Work=Arbeit
Family=Familie
Friends=Freunde
Recordings=Aufnahmen
Итак, мы разобрали все секции файла конфигурации res_digium_phone.so
Теперь разберемся со структурой xml-файла с контактами:
Телефоны Digium оснащены приложение “Контакты” с встроенным быстрым набором, blf и статусом присутствия. Приложение “Контакты” связано с приложением “Статус”, так как оба эти приложения действуют на основании информации о присутствии пользователя. Приложение “Статус” опирается только на информацию о присутствии локального пользователя, в то время как приложение “Контакты” также смотрит на статусы других пользователей (информация о которых закреплена за кнопками быстрого набора).
Контакты без статуса присутствия могут быть загружены локально в телефон владельцем этого телефонв, однако это не рекомендуется. Предпочтительно использовать сконфигурированный администратором xml-файл для унификации.
Начиная с версии DPMA 1.3 телефоны Digium поддерживают возможность переноса локально добавленных пользователем контактов на сервер Asterisk. Для активации данной возможности опция “editable” должна иметь значение 1 и контакт должен иметь уникальный идентификатор.
Хотя и можно добавить контакты на сервер с телефона, контакты, сформированные на сервере, не редактируются с телефона и не удаляются из памяти телефона. Таким образом, Digium намекает, что лучше все-таки воздержатья от возможности добавления контактов с телефона во избежании потерь телефонной книги…
Загрузка контакт-листа
Файлы контактов, которые должен загрузить телефон, определяются в модуле DPMA или в основном XML-файле провиженинга телефона.
Параметр contact
Как сказано выше, может быть задано несколько полей contact, которые являются подэлементами элемента
Параметр Rapid Dial Keys
BLF задается параметром blf_contact_group (обязательное поле, BLF-кнопкам будут присвоены значения в соответствии с порядком их объявления в XML-файле.)
Структура файла контактов
Ввиду того, что контакты и blf используют синтаксис XML, очень важно верно построить структуру контакт-листа, так как телефоны Digium не имеют встроенного валидатора XML и вы не увидите никакого сообщения об ошибке.
Базовая структура файла контактов выглядит следующим образом:
<phonebooks>
<contacts>
<contact>
<emails>
<email />
</emails>
<actions>
<action>
<headers>
<header />
</headers>
</action>
</actions>
</contact>
</contacts>
</phonebooks>
group_name | строка | Наименование группы контактов |
editable | логический | Определяет возможность изменения контатков с телефона |
id | строка | Уникальный идентификатор группы |
server_uuid | строка | Опционально. Уникальное имя сервера, к которому обращается телефон. При использовании DPMA имя должно быть таким же, как и ф конфиге res_digium_phone.conf. |
id | строка | Уникальный идентификатор контакта, используется для blf. |
prefix | строка | Префикс контакта, например: "Mr." |
first_name | строка | Имя контакта |
second_name | строка | Второе имя контакта(не актуально для России, разве что писать в данном параметре отчество) |
last_name | строка | Фамилия контакта |
suffix | строка | Суффикс контакта, например: "Jr." |
contact_type | sip, special | Тип контакта. Контакты с типом “Special” могут посылать телефону только свой статус присутствия |
organization | строка | Название организации контакта |
job_title | строка | Должность контакта |
location | строка | Местоположение контакта |
notes | строка | Доп. Сведения о контакте |
account_id | строка | Если контакт подписан на т ом же SIP-сервере, можно указать его id из sip.conf |
subscribe_to | SIP URI | SIP URI |
Не оставляйте параметры “first_name” и ”last_name” пустыми во избежание некорректного отображения контакт-листа
При использовании DPMA необходимо использовать параметр auto_hint для корректной blf-индикации в формате «auto_hint_,» например: subscribe_to=«auto_hint_1234»
В случае использования DPMA пропистывать хинты в диалплане не обязательно
Если не используется DPMA параметр subscribe_to выглядит следующим образом: subscribe_to=«sip:500@my.pbx.com»
Также необходимо прописать хинты в диалплане:
exten => 1234,hint,SIP/mypeer
exten => 1234,1,NoOp()
exten => 1234,n,Dial(SIP/mypeer,20)
В любом случае, используете вы DPMA или нет, параметр callcounter в sip.conf необходим
Секция Emails
address | строка | e-mail контакта |
label | строка | Текстовое описание e-mail контакта |
primary | логический | Определяет основной e-mail контакта |
Секция Actions
id | строка | Обязательно. Уникальный идентификатор для действия, используется для blf. Один id с зарезирвированным названием "primary" должен быть определен у каждого контакта. |
dial | строка | Опционально. Номер, который должен набрать телефон |
dial_prefix | строка | Опционально. Префикс номера, который должен подставить телефон перед набором номера |
app_id | строка | Опционально. Уникальный идентификатор для приложения (как для стандартного, так и для вашего собственного) |
label | строка | Обязательно. mandatory, Подходящий идентификатор для номера из контакт листа. Например: “Мобильный” или имя SIP-экстеншена. |
name | строка | Обязательно, название для action. |
Headers: дочерний элемент actions
key | строка | Например ,X-Digium-Call-Feature" |
value | строка | Например, feature_send_to_vm, также могут быть использованы специальные символы (Wildcard Variables) |
Wildcard Variables (специальные символы)
%_ACCOUNT_USERNAME_%
%_ACCOUNT_SERVER_%
%_ACCOUNT_PORT_%
Display Rules (правила отображения)
Начиная с версии ПО 1.4 приложение Контакты работает во взаимодействии с функцией BLF. Действия, определенные для контакта, по умолчанию, отображаются при просмотре информации о контакте.
<display_rules>
<display_rule id="1" action_id="monitor" show="0"/>
<display_rule id="2" action_id="monitor" target_status="on_the_phone" show="1"/>
<display_rule id="3" action_id="intercom" show="0"/>
<display_rule id="4" action_id="intercom" target_status="idle" show="1"/>
<display_rule id="5" action_id="dial_vm" phone_state="idle" show="0"/>
<display_rule id="6" action_id="transfer_vm" show="0"/>
<display_rule id="7" action_id="transfer_vm" phone_state="transfer" show="1"/>
</display_rules>
id | Уникальный id | Идентификатор, например 0, 1, 2 и так далее. |
action_id | Определенное действие | Например, monitor, intercom, dial_vm, transfer_vm |
phone_state | idle, hold, transfer, incoming/transfer, incoming, connected, dialing, calling, failed |
Состояние телефона для которого выполняется действие |
target_status | unknown, idle, on_hold, ringing, on_the_phone | Опционально. Статус, при котором будет выполняться действие |
show | логический | Показывать/не показывать действие при определенных статусах |
<?xml version="1.0"?>
<phonebooks>
<contacts group_name="office-contacts" editable="0" id="0">
<contact
first_name="Digium D50"
last_name="Line 1"
organization="TEST"
contact_type="sip"
account_id="000"
id="000"
subscribe_to="000"
>
<numbers>
<number dial="000" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="000" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
<contact
first_name="Digium D50"
last_name="Line 2"
organization="TEST"
contact_type="sip"
account_id="111"
id="111"
subscribe_to="111"
>
<numbers>
<number dial="111" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="111" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
<contact
first_name="Digium D50"
last_name="Line 3"
organization="TEST"
contact_type="sip"
account_id="222"
id="222"
subscribe_to="222"
>
<numbers>
<number dial="222" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="222" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
<contact
first_name="Digium D50"
last_name="Line 4"
organization="TEST"
contact_type="sip"
account_id="333"
id="333"
subscribe_to="333"
>
<numbers>
<number dial="333" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="333" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
<contact
first_name="Digium D70"
last_name="Line 1"
organization="TEST"
contact_type="sip"
account_id="444"
id="444"
subscribe_to="444"
>
<numbers>
<number dial="444" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="444" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
<contact
first_name="Digium D70"
last_name="Line 2"
organization="TEST"
contact_type="sip"
account_id="555"
id="555"
subscribe_to="555"
>
<numbers>
<number dial="555" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="555" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
<contact
first_name="Digium D70"
last_name="Line 3"
organization="TEST"
contact_type="sip"
account_id="666"
id="666"
subscribe_to="666"
>
<numbers>
<number dial="666" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="666" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
<contact
first_name="Digium D70"
last_name="Line 4"
organization="TEST"
contact_type="sip"
account_id="777"
id="777"
subscribe_to="777"
>
<numbers>
<number dial="777" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="777" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
<contact
first_name="Digium D70"
last_name="Line 5"
organization="TEST"
contact_type="sip"
account_id="888"
id="888"
subscribe_to="888"
>
<numbers>
<number dial="888" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="888" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
<contact
first_name="Linphone"
last_name=""
organization="TEST"
contact_type="sip"
account_id="999"
id="999"
subscribe_to="999"
>
<numbers>
<number dial="999" label="Extension" primary="1" />
</numbers>
<actions>
<action id="primary" dial="999" dial_prefix="" label="Extension" name="Office" />
</action>
</actions>
</contact>
</contacts>
</phonebooks>
Структура файла smart blf
Smart BLF описывает поведение клавиш быстрого набора (начиная с версии прошивки 1.4). BLF определяет позицию кнопки быстрого набора, позволяет задавать фиксированное расположение на страницах (актуально для D70), поведение кнопки быстрого набора, действия при коротком и продолжительном нажатии, а также специальный рингтон контакта. Правила поведения кнопок быстрого набора конфигурируются в отдельном xml-файле, получаемом по http.
Ввиду того, что контакты и blf используют синтаксис xml, очень важно верно построить структуру контакт-листа, так как телефоны Digium не имеют встроенного валидатора XML и вы не увидите никакого сообщения об ошибке.
Базовая структура файла blf выглядет следующим образом:
<smart_blf>
<blf_items>
<blf_item>
<behaviors>
<behavior />
</behaviors>
<indicators>
<indicator />
</indicators>
</blf_item>
</blf_items>
</smart_blf>
Более подробный пример конфига:
<smart_blf>
<blf_items>
<blf_item location="side" index="0" paging="1" contact_id="101">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="1" ringtone_id="Techno" led_color="red" led_state="fast" />
</indicators>
</blf_item>
</blf_items>
</smart_blf>
location | main, side | Определяет местоположение кнопок быстрого набора: на главной панели (клавиши линий) или на боковой панели. Для D40 возможно только значение “main” ввиду отсутствия боковой панели. Для D70 возможно использования одинаковых индексов, которые будут отображаться на разных страницах панели. Если расположение “main”, то index начинается с 1, т.к. 0 по умолчанию используется для основной линии. |
index | целочисленный | Положение кнопки быстрого набора, начиная с “0” |
paging | Логический, 0, 1 | По умолчанию 1. Если 0, то на разных страницах книги будет статично отображаться один и тот же номер. |
contact_id | строка | Соответствующее значение из файла контактов параметра "id" |
app_id | строка | Либо название стандартного приложения (contacts, voicemail, parking, status, queues) либо идентификатор вашего собственного загруженного в телефон приложения. Используется вместо contact_id, если на кнопку быстрого набора настроен вызов приложения. |
blank | логический, 0,1 | Позволяет оставить кнопку быстрого набора не настроенной и перейти к конфигурации следующей |
Behaviors: дочерний элемент blf_item
phone_state | Состояние телефона, соответствующе состоянию из секции phone state | Определяет состояние телефона |
target_status | unknown, idle, on_hold, ringing, on_the_phone | Определяет статус телефона |
press_action | id действия | Определяет id действия по нажатию кнопки. |
press_function | dial, info, show_app, transfer, send_dtmf, none | Определяет действие по нажатию кнопки |
long_press_action | An action id from the loaded contacts file | Определяет id действия по нажатию кнопки, длящемся более 2 секунд |
long_press_function | dial, info, show_app, transfer, send_dtmf, none | Определяет действие по нажатию кнопки, длящемся более 2 секунд |
idle | Никаких звонков в данный момент с телефона не производится |
hold | Звонок на удержании |
hold/transfer | Звонок на удержании и телефон в состоянии трансфера, например пользователь ответил на звонок, а затем нажал кнопку “Transfer“ или нажал “Hold” вслед за “Transfer”. |
hold/preconference | Звонок на удержании, пользователь нажал клавишу конференции |
hold/conference | Телефон в режиме конференции, пользователь нажал клавишу удержания вызова |
incoming | На телефон поступил вызов, звонок находится в активном поле, но звонок еще не отвечен. |
incoming/transfer | На телефон поступил входящий вызов, пользователь нажал, пользователь нажал кнопку “transfer” перед тем, как ответить на вызов |
connected | Ведется разговор, никаких действий более не совершается |
connected/conference | Ведется разговор в конференции |
calling | Совершается исходящий вызов, на том конце еще не подняли трубку |
dial | Снята трубка, пользователь собирается ввести номер, но еще ни одной цифры не было набрано |
dialing | Снята трубка, пользователь набирает цифры |
failed | Телефон получил ответ от сервера, что звонок невозможен из-за ошибок |
all | Любое состояние |
Indicators: дочерний элемент blf_item
target_status | unknown, idle, on_hold, ringing, on_the_phone | Статус наблюдаемого телефона |
ring | Логический | Если “true”, то при совпадении заданых условий ваш телефон будет звонить |
ringtone_id | Alarm, Chimes, Digium, GuitarStrum, Jingle, Office2, Office, RotaryPhone, SteelDrum, Techno, Theme, Tweedle, Twinkle, Vibe, or one of ids from a custom-loaded ringtone |
Рингтон |
led_color | amber, green, red | Определяет цвет диода на кнопке быстрого набора |
led_state | off, on, slow, fast | Определяет поведение диода на кнопке быстрого набора (выключен, включен, медленно/быстро мигает) |
<?xml version="1.0"?>
<config>
<smart_blf>
<blf_items>
<blf_item location="side" index="0" paging="1" contact_id="000">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
<blf_item location="side" index="1" paging="1" contact_id="111">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
<blf_item location="side" index="2" paging="1" contact_id="222">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
<blf_item location="side" index="3" paging="1" contact_id="333">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
<blf_item location="side" index="4" paging="1" contact_id="444">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
<blf_item location="side" index="5" paging="1" contact_id="555">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
<blf_item location="side" index="6" paging="1" contact_id="666">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
<blf_item location="side" index="7" paging="1" contact_id="777">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
<blf_item location="side" index="8" paging="1" contact_id="888">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
<blf_item location="side" index="9" paging="1" contact_id="999">
<behaviors>
<behavior phone_state="idle" target_status="on_the_phone" press_action="call_vm" press_function="dial" />
<behavior phone_state="idle" target_status="idle" press_action="regular_dial" press_function="dial" />
<behavior phone_state="idle" target_status="idle" long_press_action="anintercom" long_press_function="dial" />
</behaviors>
<indicators>
<indicator target_status="idle" ring="0" ringtone_id="Digium" led_color="green" led_state="on" />
<indicator target_status="ringing" ring="0" ringtone_id="Techno" led_color="red" led_state="fast" />
<indicator target_status="on_the_phone" ring="0" ringtone_id="Techno" led_color="red" led_state="on" />
</indicators>
</blf_item>
</blf_items>
</smart_blf>
</config>
Подробное описание всех опций и правила построения xml-файлов с контактами и smart blf можно найти на wiki asterisk.
Как было описано выше, файлы с поведением кнопок быстрого набора загружаются по http.
Я выбрал для этих целей apache2.
Тестирование проводилось на Centos 6.3. Пример установки:
yum install httpd
Заходим в файл конфигурации:
vim /etc/httpd/conf/httpd.conf
Ставим в параметре “ServerName” ip-адрес или доменное имя сервера, с которого телефон будет получать конфиги. В моем случае: ServerName 192.168.1.253
(не забываем снять коммент в начале строки).
Чтобы проверить, есть ли запросы от Digium-телефонов на получение Xml-файлов воспользуемся командой:
tail -f /var/log/httpd/*
Если телефон обращается за конфигом к apache, то в консоли мы увидим что-то типа:
192.168.1.143 - - [29/Jan/2014:18:39:15 +0400] "GET /blf_test.xml HTTP/1.1" 200 8564 "-" "Digium-D50/1_4_0_0_57389"
192.168.1.140 - - [29/Jan/2014:18:39:37 +0400] "GET /blf_test.xml HTTP/1.1" 200 8564 "-" "Digium-D70/1_4_0_0_57389"
Если все корректно настроено, то после перезагрузки ядра Asterisk ваш Digium-телефон приветливо заморгает зелеными и красными диодами:)
А ребята из Digium для того, чтобы разнообразить серые будни иногда делают такие вещи:)
Резюмируя все выше написанное, хотелось бы отметить, что первоначальная настройка может показаться довольно сложной, однако если у админа парк из 20 и более телефонов, то такой вариант провиженинга значительно облегчит работу по настройке телефонов. Богатый выбор опций, гибкая кастомизация, использование стандартных сервисов для автоматической настройки, плотная интеграция с asterisk и основанными на нем дистрибутивами делают телефоны Digium, на наш взгляд, лучшим решением на рынке IP-телефонии и унифицированных коммуникаций.
Автор: j3st3r