Затачиваем Astesrisk для работы с BLF Cisco

    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 файлов телефона


    config.file
    <?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.
    • +6
    • 19,3k
    • 4
    Поделиться публикацией

    Комментарии 4

      0
      Респект!!!
        0
        В патче присутствует небольшая опечатка, её надо исправить.
        В строке 23 switch (state) исправить на switch (data->state);
        в строке 40 state исправить на data->state;
        в строке 60 state исправить на data;
        в строке 66 state исправить на data.

        Сделали бы патч, нельзя же так.
          0
          Патчим астер патчем к патчу!
          0
          «После сборки обработать напильником» ©

          А в целом занятная статья.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

          Самое читаемое