Звездочка-Java + FreePBX + AMI + Spring Boot.Информация после первого звонка не завершена - PullRequest
0 голосов
/ 20 ноября 2018

Я очень надеюсь, что кто-то сможет помочь мне в моем вопросе.В настоящее время я использую библиотеку asterisk-java 2.0.3 для решения своей проблемы.Мне нужно получить информацию о звонках:

  1. Входящие звонки в очередь
  2. Входящие звонки на внутренний номер
  3. Исходящие звонки

Распределение вызовов обрабатывается реализацией на FreePBX, мне просто нужно правильно обрабатывать то, что приходит к слушателям сервера.Для этого я создаю соединение, добавляю прослушиватели событий к объекту AsteriskServer.Однако он не работает точно, а именно, после первого запуска первый вызов содержит наиболее полную информацию, а все последующие вызовы не настолько завершены.Моя реализация включает в себя следующее:

  • Создан специальный класс, который создает экземпляр AsteriskServer (DefaultAsteriskServer)
  • Созданы прослушиватели этого класса, которые отображают информацию при создании нового канала

Рассмотрим пример события DialBeginEvent со статусом канала: RING.Событие означает начало вызова, вызывается один раз и несет в себе почти всю необходимую информацию: channel (callerId, firstExtension), destChannel.Проблема в том, что информация в канале (dialedChannel) и destinationChannel, устанавливается в ноль после первого вызова.Итак, при первом вызове информация завершена, и все последующие вызовы имеют нулевые значения.Я не знаю, что с этим делать.Пример содержимого канала:

При первом вызове:

[INFO] 2018-11-19 13:57:23.848-{AMIAppManagerCallEventHandler}: ---DialBeginEvent---START--- Channel: AsteriskChannel: id: 1542625043.1526 name: PJSIP/pbx1-xxxx-de-0000045b callerId: "79876543210" <79876543210> state: RING currentExtension: Extension: extension:s context:macro-dial-one application:Dial appData:PJSIP/1106/sip:1106@xxx.xx.xxx.xx:xxxxx;transport=TCP;rinstance=08e972f5c8c1d216,,HhtrIb(func-apply-sipheaders^s^1) priority:54 firstExtension: Extension: extension:84956607006 context:from-pstn application:Set appData:__DIRECTION=INBOUND priority:1 meetMeUser: null hangupCause: null queueEntry: null dialedChannel: AsteriskChannel[id='1542625043.1527',name='PJSIP/1106-0000045c',callerId='"second user" <1106>',state='DOWN',account='',dateOfCreation=Mon Nov 19 13:57:23 MSK 2018,dialedChannel=null,dialingChannel=AsteriskChannel[id='1542625043.1526',name='PJSIP/pbx1-xxxx-de-0000045b'],linkedChannel=null] dialingChannel: null linkedChannel: null [INFO] 2018-11-19 13:57:23.850-{AMIAppManagerCallEventHandler}: DestChannel: AsteriskChannel: id: 1542625043.1527 name: PJSIP/1106-0000045c callerId: "second user" <1106> state: DOWN currentExtension: Extension: extension:s context:func-apply-sipheaders application:Return appData: priority:11 firstExtension: Extension: extension:1106 context:from-internal application:AppDial appData:(Outgoing Line) priority:1 meetMeUser: null hangupCause: null queueEntry: null dialedChannel: null dialingChannel: AsteriskChannel[id='1542625043.1526',name='PJSIP/pbx1-xxxx-de-0000045b',callerId='"79876543210" <79876543210>',state='RING',account='',dateOfCreation=Mon Nov 19 13:57:23 MSK 2018,dialedChannel=AsteriskChannel[[id='1542625043.1527',name='PJSIP/1106-0000045c'],[id='1542625043.1527',name='PJSIP/1106-0000045c'],],dialingChannel=null,linkedChannel=null] linkedChannel: null [INFO] 2018-11-19 13:57:23.851-{AMIAppManagerCallEventHandler}: ---DialBeginEvent---END---

Вкл.последующие вызовы:

[INFO] 2018-11-19 11:37:59.436-{AMIAppManagerCallEventHandler}: ---DialBeginEvent---START--- Channel: AsteriskChannel: id: 1542616679.1508 name: PJSIP/pbx1-prime-de-00000449 callerId: "79876543210" <79876543210> state: RING currentExtension: Extension: extension:s context:macro-dial-one application:Dial appData:PJSIP/1111/sip:1111@xxx.xx.xxx.xx:xxxxx;rinstance=d645ab1622a6f515,,HhtrIb(func-apply-sipheaders^s^1) priority:54 firstExtension: Extension: extension:84956607055 context:from-pstn application:Set appData:__DIRECTION=INBOUND priority:1 meetMeUser: null hangupCause: null queueEntry: null dialedChannel: null dialingChannel: null linkedChannel: null [INFO] 2018-11-19 11:37:59.437-{AMIAppManagerCallEventHandler}: DestChannel: [INFO] 2018-11-19 11:37:59.437-{AMIAppManagerCallEventHandler}: ---DialBeginEvent---END---

Публикация событий вызова (таких как DialBeginEvent, NewStateEvent, HangupEvent) происходит с помощьюСлушатели, а также механизм событий Spring-приложения.

Буду очень признателен всем за любую помощь!

AMIAsteriskServer

    public void initialize()
    {
        try
        {
            asteriskServer = new DefaultAsteriskServer(asterServer, amiPort, amiUser, amiPass);
            asteriskServer.initialize();
            logger.info("Asterisk server initialized");
        }
        catch (Exception cause)
        {
            logger.error("Error while trying to initialize AsteriskServer. Cause: " + cause);
        }
    }

    public void shutdown()
    {
        asteriskServer.getManagerConnection().logoff();
        asteriskServer.shutdown();
        logger.info("Logoff and shutdown");
    }

ApplicationAsteriskService

    public void init()
    {
        amiAsteriskServer.initialize();

        if (amiAsteriskServer.isConnected())
        {
            amiAsteriskServer.getAsteriskServer().addAsteriskServerListener(amiAsteriskServerListener);

            final ManagerConnection managerConnection = amiAsteriskServer.getAsteriskServer().getManagerConnection();

            managerConnection.addEventListener(simpleEventListener);
            managerConnection.addEventListener(deviceAndExtensionEventListener);
            managerConnection.addEventListener(queueAndMemberEventsListener);
            managerConnection.addEventListener(callEventListener);
        }
    }

AMICallEventListener

public class AMICallEventListener extends AbstractManagerEventListener
{
    // ...some logic

    @Override
    public void onManagerEvent(ManagerEvent event)
    {
        super.onManagerEvent(event);
        eventPublisher.publishEvent(new AMIAppManagerEvent(this, event));
    }

    // ...some logic and overriden methods
}

AMIAppManagerCallEventHandler

public class AMIAppManagerCallEventHandler implements AMIAppManagerEventHandler
{
    // ...some logic

    @Override
    public void handleEvent(ManagerEvent event)
    {
        logger.info(event)
    }

    // ...some logic
}
...