Auto provisioning для grandstream или вынимаем и вкладываем душу в GXP1165

    image
    До недавнего времени в качестве VoIP аппаратов мы использовали продукцию Fanvil. И в целом всем были довольны. Управление из единой точки есть, качество связи удовлетворительное, но оставалось ощущение какой-то незаконченности или даже недосказанности (понимайте как хотите :))) В общем поиск «идеального телефона» в фоновом режиме, но все время продолжался. И вот мне в руки попал Grandstream GXP1165. Имея более именитого производителя данная модель находится в той же ценовой категории, что и китайские Fanvil-ы. Обладает всеми необходимыми функциями и имеет более интуитивное обозначение на кнопках и портах подключения. Кроме того, с некоторых пор, одним из решающих факторов при выборе IP телефона для меня является функция авто провижинга. Данная модель grandstream его обещала. Об этом дальше и пойдет речь.

    Мой опыт работы с функцией auto provisioning основывался на уже упомянутой китайской продукции. И я наивно полагал, что с Grandstream все будет выглядеть примерно также. В общем-то так и вышло. Но я не предполагал насколько примерно все окажется. Чтобы не быть голословным приведу два куска настроек с одного и другого аппарата. Настройки получены путем экспорта файла.
    Fanvil:
    Static IP       :192.168.1.179
    Static NetMask     :255.255.255.0
    Static GateWay     :192.168.1.1
    Default Protocol   :2
    Primary DNS        :202.96.134.133
    Alter DNS          :202.96.128.68
    DHCP Mode          :1
    DHCP Dns           :1
    Domain Name        :
    Host Name          :VOIP
    Pppoe Mode         :0
    HTL Start Port     :10000
    HTL Port Number    :200
    SNTP Server        :209.81.9.7
    

    А теперь держитесь. Кусок настроек из конфига grandstream:
    P335=2
    P90=0
    P91=0
    P212=1
    P92=0
    P93=0
    P338=0
    P1339=0
    P94=0
    P2340=0
    P95=0
    P2341=0
    P2342=0
    P96=97
    P2343=0
    P97=1
    P99=0
    P10=168
    P11=0
    P2346=0
    P2347=0
    P12=160
    P13=255
    P2348=0
    P14=255
    

    А! Как вам?! Впечатлены? По правде говоря я вас немножко обманул. Рабочий конфиг телефона выглядит иначе. Но зато вы можете представить мою растерянность, когда я увидел конфигурацию которую скачал с аппарата.
    Сразу видны плюсы и минусы одного и другого собрата. Китайцы сделали настройки более приближенные к человеческому пониманию. Зато американцев выручает хорошее количество документации. В конечном итоге выручило оно и меня.
    Файл конфигурации для grandstream можно создать двумя способами. При помощи утилит на сайте производителя (инструменты есть для Windows и для Linux) и в ручную, через XML файл. С первым способом у меня не сложилось. Поэтому опишу второй.
    Как вы уже поняли, названия полей конфигурации зашифрованы и найти их описание не то чтобы сложно, но порыть инет пришлось. Что-то взял тут, что-то здесь и в целом получился вот такой файл.
    <?xml version="1.0" encoding="UTF-8" ?> 
    <gs_provision version="1"> 
    <mac>000a91547c9c</mac> 
    <config version="1"> 
    <!-- Admin Password --> 
    <P2>PasswordQWER</P2> 
    <P3>Grandstream</P3> 
    <!-- SIP Registration. 0-no,1-yes --> 
    <P31>1</P31> 
    <!-- Register Expiration (in minutes. default 1 hour, max 45 days) --> 
    <P32>60</P32> 
    <!-- Authenticate password --> 
    <P34>SIPassword</P34> 
    <!-- SIP User ID --> 
    <P35>111</P35> 
    <!-- Authenticate ID --> 
    <P36>111</P36> 
    <P40>5561</P40> 
    <!-- SIP Server --> 
    <P47>sip.address.ru:5561</P47> 
    <!-- DNS Mode. 0-A Record, 1-SRV, 2-NAPTR/SRV, 3-Use Configured IP --> 
    <P103>0</P103> 
    <!-- Time Format 0-12, 1-24 --> 
    <P122>1</P122> 
    <P148>Grandstream Provisioning</P148> 
    <P237>config.address.ru</P237> 
    <!-- Account Name. Cannot be empty. --> 
    <P270>TestConfig</P270> 
    <!-- Account 1 --> 
    <!-- Account Active (In Use). 0-no, 1-yes --> 
    <P271>1</P271> 
    <!-- Enable Phonebook. 0(Disabled)/1(HTTP)/2(TFTP)/3(HTTPS) --> 
    <P330>1</P330> 
    <!-- Phone Book XML Server Path --> 
    <P331>config.address.ru</P331> 
    <!-- Phone Book Download Interval (in minutes) --> 
    <P332>5</P332> 
    <!-- Remove Manually-edited entries on Download. Possible values: 0(No)/1(Yes) --> 
    <P333>1</P333> 
    <!-- XML FILE ENCRYPTION --> 
    <P1349>password123</P1349> 
    <P1362>ru</P1362> 
    <!-- Degree Unit. auto - Automatic, f - Fahrenheit, c - Celsius. Default is auto --> 
    <P1379>c</P1379> 
    </config> 
    </gs_provision> 
    

    Данный конфиг позволяет зарегистрировать аппарат на SIP сервере работающем по не стандартному порту 5561. Также включены незначительные особенности вроде отображения погоды в Цельсиях и настройки пути к адресной книге. Параметры которые не указаны, будут установлены по умолчанию.
    Готовый файл необходимо зашифровать.
    openssl enc -e -aes-256-cbc -k password123 -in basefile.xml -out cfg000d91447b9b.xml 
    

    Имя файла должно иметь вид cfg[macaddress].xml. Раздавать файл будем через HTTP, поэтому просто выкладываем его в /var/www/ (Установку apache в виде apt-get install apache2, извините, описывать не буду :))
    Далее по аналогии с Fanvil-ами автоматизируем этот процесс.
    Создадим файл users со следующим содержимым:
    000a91547c9c 111 SIPassword User Grand
    
    Обратите внимание, mac адрес должен быть написан маленькими буквами.

    … и bash файл который будет брать настройки из users
    #!/bin/bash
    uspath=/opt/neoflex/gxp1165
    usfile=(`cat $uspath/users`)
    macdir=/var/www/
    a=0 #macaddrr
    b=1 #number
    c=2 #pass
    d=3 #2name
    e=4 #1name
    while [ ${usfile[$a]} ]
    do
    dfile=$macdir'cfg'${usfile[$a]}
    cat <<EOF >>$dfile
    <?xml version="1.0" encoding="UTF-8" ?>
    <gs_provision version="1">
    <mac>${usfile[$a]}</mac>
    <config version="1">
    <!-- Admin Password -->
    <P2>PasswordQWER</P2>
    <P3>DisplayTest</P3>
    <!-- SIP Registration. 0 - no, 1 - yes -->
    <P31>1</P31>
    <!-- Register Expiration (in minutes. default 1 hour, max 45 days) -->
    <P32>60</P32>
    <!-- Authenticate password -->
    <P34>${usfile[$c]}</P34>
    <!-- SIP User ID -->
    <P35>${usfile[$b]}</P35>
    <!-- Authenticate ID -->
    <P36>${usfile[$b]}</P36>
    <P40>5561</P40>
    <!-- SIP Server -->
    <P47>sip.server.ru:5561</P47>
    <!-- DNS Mode. 0 - A Record, 1 - SRV, 2 - NAPTR/SRV, 3 - Use Configured IP. Default is 0 -->
    <P103>0</P103>
    <!-- Time Format -->
    <P122>1</P122>
    <P148>Grandstream Provisioning</P148>
    <!-- HTTP Firmware Update Server -->
    <P192>config.server.ru</P192>
    <P237>config.server.ru</P237>
    <!-- Account Name. Cannot be empty. -->
    <P270>${usfile[$d]} ${usfile[$e]}</P270>
    <!-- Account 1 -->
    <!-- Account Active (In Use). 0 - no, 1 - yes -->
    <P271>1</P271>
    <!-- Enable Phonebook0(Disabled)/1(HTTP)/2(TFTP)/3(HTTPS) -->
    <P330>1</P330>
    <!-- Phone Book XML Server Path -->
    <P331>sip.server.ru</P331>
    <!-- Phone Book Download Interval (in minutes) -->
    <P332>60</P332>
    <!-- Remove Manually-edited entries on Download. Possible values: 0 (No) / 1 (Yes) -->
    <P333>1</P333>
    <!-- XML FILE ENCRYPTION -->
    <P1349>password</P1349>
    <P1362>ru</P1362>
    <!-- Update Interval.Default is 15 -->
    <P1378>60</P1378>
    <!-- Degree Unit. auto - Automatic, f - Fahrenheit, c - Celsius. Default is auto -->
    <P1379>c</P1379>
    </config>
    </gs_provision>
    EOF
    openssl enc -e -aes-256-cbc -k password -in $dfile -out $dfile.xml
    rm $dfile
    a=`expr $a + 5`
    b=`expr $b + 5`
    c=`expr $c + 5`
    d=`expr $d + 5`
    e=`expr $e + 5`
    done
    

    Все. На выходе /var/www/ получаем зашифрованный XML-ник cfg000a91547c9c.xml
    В настройках самого аппарата достаточно прописать путь к серверу конфигурации и пароль для расшифровки конфиг файла.

    image
    Внизу нажимаем кнопку «Сохранить и применить» и отправляем в ребут кнопкой «Перезагрузка» в верхнем правом углу экрана.

    Но на этом я не успокоился. В процессе рытья в документации мне попалось описание настройки адресной книги для телефона. И я, не долго думая, забабахал скрипт который генерит phonebook.xml собирая его из sip конфигов.
    Важно! У меня параметр callerid имеет вид SecondName FirsName<111>. То есть все экстеншены должны иметь поле callerid и именно с тремя значениями.
    #!/bin/bash
    a=0
    b=1
    c=2
    book=phonebook.xml
    echo | sed -n '/callerid\=/p' /etc/asterisk/sip*.conf| sed s'/callerid\=//'g | sed s'/</ /'g | sed s'/>//'g | sed s'/;//'g >> tmp.file
    spisok=(`cat tmp.file`)
    echo '<?xml version="1.0" encoding="UTF-8"?>' >> $book
    echo "<AddressBook>" >> $book
    while [ ${spisok[a]} ];do
    cat <<EOF >>$book
        <Contact>
            <LastName>${spisok[a]}</LastName>
            <FirstName>${spisok[b]}</FirstName>
            <Phone>
                <phonenumber>${spisok[c]}</phonenumber>
                <accountindex>1</accountindex>
                <downloaded>0</downloaded>
            </Phone>
            <Groups>
                <groupid>2</groupid>
            </Groups>
        </Contact>
    EOF
    a=`expr $a + 3`
    b=`expr $b + 3`
    c=`expr $c + 3`
    done
    echo "</AddressBook>" >>$book
    cp phonebook.xml /var/www/
    rm tmp.file
    

    Если путь к адресной книге прописан правильно, то после перезагрузки справочник будет подтянут на аппарат. Убедиться в этом можно будет нажав кнопку с телефонной книгой на корпусе телефона или в настройках через web интерфейс.

    image

    Но и этого мне было мало. Итак. Финальный аккорд.
    Пожалуй единственным минусом аппарата можно назвать скудный выбор рингтонов. Всего три да и те какие-то страшненькие. Но! Рингтоны можно залить свои!
    Описан способ для Linux. Уилита для Windows здесь.
    Скачиваем и распаковываем утилиту
    wget http://www.grandstream.com/sites/default/files/Resources/linux_music_ring_tone_gen.zip
    unzip linux_music_ring_tone_gen.zip
    

    Переименовываем sox.linux в просто sox и назначаем права
    mv sox.linux sox
    chmod 755 sox
    

    Читаем readme.
    ./sox sound.wav ring1.ring
    Все просто. На входе wav файл на выходе ring1.ring. Файлов может быть не более трех — ring1.ring, ring2.ring и ring3.ring соответственно. Размер не более 100 Кб, сами авторы рекомендуют не более 70Кб для каждого файла. Получившимся ring-ам необходимо поменять расширение на .bin и залить например туда же где и конфиг файлы.
    Для заливки рингтонов в конфиг файле служит поле . Оно описывает путь к файлам обновления.
    Все. Пускаем телефон в ребут и командой tail -f /var/log/apache/access.log смотрим чего происходит. Выглядеть будет примерно вот так.
    192.168.0.16 -- [05/Nov/2013:17:15:52 +0400] "GET /language.txt HTTP/1.1" 404 480 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
    192.168.0.16 -- [05/Nov/2013:17:16:10 +0400] "GET /cfg000a91547c9c HTTP/1.0" 200 1787 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
    192.168.0.16 -- [05/Nov/2013:17:16:14 +0400] "GET /cfg000a91547c9c.xml HTTP/1.0" 200 1849 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
    192.168.0.16 -- [05/Nov/2013:17:16:32 +0400] "GET /gxp1160fw.bin HTTP/1.0" 404 537 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
    192.168.0.16 -- [05/Nov/2013:17:16:36 +0400] "GET /gxp1160fw.bin HTTP/1.0" 404 537 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
    192.168.0.16 -- [05/Nov/2013:17:16:38 +0400] "GET /ring1.bin HTTP/1.0" 200 65847 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
    192.168.0.16 -- [05/Nov/2013:17:16:39 +0400] "GET /ring2.bin HTTP/1.0" 200 39388 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
    192.168.0.16 -- [05/Nov/2013:17:16:42 +0400] "GET /ring3.bin HTTP/1.0" 404 533 "-" "Grandstream Model HW GXP1165 SW 1.0.5.26 DevId 000a91547c9c"
    
    
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 11

      0
      Вот тут есть описание всех параметров.
        0
        Это ссылка на страницу с утилитами. В том числе и для генерации конфиг файлов. Она есть в статье. Ссылки на описание параметров находятся чуть ниже.
          0
          Вы видели Configuration Template
            0
            Да, простите, на странице с утилитами шаблон конфига тоже есть. Я его скачивал со страницы продукта.
        0
        Да в принципе нормальный метод, вы посмотрите на polycom, как по мне там просто ужас, вот вам кусочек. pastebin.com/9Hx227V7
          0
          С polycom-ами не доводилось дела иметь. В grandstream понравилось то, что не обязательно выписывать весь конфиг, достаточно указать интересующие параметры, остальные будут выставлены по умолчанию. У fanvil-ов, например, лишний пробел не в том месте сделает конфиг неработоспособным вообще.
            0
            Со SPA-серией от Cisco та же ситуация, достаточно только нужные параметры указывать в конфигах.
          0
          Влан и адрес сервера можно закодировать в DHCP Option 43, которая применяется только к определённым Vendor Class Identifier Code и имеет приоритет перед Option 66. Она задаётся в HEX в формате: <номер опции dhcp>:<длина значения>:<значение>:00.

          Например, номер влан 105 для опции 132 (VLAN ID) и сервер http://pbx.domain.tld/gs для опции 66 (TFTP Server Name) будет выглядеть так:
          84:04:31:30:35:00:42:18:68:74:74:70:3a:2f:2f:70:62:78:2e:64:6f:6d:61:69:6e:2e:74:6c:64:2f:67:73:00



          В документации про это написано, но там дурной пример с ACS URL, не сказано про приоритет и про разделитель для нескольких опций.
          На форуме Грандстрема пострадавший коллега заставил WDS раздавать конфиги по TFTP, не разобравшись с опцией 43 или политикам виндового DHCP-сервера, которые могут переопределять опции для определённых клиентов.
            0
            Тут ещё выяснилось, что стоковая прошивка (на GXP1615, 2130 и даже GAC2500) глючит при получении voice-vlan через LLDP-MED: не применяются настройки из Option 66 и сам телефон несколько раз переключается между voice и нетегированным вланом. Предположительно, он отправляет и ждёт ответы на DHCP без тага.
            Пришлось выключить LLDP-MED на коммутаторах и отдавать голосовой VLAN с приоритетом через опции 132 и 133 (они применяются в паре), включив это в конфиге с применением после обновления прошивки.

            С актуальной версией настройки применяются, но всё равно DHCP REQUEST с адресом из voice vlan может улететь без тага.
              0
              На текущей прошивке (1.0.4.46) обнаружился баг в работе опции 132: перед переключением в voice vlan не освобождается IP-адрес в основном влане и телефоны могут выжрать весь пул.
              При исчерпании пула он повторяет слать DHCP DISCOVER, но опция 132 не применяется даже после получения IP-адреса, как будто у этой фичи таймер или счётчик попыток.

              В итоге сделал настройку в два этапа:
              1. Телефон достаётся из коробки и включается в порт без LLDP-MED (или без настройки голосового влана), обновляется прошивка и применяются настройки.
              2. Включается в розетку у пользователя с LLDP-MED, где работает как положено.
              0
              Пытаюсь второй день DLink DPH-400SE/E/F2 поместить в Voice VLAN через Option 43. До этого использовал для подобного LLDP, но этот DLink его не умеет.
              Что-то информации толковой в Инете не удалось найти, подскажи один момент.
              1) Если Dlink в DHCP Discover в Option 55 указывает параметр (43) Vendor-Specific Information, это значит, что он сможет принять Voice VLAN от DHCP-сервера? Или этого недостаточно и нужно смотреть характеристики телефона?
              2) Формат составления строки в Option 43 (как в твоем примере) стандартный, или у каждого вендора свой? Что-то мне разные варианты попадаются.

            Only users with full accounts can post comments. Log in, please.