Я пытаюсь подключиться к Unify OpenScape Business и отслеживать входящие вызовы. Из того, что я нашел до сих пор, кажется, что лучше всего использовать протокол CSTA.
На следующей странице http://wiki.unify.com/wiki/Developer_Program_-_OpenScape_Voice Я нашел openscape-csta-sdk-1.5.2.zip: http://wiki.unify.com/images/4/47/openscape-csta-sdk-1.5.2.zip
Сейчас пытаюсь установить соединение на примере из SDK. Мой OpenScape слушает порт 8800. Однако, когда я использую telnet на этом порту или подключаюсь через прилагаемое примерное приложение, примерно через 20 секунд я получаю какой-то мусор.
Когда запускается код мониторинга на основе SDK, в логах отображается что-то вроде этого:
2015-12-28 22:48:17,429 [main] INFO com.sen.openscape.csta.provider.CstaProvider - Welcome to use OpenScape Voice CSTA SDK V1.5.2!
2015-12-28 22:48:17,525 [main] DEBUG com.sen.openscape.csta.transport.tcp.CstaTcpLink - Connected to CSTA Server.
2015-12-28 22:49:16,985 [main] INFO com.sen.openscape.csta.transport.tcp.CstaTcpLink - Received CSTA Message: aDˇ+€Ş˘ ˇ M-CM10.00 1.0.0.018ľ(
2015-12-28 22:49:17,005 [main] DEBUG com.sen.openscape.csta.transport.CstaLink - Sending SystemRegister Request
2015-12-28 22:49:17,074 [main] INFO com.sen.openscape.csta.transport.tcp.CstaTcpLink - Sent CSTA Message: 0001<?xml version="1.0" encoding="UTF-8"?>
<SystemRegister xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.ecma-international.org/standards/ecma-323/csta/ed4"><requestTypes><systemStatus>true</systemStatus><requestSystemStatus>true</requestSystemStatus><switchingFunctionCapsChanged>true</switchingFunctionCapsChanged><switchingFunctionDevicesChanged>true</switchingFunctionDevicesChanged></requestTypes></SystemRegister>
Failed to connect: CstaErrorCause=NetworkFailure; ErrorMessage=Timeout waiting for response
Мусор, который я получаю, это (шестнадцатеричный дамп)
61 44 cb 87 07 06 05 2b 0c 20 c3 9a 01 cb 98 03 02 01 02 c5 81 05 cb 98 03 02 01 20 ef bf bd 02 06 e2 82 ac c5 9e 1c cb 98 1a c2 a0 18 cb 87 16 04 09 4d 2d 4f 4d 31 30 2e 30 30 04 09 33 2e 30 2e 30 2e 30 35 37 c4 be 0b 28 09 c2 a0 07 c2 a0 05 03 03 20 10 20
Это приводит меня к выводу, что не обязательно подключение к порту 8800 — это то, что я ищу, однако я не могу найти ничего другого.
«Мусор», который я получаю, может быть закодированным сообщением ASN.1, но мне не удалось его правильно расшифровать.
Код для мониторинга прикреплен ниже,
import com.sen.openscape.csta.callcontrol.CstaDevice;
import com.sen.openscape.csta.callcontrol.CstaMonitor;
import com.sen.openscape.csta.provider.CstaEventListener;
import com.sen.openscape.csta.provider.CstaEventObject;
import com.sen.openscape.csta.provider.CstaProvider;
import com.sen.openscape.csta.util.CstaException;
public class CstaDeviceMonitor implements CstaEventListener {
private CstaMonitor monitor;
public boolean startMonitor(CstaProvider provider, String device) {
CstaDevice myDevice = provider.addDevice(device);
try {
monitor = provider.MonitorStart(myDevice);
provider.registerEventListener(this);
System.out.println("\n---\nStarted monitoring " + monitor.fqnDn + "\n---\n");
return true;
} catch (CstaException e) {
System.err.println("Failed to start monitor: " + e.toString());
return false;
}
}
public void stopMonitor(CstaProvider provider) {
try {
provider.MonitorStop(monitor.crossRefId);
System.out.println("\n---\nStopped monitoring " + monitor.fqnDn + "\n---\n");
provider.removeDevice(monitor.fqnDn);
} catch (CstaException e) {
System.err.println("Failed to stop monitor: " + e.toString());
}
}
@Override
public void newCstaEvent(CstaEventObject evt) {
System.out.print("\n--- Device " + evt.fqnDn + " received event: type=" + evt.evtType
+ ", callID=" + evt.callID + "\n");
}
}
import com.sen.openscape.csta.provider.CstaProvider;
import com.sen.openscape.csta.util.CstaConfiguration;
import com.sen.openscape.csta.util.CstaException;
import java.util.Scanner;
public class CstaMonitorMain {
/**
*
* The IP address of the CSTA interface in OpenScape Voice
*
*/
private static final String CSTA_SERVER_IP_ADDRESS = "192.168.1.12";
/**
*
* The port number - it's usually 1040, very rarely changed
*
*/
private static final int CSTA_SERVER_PORT = 8800;
/**
*
* The phone number we will monitor Must match the configured in OSV and
* must
*
* have CSTA service assigned
*
*/
private static final String DEVICE_TO_MONITOR = "101";
public static void main(String[] args) {
CstaProvider myProvider = connect();
if (myProvider != null) {
CstaDeviceMonitor monitor = new CstaDeviceMonitor();
if (monitor.startMonitor(myProvider, DEVICE_TO_MONITOR)) {
// Let it run until the user hits the enter key
Scanner keyIn = new Scanner(System.in);
System.out.print("\n\nPress Enter to exit\n\n");
keyIn.nextLine();
monitor.stopMonitor(myProvider);
}
disconnect(myProvider);
}
}
private static CstaProvider connect() {
CstaConfiguration cfg = new CstaConfiguration(CSTA_SERVER_IP_ADDRESS, CSTA_SERVER_PORT);
// cfg.setTransportType(CstaTransports.HTTP_SOAP);
try {
CstaProvider provider = new CstaProvider();
provider.connectToSystem(cfg);
System.out.println("\n---\nConnected to " + CSTA_SERVER_IP_ADDRESS + "\n---\n");
provider.startHeartbeat(60, 60);
return provider;
} catch (CstaException e) {
System.err.println("Failed to connect: " + e.toString());
return null;
}
}
private static void disconnect(CstaProvider provider) {
try {
provider.endHeartbeat();
provider.disconnectFromSystem();
System.out.println("\n---\nDisconnected from " + CSTA_SERVER_IP_ADDRESS + "\n---\n");
} catch (CstaException e) {
System.err.println("Failed to disconnect: " + e.toString());
}
}
}
Я также нашел клиент CSTA на sourceforge, но он также не смог контролировать устройство.
Я также пытался разместить вопрос на форуме Unify, но, к сожалению, это худший программный форум, который я когда-либо встречал, короче говоря, я не могу разместить свой вопрос там, поэтому я пытаюсь обратиться за помощью сюда.
Я ищу подсказку относительно доступа к OpenScape Business V5 через CSTA. Я был бы признателен, если бы кто-то, кто запрограммировал это, уже указал мне правильное направление, спасибо.
Прогресс, шаг 1
Может у кого-то есть такие же проблемы, как у меня... Тогда выкладываю первое обновление.
Я добился некоторого прогресса, еще не полного успеха, но есть свет :-) Мой основной подход к решению этой проблемы с помощью SDK был неправильным. SDK нет. Наконец-то я нашел документацию здесь http://wiki.unify.com/wiki/Developer_Program_-_OpenScape_4000 а>. Описание правильного разговора представлено в CSTA3_ADG1.pdf на этой странице, http://wiki.unify.com/images/1/11/Application_Guide_%28part_I%29.zip
Также мне удалось получить инструмент CSTA Browser, который очень полезен для понимания связи asn.1 с АТС. Я думаю, что стоит отметить, как должно выглядеть общение, ниже приведен дамп из «симуляции разговора», сделанного в CSTA Browser, инструмент от Unify (Siemens)
< aCSE.aarq
< { -- SEQUENCE --
< application-context-name = {iso(1) identified-organization(3) icd-ecma(12) standard(0) csta(218)},
< sender-acse-requirements = '10'B -- NrBits = 2 --
< { -- true bits --
< authentication
< },
< calling-authentication-value.external
< { -- SEQUENCE --
< encoding.single-ASN1-type
< { -- SEQUENCE --
< sender-authentication
< { -- SEQUENCE --
< authentication-name = "AMHOST" '41 4D 48 4F 53 54'H,
< authentication-password = "77777" '37 37 37 37 37'H
< }
< }
< },
< user-information
< { -- SEQUENCE OF --
< { -- SEQUENCE --
< encoding.single-ASN1-type.newDefinition
< { -- SEQUENCE --
< cSTAVersion = '0001000000000000'B -- NrBits = 16 --
< { -- true bits --
< versionFour
< }
< }
< }
< }
< }
Time = 22:13:49:992
S(00,AMHOST): 60 31 A1 07 06 05 2B 0C 00 81 5A 8A 02 06 80 AC 15 A2 13 A0 11 A0 0F 04 06 41 4D 48 4F 53 54 04 05 37 37 37 37 37 BE 0B 28 09 A0 07 A0 05 03 03 00 10 00
Time = 22:13:49:992
R(00,AMHOST): 61 48 A1 07 06 05 2B 0C 00 81 5A A2 03 02 01 00 A3 05 A1 03 02 01 00 88 02 06 80 AA 21 A2 1F A0 1D A1 1B 04 10 48 45 35 32 30 4D 2E 30 30 2E 34 33 37 2E 35 31 04 07 34 33 37 2E 30 30 30 BE 0A 28 08 A0 06 A0 04 03 02 04 10
Time = 22:13:49:992
> aCSE.aare
> { -- SEQUENCE --
> application-context-name = {iso(1) identified-organization(3) icd-ecma(12) standard(0) csta(218)},
> result = 0 (accepted),
> result-source-diagnostic.acse-service-user = 0 (null),
> responder-acse-requirements = '10'B -- NrBits = 2 --
> { -- true bits --
> authentication
> },
> responding-authentication-value.external
> { -- SEQUENCE --
> encoding.single-ASN1-type
> { -- SEQUENCE --
> responding-authentication
> { -- SEQUENCE --
> aps-stamp = "HE520M.00.437.51" '48 45 35 32 30 4D 2E 30 30 2E 34 33 37 2E 35 31'H,
> system-version = "437.000" '34 33 37 2E 30 30 30'H
> }
> }
> },
> user-information
> { -- SEQUENCE OF --
> { -- SEQUENCE --
> encoding.single-ASN1-type.newDefinition
> { -- SEQUENCE --
> cSTAVersion = '0001'B -- NrBits = 4 --
> { -- true bits --
> versionFour
> }
> }
> }
> }
> }
Time = 22:13:50:003
R(00,AMHOST): A1 0C 02 01 01 02 02 00 D3 30 03 0A 01 01
Time = 22:13:50:007
> rOSE.roiv-apdu
> { -- SEQUENCE --
> invokeID = 1,
> operation-value = 211 (systemStatus),
> argument
> { -- SEQUENCE --
> systemStatus = 1 (enabled)
> }
> }
После моделирования я могу отправить сообщение aCSE.aarq на CSTA PBX. Пока я храню его в простом массиве, например:
int[] aCSEaarq = {0x60, 0x31, 0xA1, 0x07, 0x06, 0x05, 0x2B, 0x0C, 0x00, 0x81, 0x5A, 0x8A, 0x02, 0x06, 0x80, 0xAC, 0x15, 0xA2, 0x13, 0xA0, 0x11, 0xA0, 0x0F, 0x04, 0x06, 0x41, 0x4D, 0x48, 0x4F, 0x53, 0x54, 0x04, 0x05, 0x37, 0x37, 0x37, 0x37, 0x37, 0xBE, 0x0B, 0x28, 0x09, 0xA0, 0x07, 0xA0, 0x05, 0x03, 0x03, 0x00, 0x10, 0x00};
При отправке данных на АТС важно рассчитать их длину и передать как первые два байта.
Если я это сделаю, я немедленно получу ответ. Итак, дамп разговора из моей простой java выглядит так:
doWrite [aCSE.aarq]
60 31 A1 07 06 05 2B 0C 00 81 5A 8A 02 06 80 AC 15 A2 13 A0 11 A0 0F 04 06 41 4D 48 4F 53 54 04 05 37 37 37 37 37 BE 0B 28 09 A0 07 A0 05 03 03 00 10 00
doRead [aCSE.aare]
00 46 (70 bytes)
61 44 A1 07 06 05 2B 0C 00 DA 01 A2 03 02 01 00 A3 05 A2 03 02 01 00 88 02 06 80 AA 1C A2 1A A0 18 A1 16 04 09 4D 2D 4F 4D 31 30 2E 30 30 04 09 33 2E 30 2E 30 2E 30 35 37 BE 0B 28 09 A0 07 A0 05 03 03 00 10 00
doRead [rOSE.roiv-apdu]
00 0F (15 bytes)
A1 0D 02 02 1D 1D 02 02 00 D3 30 03 0A 01 02
что очень похоже на симуляцию CSTA Browser.
Теперь я пытаюсь выяснить, как я могу кодировать/декодировать сообщения. Я предполагаю, что для этого мне нужно использовать компилятор asn.1, но я пока не знаю, как это сделать правильно и откуда мне взять исходные файлы asn1. Когда дело доходит до компилятора, я бы предпочел использовать бесплатные решения.