И так мысль не стоит на месте, на столах сотрудников обычные телефоны, подключенные на 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. А вообще тематика моих экспериментов кому-нибудь интересна?