VoIP зоопарк — Provisioning

Вступление

Однажды руководство одобрило эксперимент по внедрению IP телефонии в нашей конторе. Так как мой опыт в данной области был мизерным, задача пробудила во мне огромный интерес и я погрузился в изучение различных аспектов вопроса. По окончании погружения решил поделиться приобретенными знаниями — в надежде, что кому-то они пригодятся. Итак…

Исходные данные

В качестве IP-АТС выбран и развернут Asterisk. Парк телефонов состоит из аппаратов Cisco 7906g, Panasonic UT-KX123B, Grandstream GXP1400 и Dlink DPH-150S(E)/F3, Yealink T19 и T21. Такой разброс обусловлен тем, что в рамках эксперимента было принято решение попробовать всего понемногу, чтобы составить своё мнение о соотношении цена/качество/удобство.

Задача

Максимально упростить и унифицировать процесс настройки новых аппаратов. Все телефоны должны быть синхронизированы по времени, иметь телефонную книгу, подгружаемую с сервера и предоставлять доступ к настройкам для администратора.

Решение этой задачи простое — реализовать автоматическую настройку телефонов, т.н. Provisioning. Собственно, о моей реализации этой замечательной функции и пойдет речь.

Настройка tftpd,dhcpd

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

Специфической настройки для tftp не потребовалось. Установил штатный tftpd и разместил все необходимые файлы в его корневой директории.
Файлы с настройками разместил по каталогам в соответствии с производителем телефона. Правда, аппарат от Cisco так и не полез в свою папку, пришлось хранить в корне.

Для того, чтобы указать телефонам местонахождение tftp-сервера, я воспользовался option-66. Кроме того, разделил их на отдельные классы по производителю. Каждый класс получил собственный сегмент адресов и индивидуальную папку для конфигурационных файлов. К слову, аппараты от D-link пришлось вычислять по MAC-адресам, так как информацию о производителе в dhcp-запросе они не предоставляют.

Фрагмент dhcpd.conf

# Указываем необходимые опции 
option option-66 code 66 = text;

class "panasonic" {
	match if substring (option vendor-class-identifier,0,9) = "Panasonic";
	option option-66 "10.1.1.50/panasonic/";
}
class "cisco" {
	match if substring (option vendor-class-identifier,0,36) = "Cisco Systems, Inc. IP Phone CP-7906";
	option option-66 "10.1.1.50/cisco/";
}

class "grandstream" {
 match if substring (option vendor-class-identifier,0,11) = "Grandstream";
 option option-66 "10.1.1.50/grandstream/";
}

class "dlink" {
	match if (binary-to-ascii (16,8,":",substring(hardware,1,4)) = "c8:d3:a3:8d") or
	(binary-to-ascii (16,8,":",substring(hardware,1,4)) = "90:94:e4:72");
	option option-66 "10.1.1.50/dlink/";
}

class "yealink" {
                match if substring (option vendor-class-identifier,0,7) = "Yealink";
                option option-66 "10.1.1.50/yealink/";
        }

Телефоны пришлось принудительно исключать из общего пула. Иначе они никак не хотели уходить в свой «лягушатник».
Пример настроек подсети

subnet 10.1.1.0 netmask 255.255.255.0 {
        option routers 10.1.1.1;
        pool {
                deny members of "cisco";
                deny members of "panasonic";
                deny members of "dlink";
                range 10.1.1.230 10.1.1.240;
        }
        pool {
                allow members of "cisco";
                range 10.1.1.65 10.1.1.69;
        }
        pool {
                allow members of "panasonic";
                range 10.1.1.60 10.1.1.64;
        }
        pool {
                allow members of "dlink";
                range 10.1.1.55 10.1.1.59;
        }
}

После перезапуска всех вовлеченных служб телефоны уверенно направились за настройками на положенный им tftp-сервер. Осталось только их там разместить.

Cisco 7906

Эти аппараты достались мне в заводской упаковке. Пришлось перешивать, чтобы подружить с asterisk’ом. Но это отдельная история. В конкретном случае для настройки аппарата я, согласно инструкции, создал в корне tftp-сервера файл SEPAABBCCDDEEFF.cnf.xml. Где AABBCCDDEEFF — MAC-адрес аппарата.

