Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров1.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 можно скачть в архиве здесь.
Теги:
Хабы:
Всего голосов 8: ↑6 и ↓2+4
Комментарии3

Публикации

Истории

Ближайшие события