Я очень надеюсь, что кто-то сможет помочь мне в моем вопросе.В настоящее время я использую библиотеку asterisk-java 2.0.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
}