Pull to refresh

Звоним из терминала

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

Что у нас есть:локальная сеть, сам сервер терминалов[у нас Windows 2003 Standart], сервер IP-телефонии[Asterisk], клиентские машины[Windows XP] с установленным софтверным IP-телефоном[X-lite].
Общая идея: на терминальном сервере [далее ТС] должна быть некая программа[клиентская часть. Далее КЧ], которая определяет с какого IP-адреса зашел Василий Пупкин [прошу всех ВП не обижаться:)]. На компьютере Василия висит некая программа-сервер и слушает порт[далее СЧ]. Возникает вопрос — почему на сервере стоит КЧ, а на клиентской машине СЧ? Все дело в том, что на сервере программа не будет слушать порты, а будет «соединяться» с клиентской машиной и отсылать номер по которому нужно позвонить.

Для решения поставленной задачи я задействовал AutoIt3 и небольшую программу GETTSCIP, запустив которую через консоль мы получаем наш IP в терминале[как раз то, что нам надо]

1. Пишем СЧ [будет стоять на клиентской машине]. Как мы сказали ранее, программа слушает порт [в данном примере 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 можно скачть в архиве здесь.
Tags:
Hubs:
Total votes 8: ↑6 and ↓2+4
Comments3

Articles