Про настройку телефонов от Cisco было написано уже не раз, поэтому я просто оставлю рабочий файл с настройками.
Настройки для cisco

<?xml version="1.0" encoding="UTF-8"?>
<device xsi_type="axl:XIPPhone" ctiid="94">
<fullConfig>true</fullConfig>
<deviceProtocol>SIP</deviceProtocol>
<sshUserId>root</sshUserId>
<sshPassword>ADMIN_PWD</sshPassword>
<devicePool>
<dateTimeSetting>
<dateTemplate>D-M-Y</dateTemplate>
<timeZone>Central Pacific Standard Time</timeZone>
<ntps>
<ntp>
<name>10.1.1.4</name>
<ntpMode>Unicast</ntpMode>
</ntp>
</ntps>
</dateTimeSetting>
<callManagerGroup>
<members> <member priority="0"> <callManager>
<name>10.1.1.50</name>
<ports>
<ethernetPhonePort>2000</ethernetPhonePort>
<sipPort>5060</sipPort>
<securedSipPort>5061</securedSipPort>
</ports>
<processNodeName>10.1.1.50</processNodeName>
</callManager> </member> </members>
</callManagerGroup>
<srstInfo>
<srstOption>Disable</srstOption>
</srstInfo>
<connectionMonitorDuration>120</connectionMonitorDuration>
</devicePool>
<sipProfile>
<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>Cisco Phone</phoneLabel>
<stutterMsgWaiting>2</stutterMsgWaiting>
<callStats>false</callStats>
<offhookToFirstDigitTimer>15000</offhookToFirstDigitTimer>
<silentPeriodBetweenCallWaitingBursts>10</silentPeriodBetweenCallWaitingBursts>
<disableLocalSpeedDialConfig>true</disableLocalSpeedDialConfig>
<poundEndOfDial>false</poundEndOfDial>
<startMediaPort>16384</startMediaPort>
<stopMediaPort>32766</stopMediaPort>
<sipLines>
<line button="1" lineIndex="1">
<featureID>9</featureID>
<proxy>10.1.1.50</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>true</callerNumber>
<redirectedNumber>false</redirectedNumber>
<dialedNumber>true</dialedNumber>
</forwardCallInfoDisplay>
<featureLabel></featureLabel>
<displayName>User #103</displayName>
<name>103</name>
<authName>103</authName>
<authPassword>SIP_PWD</authPassword>
</line>
</sipLines>
<externalNumberMask>$num</externalNumberMask>
<voipControlPort>5060</voipControlPort>
<dscpForAudio>184</dscpForAudio>
<ringSettingBusyStationPolicy>0</ringSettingBusyStationPolicy>
<dialTemplate>dialplan.xml</dialTemplate>
</sipProfile>
<commonProfile>
<phonePassword>*0#</phonePassword>
<backgroundImageAccess>true</backgroundImageAccess>
<callLogBlfEnabled>2</callLogBlfEnabled>
</commonProfile>
<loadInformation></loadInformation>
<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>1</autoSelectLineEnable>
<webAccess>0</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.1.50</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.1.50</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>1143565489-a3cbf294-7526-4c29-8791-c4fce4ce4c37</versionStamp>
<userLocale>
<name>Russian_Russian_Federation</name>
<langCode>ru_RU</langCode>
<version></version>
<winCharSet>utf-8</winCharSet>
</userLocale>
<networkLocale></networkLocale>
<networkLocaleInfo>
<name></name>
<version></version>
</networkLocaleInfo>
<deviceSecurityMode>1</deviceSecurityMode>
<idleTimeout>0</idleTimeout>
<authenticationURL></authenticationURL>
<directoryURL>http://10.1.1.50/provisioning/cisco-services.xml</directoryURL>
<idleURL></idleURL>
<informationURL></informationURL>
<messagesURL></messagesURL>
<proxyServerURL></proxyServerURL>
<servicesURL>http://10.1.1.50/provisioning/cisco-services.xml</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>10.1.1.50</processNodeName> -->
</capf> </capfList>
<certHash></certHash>
<encrConfig>false</encrConfig>
<advertiseG722Codec>1</advertiseG722Codec>
</device>

D-Link DPH-150S/F3

