Я Звоню С Терминала

Я решил опубликовать небольшую заметку о том, как можно использовать базовые знания программирования для реализации возможности звонков с терминального сервера.

Кому это нужно: в первую очередь это будет интересно тем людям (или организациям) у которых есть терминальный сервер (НАПРИМЕР windows 2003) он есть программа-CRM , в котором хранятся контактные данные клиентов.

А сотрудники используют программные IP-телефоны.

Что мы имеем: локальная сеть, сам терминальный сервер [у нас Windows 2003 Standart], сервер IP-телефонии [Asterisk], клиентские машины [Windows XP] с установленным программным IP-телефоном [X-lite].

Главная идея: на терминальном сервере [далее ТС] должна быть некая программа [клиентская часть.

Далее CC], которая определяет, с какого IP-адреса зашел Василий Пупкин [прошу всех ВП не обижаться :)].

На компьютере Василия висит некая серверная программа и слушает порт [далее МФ].

Возникает вопрос: почему на сервере установлено CC, а на клиентской машине установлено SCH? Все дело в том, что на сервере программа не будет слушать порты, а «подключится» к клиентской машине и отправит номер для звонка.

Для решения проблемы я использовал АвтоИт3 и небольшая программа ГЕТТСЦИП , запустив который через консоль получаем наш IP в терминале [именно то, что нам нужно] 1. Напишите SCH [будет на клиентской машине].

Как мы говорили ранее, программа прослушивает порт [65532 в этом примере].

Если данные поступают, он ищет окно с определенным заголовком [X-lite. Для других IP-телефонов можно использовать Autoit Window Info, который входит в стандартную комплектацию AutoIt], активирует IP-телефон, отправляет полученные номера, вводит их в IP-телефон и нажимает Enter. Пример сценария:

Local $szServerPC = @ComputerName Local $szIPADDRESS = TCPNameToIP($szServerPC) $socket = UDPBind($szIPADDRESS, 65532) If @error <> 0 Then Exit While 1 $data = UDPRecv($socket, 50) If $data <> "" Then WinActivate("XLite") Send($data & "{enter}") EndIf sleep(100) WEnd Func OnAutoItExit() UDPCloseSocket($socket) UDPShutdown() EndFunc

2. Пишем КЧ [будет на терминальном сервере].

Итак, в качестве параметра указываем номер телефона.

Это позволит нам вставить, например, кнопку звонка в 1С [например, в нашу CRM].

Далее КЦ определяет IP-адрес, с которого клиент зашел в терминал.

И отправляет ему номер телефона по UDP. Соответственно, в этот момент срабатывает экстренное реагирование сотрудника и осуществляется вызов.

Пример сценария [сначала скопируйте программу GETTSCIP с именем getmyip.exe в системный каталог]:

if($CmdLine[0]==1) then Local $foo = Run(@ComSpec & " /c getmyip", @SystemDir, @SW_HIDE, $STDERR_CHILD + $STDOUT_CHILD) Local $line Local $ip While 1 $line = StdoutRead($foo) If @error Then ExitLoop if $line<>'' then $ip=$line EndIf Wend $ip=StringReplace($ip,"WTSClientAddress: ",""); $socket = UDPOpen($ip, 65532) If @error <> 0 Then Exit $status = UDPSend($socket, $CmdLine[1]) If $status = 0 then MsgBox(0, "ERROR", "Error while sending UDP message: " & @error) Exit EndIf EndIf Func OnAutoItExit() UDPCloseSocket($socket) UDPShutdown() EndFunc

Вот и все.

Теперь можно поставить кнопку на ТС в 1С или другой программе для выполнения 2-й части программы, в качестве параметра указывается номер телефона.

Клиент, сервер для Xlite и getmyip можно скачать в архиве Здесь .

Теги: #ip-телефония #Чулан

Вместе с данным постом часто просматривают: