И так мысль не стоит на месте, на столах сотрудников обычные телефоны, подключенные на VoIP шлюз, а рулит всем хозяйством Asterisk.
Давно была идея, как бы сделать так, чтобы не шерстить по справочникам в поисках нужного телефона, а подумал надо ему позвонить и оно позвонило
[spoiler]
Ну до телепатии пока не дошли, но упростить задачу получилось.
И так на входе мы имеем:
1) Битрикс Кор. портал, с заполнеными карточками пользователей, особенно с заполненным полем "Внутренний телефон"
2) XMPP сервер
3) Asterisk
Идея:
Справочник пользователей у нас есть под рукой - контакт лист в Jabber клиенте, хочется ткнуть нужного пользователя и чтобы оно ему позвонило.
Решение:
Тыкаем пользователя, пишем ему сообщение с символом "+" - которое не имеет смысла, но служит флагом что мы ему хотим позвонить, дожидаемся инициации звонка от Asterisk снимаем трубку на нашем телефоне, ждем ответа от нужного нам сотрудника и наслаждаемся общением
Реализация:
Создаем обработчик события
В принципе вот так оно не сложно делается, а поле для фантазии открывает большое, еще конечно надо бы обрабатывать ошибки, но для демонстрации идеи пример вполне рабочий
P.S. А вообще тематика моих экспериментов кому-нибудь интересна?
Давно была идея, как бы сделать так, чтобы не шерстить по справочникам в поисках нужного телефона, а подумал надо ему позвонить и оно позвонило

[spoiler]
Ну до телепатии пока не дошли, но упростить задачу получилось.
И так на входе мы имеем:
1) Битрикс Кор. портал, с заполнеными карточками пользователей, особенно с заполненным полем "Внутренний телефон"
2) XMPP сервер
3) Asterisk
Идея:
Справочник пользователей у нас есть под рукой - контакт лист в Jabber клиенте, хочется ткнуть нужного пользователя и чтобы оно ему позвонило.
Решение:
Тыкаем пользователя, пишем ему сообщение с символом "+" - которое не имеет смысла, но служит флагом что мы ему хотим позвонить, дожидаемся инициации звонка от Asterisk снимаем трубку на нашем телефоне, ждем ответа от нужного нам сотрудника и наслаждаемся общением

Реализация:
Создаем обработчик события
AddEventHandler("socialnetwork", "OnBeforeSocNetMessagesAdd", Array("MyClass", "OnBeforeSocNetMessagesAddHandler"));
class MyClass
{
function OnBeforeSocNetMessagesAddHandler($fields)
{
if($fields["MESSAGE"] == "+")
{
$rsUser = CUser::GetByID($fields["FROM_USER_ID"]);
$arUser = $rsUser->Fetch();
$callFrom = $arUser["UF_PHONE_INNER"];
$rsUser = CUser::GetByID($fields["TO_USER_ID"]);
$arUser = $rsUser->Fetch();
$callTo = $arUser["UF_PHONE_INNER"];
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "server", "5038");
$in = "Action: login\r\n";
$in .= "Username: login\r\n";
$in .= "Secret: password\r\n";
$in .= "\r\n";
socket_write($socket, $in, strlen($in));
$out = '';
while ($buff = socket_read($socket, 2048) && ($buff != "\r\n"))
{
$out.= $buff;
}
$in = "Action: Originate\r\n";
$in .= "Channel: SIP/".$callFrom."\r\n";
$in .= "Context: office\r\n";
$in .= "Exten: ".$callTo."\r\n";
$in .= "Priority: 1\r\n";
$in .= "Callerid: ".$callFrom."\r\n";
$in .= "Variable: ANSWER=1\r\n";
$in .= "Variable: _ACC=2\r\n";
$in .= "\r\n";
socket_write($socket, $in, strlen($in));
$in = "Action: logoff";
socket_write($socket, $in, strlen($in));
socket_close($socket);
return false;
}
}
}
|
В принципе вот так оно не сложно делается, а поле для фантазии открывает большое, еще конечно надо бы обрабатывать ошибки, но для демонстрации идеи пример вполне рабочий

P.S. А вообще тематика моих экспериментов кому-нибудь интересна?