Если вам только предстоит приобрести телефон этой серии, будьте внимательны, автонастройка поддерживается только в аппаратах 150S/F3. На аппарате 150S/F2, попавшем мне в руки, такого функционала не обнаружил.

Конфигурационный файл может быть как в формате xml, так и обычном текстовом. Для xml есть одно требование: тэг должен быть в начале строки, иначе парсер его проигнорирует и значение соответствующего параметра не изменится.

Для настройки телефона используются два файла. f0D00580000.cfg — для хранения настроек всех телефонов и 00112233aabb.cfg (MAC-адрес в нижнем регистре) для индивидуальных настроек. Индивидуальные настройки, естественно, имеют больший приоритет.

Полный набор настроек насчитывает более тысячи строк, чтобы не загромождать статью, опишу минимальный достаточный набор настроек.

Обязательными являются корневой узел VOIP_CONFIG_FILE и вложенный в него узел version. Настройки будут применены только если версия файла будет выше, чем у текущих настроек в аппарате. Узнать это значение можно через .web-интерфейс телефона в разделе maintenance (системное управление). Для телефонов с заводскими настройками в обоих случаях это 2.0002. Кроме того, версия индивидуального файла должна быть больше версии общего файла.

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

В двух блоках, приведённых ниже, устанавливаются параметры временной зоны и синхронизации времени, начальный порт для RTP и включается сетевой мост между WAN и LAN разъемами аппарата.

Фрагмент№1

<GLOBAL_CONFIG_MODULE>
<WAN_Mode>DHCP</WAN_Mode>
<Default_Protocol>2</Default_Protocol>
<Enable_DHCP>1</Enable_DHCP>
<DHCP_Auto_DNS>1</DHCP_Auto_DNS>
<DHCP_Auto_Time>0</DHCP_Auto_Time>
<Host_Name>VOIP</Host_Name>
<RTP_Initial_Port>10000</RTP_Initial_Port>
<RTP_Port_Quantity>200</RTP_Port_Quantity>
<SNTP_Server>10.1.1.4</SNTP_Server>
<Enable_SNTP>1</Enable_SNTP>
<Time_Zone>71</Time_Zone>
<Time_Zone_Name>UCT_011</Time_Zone_Name>
<Enable_DST>0</Enable_DST>
<SNTP_Timeout>60</SNTP_Timeout>
<Default_UI>12</Default_UI>
<MTU_Length>1500</MTU_Length>
</GLOBAL_CONFIG_MODULE>
<LAN_CONFIG_MODULE>
<Enable_Bridge_Mode>1</Enable_Bridge_Mode>
<Enable_Port_Mirror>1</Enable_Port_Mirror>
</LAN_CONFIG_MODULE>

Собственно названия параметров конфигурации достаточно «говорящие», чтобы не описывать их подробно.
SIP для одной линии

<SIP_CONFIG_MODULE>
<SIP__Port>5060</SIP__Port>
<SIP_Line_List>
<SIP_Line_List_Entry>
<ID>SIP1</ID>
<Register_Addr>10.1.1.50</Register_Addr>
<Register_Port>5060</Register_Port>
<Register_TTL>3600</Register_TTL>
<Enable_Reg>1</Enable_Reg>
<Proxy_Addr>10.1.1.50</Proxy_Addr>
<DTMF_Mode>1</DTMF_Mode>
<DTMF_Info_Mode>0</DTMF_Info_Mode>
<VoiceCodecMap>G711A,G711U,G722</VoiceCodecMap>
</SIP_Line_List_Entry>
</SIP_Line_List>
</SIP_CONFIG_MODULE>

Настройки удаленного управления

<MMI_CONFIG_MODULE>
<Telnet_Port>23</Telnet_Port>
<Web_Port>80</Web_Port>
<Web_Server_Type>0</Web_Server_Type>
<Https_Web_Port>443</Https_Web_Port>
<Remote_Control>1</Remote_Control>
<Enable_MMI_Filter>0</Enable_MMI_Filter>
<Telnet_Prompt></Telnet_Prompt>
<MMI_Filter>
<MMI_Filter_Entry>
<ID>Item1</ID>
<First_IP>10.1.1.152</First_IP>
<End_IP>10.1.1.160</End_IP>
</MMI_Filter_Entry>
</MMI_Filter>
<MMI_Account>
<MMI_Account_Entry>
<ID>Account1</ID>
<Name>admin</Name>
<Password>ADMIN_PWD</Password>
<Level>10</Level>
</MMI_Account_Entry>
<MMI_Account_Entry>
<ID>Account2</ID>
<Name>guest</Name>
<Password>GUEST_PWD</Password>
<Level>5</Level>
</MMI_Account_Entry>
</MMI_Account>
</MMI_CONFIG_MODULE>

