Я решил опубликовать небольшую заметку о том, как можно использовать базовые знания программирования для реализации возможности звонков с терминального сервера.
Кому это нужно: в первую очередь это будет интересно тем людям (или организациям) у которых есть терминальный сервер (НАПРИМЕР 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-телефония #Чулан
-
Частицы-Партнеры Калуцы-Клейна, Часть 1
19 Oct, 24 -
Пиар Провалился
19 Oct, 24 -
«Персонал» [Пилот]
19 Oct, 24 -
Nokia Покупает Navteq За Рекордные $8,1 Млрд
19 Oct, 24