В качестве последнего подготовительного этапа – настроим мониторинг состояния телефонов и отправку на телефон сообщения о его номере, если телефон перешел из оффлайна в онлайн.
Отправку сообщения сделаем через 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);
}
?>
// подключаем конфиг и класс 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);
}
?>
Все! Следующая статья - более практическая, обещаю :)