Настройки телефона

<PHONE_CONFIG_MODULE>
<Menu_Password>123</Menu_Password>
<KeyLock_Password>123</KeyLock_Password>
<Fast_Keylock_Code></Fast_Keylock_Code>
<Enable_KeyLock>0</Enable_KeyLock>
<Emergency_Call>112</Emergency_Call>
<LCD_Title>Company</LCD_Title>
<LCD_Constrast>5</LCD_Constrast>
<LCD_Luminance>1</LCD_Luminance>
<Backlight_Off_Time>30</Backlight_Off_Time>
<Enable_Power_LED>0</Enable_Power_LED>
<Time_Display_Style>0</Time_Display_Style>
<Enable_TimeDisplay>1</Enable_TimeDisplay>
<Alarm__Clock>0,,1</Alarm__Clock>
<Date_Display_Style>0</Date_Display_Style>
<Date_Separator>0</Date_Separator>
<Enable_Pre-Dial>1</Enable_Pre-Dial>
<Xml_PhoneBook>
<Xml_PhoneBook_Entry>
<ID>XML-PBook1</ID>
<Name>Phonebook</Name>
<Addr>http://10.1.1.50/provisioning/dlink-phonebook.xml</Addr>
<Auth>:</Auth>
<Policy>0</Policy>
<Sipline>0</Sipline>
</Xml_PhoneBook_Entry>
</Xml_PhoneBook>
<Phonebook_Groups>friend,home,work,business,classmate,colleague</Phonebook_Groups>
</PHONE_CONFIG_MODULE>

Все остальные настройки останутся «по умолчанию». Теперь любой телефон Dlink, подключённый к сети, сразу примет общий для всех набор параметров. Чтобы задать индивидуальные параметры для аппарата нужен отдельный файл. В нем нужно только указать необходимые настройки для отдельного абонента.
настройки абонента

<?xml version="1.0" encoding="UTF-8"?>
<VOIP_CONFIG_FILE>
<version>2.0006</version>
<SIP_CONFIG_MODULE>
<SIP_Line_List>
<SIP_Line_List_Entry>
<ID>SIP1</ID>
<Display_Name>User #117</Display_Name>
<Phone_Number>117</Phone_Number>
<Register_Port>5060</Register_Port>
<Register_User>117</Register_User>
<Register_Pswd>SIP_PWD</Register_Pswd>
<Register_TTL>3600</Register_TTL>
<Enable_Reg>1</Enable_Reg>
<Proxy_Port>5060</Proxy_Port>
<Proxy_User>117</Proxy_User>
<Proxy_Pswd>SIP_PWD</Proxy_Pswd>
</SIP_Line_List_Entry>
</SIP_Line_List>
</SIP_CONFIG_MODULE>
</VOIP_CONFIG_FILE>

Panasonic UT-KX123B

