Pull to refresh

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

В сети много разрозненной информации по автоматизации процесса настройки телефонов, но крайне мало законченных тутариалов. Тут на примере телефона 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);

?>
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.
Change theme settings