Как использовать 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 Browser.

Теперь я пытаюсь выяснить, как я могу кодировать/декодировать сообщения. Я предполагаю, что для этого мне нужно использовать компилятор asn.1, но я пока не знаю, как это сделать правильно и откуда мне взять исходные файлы asn1. Когда дело доходит до компилятора, я бы предпочел использовать бесплатные решения.


person norbi771    schedule 29.12.2015    source источник
comment
У вас установлена ​​бустерная карта UC или бустерный сервер UC? Без этого интерфейс CSTA не будет работать в OpenScape Business X5.   -  person user797717    schedule 14.01.2016
comment
Да, у меня установлена ​​бустерная карта UC.   -  person norbi771    schedule 14.01.2016
comment
Наконец-то мне удалось установить связь. Для начинающих вроде меня. Важнейшей частью является отправка сообщения aCSEaarq, затем немедленный ответ от интерфейса CSTA.   -  person norbi771    schedule 20.01.2016


Ответы (2)


Вы говорите, что пытаетесь установить связь с УАТС Unify OpenScape Business. Разве УАТС серии OpenScape Business не взаимодействуют с сообщениями BER вместо сообщений XML?

Я думаю, что Java API, который вы используете, предназначен только для серии OpenScape Voice, которая представляет собой другую серию PBX, использующую сообщения XML.

Таким образом, вы можете отправлять XML-сообщения на устройство PBX, которое не знает, как с ними работать.

person Douglas Coup    schedule 04.01.2016
comment
Спасибо за ваш ответ. Ты прав. Между тем я пришел к такому же выводу. Я хотел бы больше изучить этот вопрос, однако я не могу найти ни одного источника, который мог бы показать мне, как я должен общаться с этой АТС. Я не могу найти ни одного источника, описывающего разговор, который должен состояться между мной и АТС, не могли бы вы что-нибудь посоветовать? Я знаю, что есть ecma-international.org, но я либо не умею читать, либо что-то упустил потому что на основании найденных там документов я до сих пор не могу наладить общение, даже не знаю с чего начать. Буду признателен за ЛЮБУЮ помощь. - person norbi771; 05.01.2016
comment
ECMA — это организация, определяющая обмен сообщениями CSTA. Установление связи с УАТС на основе BER обычно выполняется с использованием другого протокола, известного как ACSE. Серия Unify OpenScape Business использует сообщения ACSE для первоначального установления связи. Но сообщение ACSE Association Request может быть отформатировано различными способами, и разные поставщики используют разные форматы. Лучше всего использовать готовый продукт CSTA (например, obj- sys.com/products/csta/index.php). - person Douglas Coup; 05.01.2016
comment
Спасибо за ваш ответ. Я проверил ссылку, которую вы предоставили. Существуют предварительные API-интерфейсы, CSTA Phase 1,2,3, и единственная фаза 2 имеет java API. К сожалению, я на самом деле не чувствую, что CSTA/ASCE имеет значение, поэтому, пожалуйста, извините, может быть, не очень хороший вопрос, но есть ли способ использовать CSTA Phase 2 для связи с PBX, который должен использовать Phase 3? Также в API есть папка lib, которая пуста, и, насколько я понял, мне нужна библиотека, чтобы заставить программное обеспечение работать, но я не могу найти место, где я могу получить пробную версию или что-то еще, чтобы попробовать ее, если она соответствует моим потребностям. - person norbi771; 12.01.2016
comment
@ norbi771 OpenScape Business не поддерживает версию протокола CSTA Phase II. - person user797717; 14.01.2016
comment
Спасибо. У меня в руках CSTA Browser и с помощью входящего в комплект декодера некоторые вещи становятся для меня более понятными. Но все же есть так много вопросов. Не знаете, может быть, где я мог бы найти примеры разговора с АТС? Я пытаюсь читать документацию Ecma-285, и хотя я понимаю, что там написано, я понятия не имею, что мне делать, чтобы подключиться к АТС, а после установления соединения отслеживать некоторые события (например, входящие соединения), и как сделай это. Пример кода, если он где-то есть, был бы для меня отличным подспорьем. - person norbi771; 14.01.2016

Краткий ответ: вам нужно знать, как работает протокол asn.1 (ITU-T X.680, X.690 и X.890 и т. д.), после чего вам потребуется документация ECMA-285 csta Phase 3, ACSE. документация по протоколу (для входа в АТС - Рекомендация МСЭ X.227 (ISO 8650), X.217 (ISO 8649)) и вы настроены на кодирование/декодирование asn.1. Документация Unify csta расскажет вам, что на самом деле поддерживается АТС. Но я думаю, вы уже все это знаете. Для систем Hipath порт csta — 7001 (требуется как минимум карта LIM), для OSB — порт 8800 (требуется бустерная карта/сервер)

person misterti    schedule 23.08.2017