Эти аппараты получают настройки по несколько иной схеме. Конфигурация хранится в текстовых файлах. Максимальный размер конфигурационного файла составляет 120 КБ. Независимо от количества файлов общий их размер не должен превышать 120 КБ.
Конфигурационный файл состоит из набора строк, на которые накладываются указанные ниже условия:

  • Первой всегда идет строка комментария, включающая следующую последовательность символов (44 байт):
    # Panasonic SIP Phone Standard Format File #
    Шестнадцатеричное представление данной последовательности:
    23 20 50 61 6E 61 73 6F 6E 69 63 20 53 49 50 20 50 68 6F 6E 65 20 53 74 61 6E 64 61 72 64 20 46 6F 72 6D 61 74 20 46 69 6C 65 20 23
    Для предотвращения случайного изменения установленной последовательности символов рекомендуется начинать конфигурационный файл со строки:
    # Panasonic SIP Phone Standard Format File # DO NOT CHANGE THIS LINE!
  • Конфигурационные файлы должны заканчиваться пустой строкой.
  • Каждая строка должна заканчиваться последовательностью "<CR><LF>".
  • Максимальная длина строки составляет 537 байт, включая последовательность "<CR><LF>"
  • Следующие строки игнорируются:
    • строки, превышающие ограничение в 537 байт;
    • пустые строки;
    • строки комментариев, начинающиеся символом "#";
  • Строка каждого параметра записывается в форме XXX=«yyy» (XXX: название параметра, yyy: его значение). Значение должно заключаться в двойные кавычки.
  • Разбиение строки параметров на несколько строк не допускается. Это приведет к ошибке обработки конфигурационного файла и в результате — к сбою инициализации.
  • Значения некоторых параметров необходимо указывать отдельно для каждой линии. Параметр с суффиксом "_1" в названии является параметром для линии 1; "_2"— для линии 2 и т.д.
  • Максимальная длина названия параметра составляет 32 символа.
  • Максимальная длина значения параметра составляет 500 символов за исключением символов двойных кавычек.
  • Пробелы в строке не допускаются за исключением случаев, когда значение включает символ пробела.
  • Значения некоторых параметров можно указывать «пустыми», чтобы установить пустое значение параметра.
  • Параметры указываются без определенного порядка.
  • Если один и тот же параметр указывается в конфигурационном файле более одного раза, применяется значение, указанное первым.

Такой серьёзный набор требований к конфигурационному файлу меня, откровенно говоря, огорчил. На мой взгляд, реализация взаимодействия с сервером управления у телефонов Panasonic сделана чрезвычайно неудобно. По этому параметру телефон значительно уступает остальным.
При первом включении аппарата (или после сброса на заводские настройки) он пытается загрузить так называемый файл продукта (в данном случае это KX-UT123RU.cfg), в котором должны содержаться пути к остальным файлам конфигурации.
Файл продукта# Panasonic SIP Phone Standard Format File # DO NOT CHANGE THIS LINE!

CFG_STANDARD_FILE_PATH=«tftp://10.1.1.50/panasonic/{mac}.cfg»
CFG_PRODUCT_FILE_PATH=«tftp://10.1.1.50/panasonic/KX-UT123RU.cfg»
CFG_MASTER_FILE_PATH=«tftp://10.1.1.50/panasonic/master.cfg»

После этого телефон выведет на экран сообщение об успешном завершении подготовки и будет ожидать, пока его не перезагрузят. А уже после перезагрузки он начнет обрабатывать положенные ему конфигурационные файлы.

В файле master.cfg рекомендуется указывать общие настройки для всех телефонов. Как и в случае с Dlink, я укажу только некоторые параметры. Имена остальных параметров и их значения можно найти в документации на сайте производителя.
master.cfg############################################################
# System Settings #
############################################################
## Login Account Settings
ADMIN_ID=«admin»
ADMIN_PASS=«ADMIN_PWD»
USER_ID=«user»
USER_PASS=«USER_PWD»

## System Time Settings
NTP_ADDR=«10.1.1.4»
TIME_ZONE=«660»
DST_ENABLE=«N»
DST_OFFSET=«60»
DST_START_MONTH=«3»
DST_START_ORDINAL_DAY=«2»
DST_START_DAY_OF_WEEK=«0»
DST_START_TIME=«120»
DST_STOP_MONTH=«10»
DST_STOP_ORDINAL_DAY=«2»
DST_STOP_DAY_OF_WEEK=«0»
DST_STOP_TIME=«120»
LOCAL_TIME_ZONE_POSIX=""

## Syslog Settings
SYSLOG_ADDR=«10.1.1.50»
SYSLOG_PORT=«514»
SYSLOG_EVENT_SIP=«6»
SYSLOG_EVENT_CFG=«6»
SYSLOG_EVENT_VOIP=«6»
SYSLOG_EVENT_TEL=«6»

## Provisioning Settings
OPTION66_ENABLE=«Y»
OPTION66_REBOOT=«N»
PROVISION_ENABLE=«Y»
CFG_STANDARD_FILE_PATH=«tftp://10.1.1.50/panasonic/{mac}.cfg»
CFG_PRODUCT_FILE_PATH=«tftp://10.1.1.50/panasonic/KX-UT123RU.cfg»
CFG_MASTER_FILE_PATH=«tftp://10.1.1.50/panasonic/master.cfg»

