Автоматизация. Настройка Voip телефонов Fanvil

в 5:00, , рубрики: asterisk

В сети много разрозненной информации по автоматизации процесса настройки телефонов, но крайне мало законченных тутариалов. Тут на примере телефона Fanvil F52 хочу показать один из вариантов того как, полностью автоматизировать настройку и регистрацию телефонов Fanvil.

Для этого потребуется:

  • Asterisk с настроенными пирами в realtime (в моем случае это Posgresql)
  • DHCP, TFTP и WEB серверы

Я не буду касаться настройки Asterisk. Единственное, необходимо модифицировать таблицу sippeers, добавив поле mac (в него мы будем записывать мак-адреса телефонов).

Информацию о том, где получать конфигурацию, мы будем передавать с помощью DHCP options.

По умолчанию, на телефоне активирована DHCP option 66 (получение конфигов через TFTP).
TFTP нам понадобиться ТОЛЬКО для того, чтобы при первой загрузке изменить параметр загрузки телефона, указав ему в дальнейшем использовать DHCP option 43.

На DHCP сервере настраиваем два параметра:

option 66 где указываем адрес TFTP сервера: pbx.domain.ru
option 43 где указываем адрес веб сервера конфигураций http://pbx.domain.ru

на TFTP сервере редактируем файл f0F0052H000.cfg (имя файла — уникальный номер модели телефона, можно узнать заглянув в лог TFTP сервера).

<<VOIP CONFIG FILE>>Version:2.0003
<AUTOUPDATE CONFIG MODULE>
DHCP Option        :43
<<END OF FILE>>

Теперь, при первом включении телефона в сеть, он скачает f0F0052H000.cfg с TFTP сервера, применит его, и перезагрузится. Все, теперь этому телефону TFTP больше не нужен. С этого момента он будет запрашивать файлы конфигурации c сервера полученного через option 43.

Во время загрузки, телефон запрашивает два файла:

http://pbx.domain.ru/f0F0052H000.cfg — общий для данной модели телефона файл. Статический файл со всеми настройками за исключением настроек SIP.
http://pbx.domin.ru//mac.cfg где mac = mac адрес телефона.
Второй запрос обрабатывает php-скриптом index.php, который подключается к базе, получает необходимые настройки для конкретного телефона и отдает их ему. Или, если телефон новый, регистрирует его в БД. Таким образом процедура настройки телефона от начала и до конца полностью автоматизирована.

<?php
$pbx = 'pbx.domain.ru';
$host = 'localhost';
$dbname = 'asterisk';
$dbuser = 'asterisk';
$dbpassword = 'password;
$mac= substr(split('.', $_SERVER["REQUEST_URI"])[0],1);
if  (strlen($mac) != 12 ) { 
    print "goodbye"; // Если длина mac-а меньше 12 ничего не делать.
    exit;
}

$db = pg_connect("host=$host dbname=$dbname user=$dbuser password=$dbpassword")
    or die('Could not connect: ' . pg_last_error());

function print_conf($name,$secret,$pbx)
       {
        header('Content-Type:application/txt');
        echo "<<VOIP CONFIG FILE>>
        <SIP CONFIG MODULE>
        --SIP Line List--  :
        SIP1 Phone Number  :$name
        SIP1 Display Name  :$name
        SIP1 Sip Name      :$name
        SIP1 Register Addr :$pbx
        SIP1 Register User :$name
        SIP1 Register Pswd :$secret
        SIP1 Enable Reg    :1
        SIP1 DTMF Mode     :2
        SIP1 VoiceCodecMap :G711A,G711U,G722,G729
        SIP2 line attachmen:1
        <PHONE CONFIG MODULE>
        LCD Title          :$name
       <<END OF FILE>>
   ";  
}
 
function query_sql($db,$mac,$pbx)
  {
    $result = pg_query($db, "SELECT name,secret FROM sippeers WHERE mac = '$mac';");
    if (!$result) { // Что-то пошло не так
            return 2;
    }
    if ( pg_num_rows($result) == 0 ){ 
            // В базе нет зарегистрированного телефона с этим MAC-ом
            return 1;
    }else { 
            // Получаем настройки для телефона
            while ( $row = pg_fetch_row($result)){
               $name = $row[0];
               $secret = $row[1];
             }
     print_conf($name,$secret,$pbx);
    }
 }
 
// Получение свободного номера и привязка его к новому телефону 
function update_sql($db,$mac)
  {
   $result = pg_query($db, "SELECT name,secret FROM sippeers WHERE mac IS NULL;");
   if ( pg_num_rows($result) == 0 ){
         return 2;
    } else {
          $result = pg_query($db,"UPDATE sippeers SET mac = '$mac' WHERE id IN (SELECT id FROM sippeers WHERE mac IS NULL LIMIT 1);");
          if ($res) {
              return 0;
         }
   }
 }
 

if (query_sql($db,$mac,$pbx) == 1) { //  Новый телефон, необходимо выбрать свободный номер и закрепить его за ним
        if (update_sql($db,$mac,$pbx) == 0) { // Регистрация нового телефона
               query_sql($db,$mac,$pbx); // Запрос конфига для вновь зарегестрированого телефона
        }
  }

pg_close($db);

?>

Автор: borisovEvg

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js