Статус SIP клиентов и текст на экранах 29.04.2011

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

Отправку сообщения сделаем через php-sip, сам скрипт – на php (знаю, что я неправ, но все скрипты пишу на php) с запуском из cron каждую минуту.

Данные по IP телефонов мы возьмем из tbl_sip_conf, где их любезно обновляет астериск.

Здесь будет только код.

<?php
// подключаем конфиг и класс php-sip
include_once dirname(__FILE__).'/config.php';
include_once 
dirname(__FILE__).'/phpsip/PhpSIP.class.php';

// получим телефоны со статусом OK
$ret=shell_exec('sudo /usr/sbin/asterisk -rx "sip show peers" | grep "OK ("');
$ret_arr=explode("\n"$ret);

$numbers_arr=array();
foreach(
$ret_arr as $value)
{
    
// каждый элемент, чтобы получить номер, разорвем по слешу
    
$value_arr=explode('/',$value);
    
// если не нашли номер - продолжаем
    
if(count($value_arr)<2) continue;
    
// вносим номер в массив
    
$numbers_arr[]="'".$value_arr[0]."'"
}
// сформируем строку номеров
$numbers_line=implode(','$numbers_arr);

// если нет - то выставляем $numbers_line в несуществующее значение
// чтобы в следующих скриптах не было ошибки
if($numbers_line==''$numbers_line='XXXX';

// все неперечисленные номера уводим в disconnected
$SQL="
    UPDATE tbl_global_list 
    SET last_sip_status='disconnected' 
    WHERE main_number_type=1
    AND CONCAT('1',short_number) NOT IN (
$numbers_line)
    "
;
mysql_query($SQL);

// Теперь получаем те, которые были disconnected, но теперь - OK
$SQL="
    SELECT DISTINCT t2.name,t2.fullcontact
    FROM tbl_global_list as t1
    JOIN tbl_sip_conf as t2 ON t2.name=CONCAT('1',t1.short_number)
    WHERE 
        t1.last_sip_status='disconnected'
        AND main_number_type=1
        AND CONCAT('1',t1.short_number) in (
$numbers_line)
        AND t2.fullcontact<>''
"
;
$rez_sql=mysql_query($SQL);

// и разошлем по ним сообщение при помощи php-sip
if(mysql_numrows($rez_sql)>0)
{
    
$numbers_arr=array();
    
    
// устанавливаем общие соединение
    
$sip_api = new PhpSIP('10.62.20.20');
    
$sip_api->addHeader('Subject: asterisk');
    
$sip_api->setFrom('sip:asterisk@'.$sip_api->getSrcIp());
    
$sip_api->setContentType('text/plain');
    
    while (
$row mysql_fetch_assoc($rez_sql)) 
    {
        
$sip_api->setUri($row['fullcontact']);
        
// и устанавливаем сообщение 
        
$sip_api->setMethod('MESSAGE');
        
$sip_api->setBody("My no ".$row['name']);
        
$sip_api->send();
    
        
$numbers_arr[]=$row['name'];
    }

    
$numbers_line=implode(','$numbers_arr);

    
// теперь переведем их в OK
    
$SQL="
        UPDATE tbl_global_list 
        SET last_sip_status='ok' 
        WHERE main_number_type=1
        AND CONCAT('1',short_number) IN (
$numbers_line)
        "
;
    
mysql_query($SQL);
    
}
?>

Все! Следующая статья - более практическая, обещаю :)