############################################################
# Network Settings #
############################################################
## IP Settings
CONNECTION_TYPE=«1»
HOST_NAME=«UT123»
DHCP_DNS_ENABLE=«Y»
STATIC_IP_ADDRESS=""
STATIC_SUBNET=""
STATIC_GATEWAY=""
USER_DNS1_ADDR=""
USER_DNS2_ADDR=""

## DNS Settings
DNS_QRY_PRLL=«Y»
DNS_PRIORITY=«N»
DNS1_ADDR=«10.1.1.1»
DNS2_ADDR=""

## HTTP Settings
HTTPD_PORTOPEN_AUTO=«Y»
HTTP_VER=«1»
HTTP_USER_AGENT=«Panasonic_{MODEL}/{fwver} ({mac})»
HTTP_SSL_VERIFY=«0»
CFG_ROOT_CERTIFICATE_PATH=""

## XML Application Settings
XML_HTTPD_PORT=«6666»
XMLAPP_ENABLE=«Y»
XMLAPP_USERID=""
XMLAPP_USERPASS=""
XMLAPP_START_URL=""
XMLAPP_INITIAL_URL=" "
XMLAPP_INCOMING_URL=""
XMLAPP_TALKING_URL=""
XMLAPP_MAKECALL_URL=""
XMLAPP_CALLLOG_URL=""
XMLAPP_IDLING_URL=""
XMLAPP_LDAP_URL=«10.1.1.50/provisioning/panasonic-phonebook.xml»
XMLAPP_LDAP_USERID=""
XMLAPP_LDAP_USERPASS=""

В индивидуальном конфигурационном файле устройства, по традиции, остаются только настройки абонента.
aabbccddeeff.cfgDISPLAY_NAME_1=«User #168»

PHONE_NUMBER_1=«168»
SIP_URI_1=«168»
LINE_ENABLE_1=«Enabled»
PROFILE_ENABLE_1=«Enabled»
SIP_AUTHID_1=«168»
SIP_PASS_1=«SIP_PWD»

Grandstream GXP-1400

Параметры этих телефонов хранятся в одном xml-файле с именем cfg{mac}.xml. Либо в обычном текстовом с именем cfg{mac}. Этот телефон запрашивает только индивидуальный конфигурационный файл, так что оптимизировать настройки путем выноса их в общий файл не выйдет. Еще одна особенность настройки Grandstream’ов это именование параметров. Все они пронумерованы и обозначаются как P###. Например:

P1650 – отвечает за веб-интерфейс для управления телефоном (0 – HTTPS, 1 – HTTP)
P47 – адрес SIP сервера для подключения.

Если конфигурация хранится в текстовом файле, параметры не требуют никакой группировки и идут в любом порядке. Строки, начинающиеся с #, рассматриваются как комментарии.

В случае, если настройки представлены в формате xml, они должны быть вложены в узел <config version=”1”>, который в свою очередь должен быть вложен в <gs_provision version=«1»>. Все параметры записываются в виде соответствующих тегов со значением параметра внутри.
Пример настройки

<?xml version="1.0" encoding="UTF-8" ?>
<gs_provision version="1">
<config version="1">
<P271>1</P271>
<!-- Account Name. Cannot be empty. -->
<P270>109</P270>
<!-- SIP User ID -->
<P35>109</P35>
<!-- Authenticate ID -->
<P36>109</P36>
<!-- Authenticate password -->
<P34>SIP_PWD</P34>
<!-- Display Name (John Doe) -->
<P3>User# 109</P3>
<!-- Common settings -->
<P207>10.1.1.50</P207>
<P208>2</P208>
<P47>10.1.1.50</P47><!-- line 1 sip server -->
<P401>0</P401><!-- Line 2 disable -->
<P2>ADMIN_PWD</P2><!-- admin password -->
<P196>USER_PWD</P196><!-- user web console pwd -->
<P1362>ru</P1362><!-- display lang -->
<P212>0</P212><!-- Upgrade from TFTP -->
<P192>10.1.1.50/grandstream</P192>
<P1357>1</P1357><!-- lock configuration via phone (basic only)-->
<P64>TZc-11</P64><!-- timezone -->
<P30>10.1.1.4</P30><!-- NTP-server -->
<P330>1</P330><!-- Download PB from HTTP -->
<P331>http://10.1.1.50/provisioning/grandstream</P331><!-- phonebook base url -->
<P333>30</P333><!-- Auto update PB in 30 min -->
</config>
</gs_provision>

