Как использовать CSTA с Unify Openscape Business v5 в Java?
Я пытаюсь подключиться к 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.
Сейчас я пытаюсь выяснить, как я могу кодировать / декодировать сообщения. Я думаю, что для этого мне нужно использовать компилятор asn.1, но я пока не знаю, как это сделать правильно и откуда мне взять исходные файлы asn1. Когда дело доходит до компилятора, я бы предпочел придерживаться бесплатных решений.
2 ответа
Вы говорите, что пытаетесь установить связь с устройством Unify OpenScape Business PBX. Разве серии УАТС OpenScape Business не связываются с сообщениями BER вместо сообщений XML?
Я думаю, что Java API, который вы используете, предназначен только для серии OpenScape Voice, которая представляет собой другую серию УАТС, использующую сообщения XML.
Таким образом, вы можете отправлять сообщения XML на устройство УАТС, которое не знает, как с ними обращаться.
Короткий ответ: вам нужно знать, как работает протокол asn.1 (ITU-T X.680, X.690 и X.890 и более...), после этого вам нужна документация ECMA-285 csta фаза 3, ACSE документация протокола (для входа в систему pbx - Рек. МСЭ X.227 (ISO 8650), X.217 (ISO 8649)), и вы настроены на кодирование / декодирование asn.1. Unify csta документация расскажет вам, что на самом деле поддерживается pbx. Но я думаю, вы уже все это знаете. Для систем Hipath порт csta равен 7001 (требуется как минимум карта LIM), для OSB - 8800 (требуется дополнительная карта / сервер)