BLF (Busy Lamp Field) — в общем, это набор индикаторов на IP телефоне, которые показывают статус линии: свободно или занято.
В этой статье мы научим Asterisk правильно работать с телефонами Cisco для отображения BLF статусов.
Теория
Введём в консоли Asterisk команду:
asterisk*CLI> core show hints
-= Registered Asterisk Dial Plan Hints =-
1196@ext-local : SIP/1196 State:Ringing Watchers 3
1188@ext-local : SIP/1188 State:InUse Watchers 3
5030@ext-local : SIP/5030 State:Idle Watchers 1
Колоночка State показывает, собственно, состояние линии, Watchers — количество слушающих эту линию. При изменении состояния линии, Asterisk отправляет телефону сообщение и телефон включает индикацию. Работоспособность BLF на Asterisk можно сначала проверить на программном телефоне, например, на DrayTek SoftPhone. После добавления контактов можно наблюдать индикацию занятости линии. По-умолчанию, Asterisk отправляет такие сообщения, которые телефон Cisco прочитать не может, и, соответственно, BLF на них не работает.
Патчим исходные коды Asterisk
Скачиваем патч: issues.asterisk.org/jira/secure/attachment/32739/cisco-blf-asterisk.1.8.0.patch
При установке этого патча asterisk компилироваться не будет.
В патче присутствует небольшая опечатка, её надо исправить.
В строке 23 switch (state) исправить на switch (data->state);
в строке 40 state исправить на data->state;
в строке 60 state исправить на data;
в строке 66 state исправить на data.
Далее копируем исходники Asterisk в папку, например /usr/src/asterisk.
Кладем патч в папку channels и сразу переименовываем его, например в patch.
Выполняем команду:
patch chan_sip.c patch
На запрос “File to patch” вводим путь где расположен sip.h (обычно в include/sip/sip.h).
Если Asterisk установлен, то необходимо его удалить. Для этого останавливаем Asterisk:
service asterisk stop
Удаляем Asterisk:
yum remove asterisk
Перед установкой asterisk необходимо установить все модули для компиляции исходников, в частности gcc, gcc-c++, kernel-devel, ncurses-devel, openssl-devel, m2crypto, libssl-devel.
Далее выполняем:
./configure
make menuselect -- выбираем необходимые модули
make
make install
Запускаем:
asterisk start
На этом с Asterisk покончили.
Настройка config файлов телефона
<?xml version="1.0" encoding="UTF-8"?>
<device xsi:type="axl:XIPPhone" ctiid="94">
<fullConfig>true</fullConfig>
<deviceProtocol>SIP</deviceProtocol>
<sshUserId>cisco</sshUserId>
<sshPassword>cisco</sshPassword>
<devicePool>
<dateTimeSetting>
<dateTemplate>Y-M-D</dateTemplate>
<timeZone>Central Asia Standard Time</timeZone>
<ntps>
<ntp>
<name>PBX-IP Address</name>
<ntpMode>Unicast</ntpMode>
</ntp>
</ntps>
</dateTimeSetting>
<callManagerGroup>
<members>
<member priority="0">
<callManager>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<sipPort>5060</sipPort>
<securedSipPort>5061</securedSipPort>
</ports>
<processNodeName>PBX-IP Address</processNodeName>
</callManager> </member> </members>
</callManagerGroup>
<srstInfo>
<srstOption>Disable</srstOption>
<ipAddr1></ipAddr1> <port1>2000</port1>
<ipAddr2></ipAddr2> <port2>2000</port2>
<ipAddr3></ipAddr3> <port3>2000</port3>
<sipIpAddr1></sipIpAddr1> <sipPort1>5060</sipPort1>
<sipIpAddr2></sipIpAddr2> <sipPort2>5060</sipPort2>
<sipIpAddr3></sipIpAddr3> <sipPort3>5060</sipPort3>
<isSecure>false</isSecure>
</srstInfo>
<connectionMonitorDuration>120</connectionMonitorDuration>
</devicePool>
<sipProfile>
<sipProxies>
<backupProxy></backupProxy> <backupProxyPort></backupProxyPort>
<emergencyProxy></emergencyProxy> <emergencyProxyPort></emergencyProxyPort>
<outboundProxy></outboundProxy> <outboundProxyPort></outboundProxyPort>
<registerWithProxy>true</registerWithProxy>
</sipProxies>
<sipCallFeatures>
<cnfJoinEnabled>true</cnfJoinEnabled>
<callForwardURI>x-cisco-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>true</localCfwdEnable>
<semiAttendedTransfer>true</semiAttendedTransfer>
<anonymousCallBlock>2</anonymousCallBlock>
<callerIdBlocking>2</callerIdBlocking>
<dndControl>0</dndControl>
<remoteCcEnable>true</remoteCcEnable>
<retainForwardInformation>false</retainForwardInformation>
</sipCallFeatures>
<sipStack>
<sipInviteRetx>6</sipInviteRetx>
<sipRetx>10</sipRetx>
<timerInviteExpires>180</timerInviteExpires>
<timerRegisterExpires>3600</timerRegisterExpires>
<timerRegisterDelta>5</timerRegisterDelta>
<timerKeepAliveExpires>120</timerKeepAliveExpires>
<timerSubscribeExpires>120</timerSubscribeExpires>
<timerSubscribeDelta>5</timerSubscribeDelta>
<timerT1>500</timerT1>
<timerT2>4000</timerT2>
<maxRedirects>70</maxRedirects>
<remotePartyID>true</remotePartyID>
<userInfo>None</userInfo>
</sipStack>
<autoAnswerTimer>1</autoAnswerTimer>
<autoAnswerAltBehavior>false</autoAnswerAltBehavior>
<autoAnswerOverride>true</autoAnswerOverride>
<transferOnhookEnabled>false</transferOnhookEnabled>
<enableVad>false</enableVad>
<preferredCodec>none</preferredCodec>
<dtmfAvtPayload>101</dtmfAvtPayload>
<dtmfDbLevel>3</dtmfDbLevel>
<dtmfOutofBand>avt</dtmfOutofBand>
<kpml>3</kpml>
<alwaysUsePrimeLine>false</alwaysUsePrimeLine>
<alwaysUsePrimeLineVoiceMail>false</alwaysUsePrimeLineVoiceMail>
<phoneLabel></phoneLabel>
<stutterMsgWaiting>2</stutterMsgWaiting>
<callStats>true</callStats>
<offhookToFirstDigitTimer>15000</offhookToFirstDigitTimer>
<silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
<disableLocalSpeedDialConfig>false</disableLocalSpeedDialConfig>
<poundEndOfDial>false</poundEndOfDial>
<startMediaPort>16384</startMediaPort>
<stopMediaPort>32766</stopMediaPort>
<sipLines>
<line button="1" lineIndex="1">
<featureID>9</featureID>
<proxy>USECALLMANAGER</proxy>
<port>5060</port>
<autoAnswer> <autoAnswerEnabled>2</autoAnswerEnabled> </autoAnswer>
<callWaiting>3</callWaiting>
<sharedLine>false</sharedLine>
<messageWaitingLampPolicy>3</messageWaitingLampPolicy>
<messagesNumber></messagesNumber>
<ringSettingIdle>4</ringSettingIdle>
<ringSettingActive>5</ringSettingActive>
<forwardCallInfoDisplay>
<callerName>true</callerName>
<callerNumber>false</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
<!-- ***************************** -->
<featureLabel>LineName 5037</featureLabel>
<displayName>LineName</displayName>
<name>5037</name>
<authName>5037</authName>
<authPassword>password</authPassword>
</line>
<line button="2">
<featureID>21</featureID>
<featureLabel>Description</featureLabel>
<speedDialNumber>Directory Number</speedDialNumber>
</line>
</sipLines>
<externalNumberMask></externalNumberMask>
<!-- ***************************** -->
<voipControlPort>5060</voipControlPort>
<dscpForAudio>184</dscpForAudio>
<ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>
<dialTemplate>dialplan.xml</dialTemplate>
</sipProfile>
<commonProfile>
<phonePassword></phonePassword>
<backgroundImageAccess>true</backgroundImageAccess>
<callLogBlfEnabled>1</callLogBlfEnabled>
</commonProfile>
<vendorConfig>
<disableSpeaker>false</disableSpeaker>
<disableSpeakerAndHeadset>false</disableSpeakerAndHeadset>
<forwardingDelay>1</forwardingDelay>
<pcPort>0</pcPort>
<settingsAccess>1</settingsAccess>
<garp>0</garp>
<voiceVlanAccess>0</voiceVlanAccess>
<videoCapability>0</videoCapability>
<autoSelectLineEnable>0</autoSelectLineEnable>
<webAccess>1</webAccess>
<daysDisplayNotActive>1,7</daysDisplayNotActive>
<displayOnTime>09:00</displayOnTime>
<displayOnDuration>12:00</displayOnDuration>
<displayIdleTimeout>01:00</displayIdleTimeout>
<spanToPCPort>1</spanToPCPort>
<loggingDisplay>2</loggingDisplay>
<loadServer>10.1.96.31</loadServer>
<recordingTone>0</recordingTone>
<recordingToneLocalVolume>100</recordingToneLocalVolume>
<recordingToneRemoteVolume>50</recordingToneRemoteVolume>
<recordingToneDuration></recordingToneDuration>
<displayOnWhenIncomingCall>0</displayOnWhenIncomingCall>
<rtcp>0</rtcp>
<moreKeyReversionTimer>5</moreKeyReversionTimer>
<autoCallSelect>1</autoCallSelect>
<logServer>10.1.96.31</logServer>
<g722CodecSupport>0</g722CodecSupport>
<headsetWidebandUIControl>0</headsetWidebandUIControl>
<handsetWidebandUIControl>0</handsetWidebandUIControl>
<headsetWidebandEnable>0</headsetWidebandEnable>
<handsetWidebandEnable>0</handsetWidebandEnable>
<peerFirmwareSharing>0</peerFirmwareSharing>
<enableCdpSwPort>1</enableCdpSwPort>
<enableCdpPcPort>1</enableCdpPcPort>
</vendorConfig>
<versionStamp>1200501729-ee9247c4-1a10-481c-8fdc-612737c5aadd</versionStamp>
<deviceSecurityMode>1</deviceSecurityMode>
<idleTimeout>0</idleTimeout>
<authenticationURL></authenticationURL>
<directoryURL></directoryURL>
<idleURL></idleURL>
<informationURL></informationURL>
<messagesURL></messagesURL>
<proxyServerURL></proxyServerURL>
<servicesURL></servicesURL>
<dscpForSCCPPhoneConfig>96</dscpForSCCPPhoneConfig>
<dscpForSCCPPhoneServices>0</dscpForSCCPPhoneServices>
<dscpForCm2Dvce>96</dscpForCm2Dvce>
<transportLayerProtocol>2</transportLayerProtocol>
<singleButtonBarge>0</singleButtonBarge>
<capfAuthMode>0</capfAuthMode>
<capfList> <capf>
<phonePort>3804</phonePort>
<processNodeName>PBX-ip-address</processNodeName>
</capf> </capfList>
<certHash></certHash>
<encrConfig>false</encrConfig>
<advertiseG722Codec>1</advertiseG722Codec>
</device>
Рассмотрим основные строчки для работы BLF
<line button="2">
<featureID><b>21</b></featureID>
<featureLabel>Description</featureLabel>
<speedDialNumber>Directory Number</speedDialNumber>
</line>
featureID 21 означает, что для данного Directory Number необходимо использовать BLF.
В файле /etc/asterisk/sip_general_additional.conf добавляем или изменяем, если они есть, строчки:
allowsubscribe=yes
notifyhold=yes
callcounter=yes
notifyringing=yes
limitonpeers=yes
buggymwi=yes
Используемые устройства
Для организации BLF использовались следующие устройства:
Телефоны: Cisco 7961, 7962, FreePBX 2.0.2, Asterisk 1.8.11.
Автор: alexkoh