Yealink T19 и T21

Аппараты этих моделей поддерживают индивидуальные конфигурационные файлы для устройств и общие для моделей. В моём случае, мне пришлось общие параметры разместить в файлах y000000000031.cfg и y000000000034.cfg соответственно. Индивидуальные конфигурационные файлы именуются в соответствии с MAC-адресом: 00112233aabb.cfg.

Настройки для yealink’ов хранятся в текстовом формате. Из обязательных требований только наличие в первой строке версии файла, в формате #!version:1.0.0.1.

Все параметры записываются в виде параметр = значение. Комментарии должны начинаться с символа "#". Имена параметров и их значения можно найти в документации на сайте производителя.
общие настройки#!version:1.0.0.1
#Configure the WAN port type; 0-DHCP (default), 1-PPPoE, 2-Static IP Address;
network.internet_port.type = 0
#Configure the PC port type; 0-Router, 1-Bridge (default);
network.bridge_mode = 1
#Configure the access type of the web server; 0-Disabled, 1-HTTP & HTTPS(default), 2-HTTP Only, 3-HTTPS Only;
network.web_server_type = 3
#Configure the maximum local RTP port. It ranges from 0 to 65535, the default value is 11800.
network.port.max_rtpport = 10100
#Configure the minimum local RTP port. It ranges from 0 to 65535, the default value is 11780.
network.port.min_rtpport = 10000
security.user_name.admin = root
security.user_password = root:ADMIN_PWD
security.user_name.user = user
security.user_password = user:USER_PWD
#Specify the web language, the valid values are: English, Chinese_S, Turkish, Portuguese, Spanish, Italian, French, Russian, Deutsch and Czech.
lang.wui = Russian
#Specify the LCD language, the valid values are: English (default), Chinese_S, Chinese_T, German, French, Turkish, Italian, Polish, Spanish and Portuguese.
lang.gui = Russian
#Configure the time zone and time zone name. The time zone ranges from -11 to +12, the default value is +8.
#The default time zone name is China(Beijing).
#Refer to Yealink IP Phones User Guide for more available time zones and time zone names.
local_time.time_zone = +11
local_time.time_zone_name = Vladivostok
#Configure the domain name or the IP address of the NTP server. The default value is cn.pool.ntp.org.
local_time.ntp_server1 = 10.1.1.4
#Configure the logo mode of the LCD screen; 0-Disabled (default), 1-System logo, 2-Custom logo;
phone_setting.lcd_logo.mode = 1
#Configure the access URL and dispaly name of the remote phonebook. X ranges from 1 to 5.
remote_phonebook.data.1.url = 10.1.1.50/provisioning/yealink-phonebook.xml
remote_phonebook.data.1.name = Phonebook
features.remote_phonebook.flash_time = 3600

индивидуальные настройки#!version:1.0.0.1
#Enable or disable the account1, 0-Disabled (default), 1-Enabled;
account.1.enable = 1
#Configure the label displayed on the LCD screen for account1.
account.1.label = Test phone
#Configure the display name of account1.
account.1.display_name = User 998
#Configure the username and password for register authentication.
account.1.auth_name = 998
account.1.password = 998
#Configure the register user name.
account.1.user_name = 998
#Configure the SIP server address.
account.1.sip_server_host = 10.1.1.50
#Specify the port for the SIP server. The default value is 5060.
account.1.sip_server_port = 5060

В итоге, благодаря замечательной функции auto-provision, предусмотренной в упомянутых мной телефонах, с подключением к сети новых аппаратов не возникло никаких проблем. Всё свелось к выяснению MAC-адреса телефона и генерации конфигурационного файла по шаблону.

Надеюсь, что вы дочитали до конца и извлекли пользу из прочитанного.

Спасибо за внимание.

Источник: habr.com