Страница 1 из 1

Как получить информацию о входящем звонке Asterisk ARI

Добавлено: 30 сен 2020, 08:18
nicolaa
Подключимся к Asterisk при помощи websocket

Код: Выделить всё

    var connection = new WebSocket("ws://ip:port/ari/events?app=qwer&subscribeAll=true&api_key=user:password")
Получаю все события

Код: Выделить всё

    connection.onmessage = function(evt) {
          var msg = JSON.parse(evt.data);
          console.log(msg);
    }
И результат разбираю в JSON

У меня не получается разобраться в документации к ARI https://wiki.asterisk.org/wiki/display/ ... ateChanged
Что такое канал и мост?

Как отловить событие входящего вызова и поднятии трубки оператора(для получения добавочного номера оператора)?

Прочитал много информации по AIR, но сделать выводы не удалось

Например есть статья, но по всей видимости, она устарела (https://habr.com/ru/post/311986/)

В статье при получении новых сообщений, ищет `event` со значением `incoming`

Код: Выделить всё

    switch (msg.event) {
                    case 'incoming':
Когда я получаю новые сообщения, в них нет `event`

Пример, какие приходят сообщения

Код: Выделить всё

   {
      "type": "ChannelCreated",
      "timestamp": "2020-09-30T09:13:28.451+0500",
      "channel": {
        "id": "id",
        "name": "SIP/",
        "state": "Down",
        "caller": {
          "name": "",
          "number": ""
        },
        "connected": {
          "name": "",
          "number": ""
        },
        "accountcode": "",
        "dialplan": {
          "context": "incoming",
          "exten": "s",
          "priority": 1
        },
        "creationtime": "2020-09-30T09:13:28.451+0500",
        "language": "en"
      },
      "application": "qwer"
    }
    {
      "variable": "QUEUENAME",
      "value": "operators",
      "type": "ChannelVarset",
      "timestamp": "2020-09-30T09:14:01.628+0500",
      "channel": {
        "id": "id",
        "name": "SIP/",
        "state": "Up",
        "caller": {
          "name": "78008888888",
          "number": "+79099999999"
        },
        "connected": {
          "name": "",
          "number": ""
        },
        "accountcode": "",
        "dialplan": {
          "context": "incoming",
          "exten": "incom",
          "priority": 15
        },
        "creationtime": "2020-09-30T09:12:38.097+0500",
        "language": "ru"
      },
      "application": "qwer"
    }
    {
      "variable": "QUEUESRVLEVELPERF",
      "value": "0.0",
      "type": "ChannelVarset",
      "timestamp": "2020-09-30T09:14:01.629+0500",
      "channel": {
        "id": "id",
        "name": "SIP/",
        "state": "Up",
        "caller": {
          "name": "78008888888",
          "number": "+79099999999"
        },
        "connected": {
          "name": "",
          "number": ""
        },
        "accountcode": "",
        "dialplan": {
          "context": "incoming",
          "exten": "incom",
          "priority": 15
        },
        "creationtime": "2020-09-30T09:12:38.097+0500",
        "language": "ru"
      },
      "application": "qwer"
    }

Re: Как получить информацию о входящем звонке Asterisk ARI

Добавлено: 02 окт 2021, 20:57
Garnish
Что такое канал и мост?
Проще будет разобрать на примере входящего вызова.
На Атс пришел вызов, он попадает в канал А1, в котором будет происходить обработка этого вызова. Этому каналу будет присвоено свое имя и набор переменных (канал можно представить как vlan, если вам близок этот термин). Если этот входящий вызов подразумевает что на него должен ответить сотрудник, то будет осуществлен вызов этому сотруднику в канале А2. Если сотрудник ответит, то ваши два канала надо будет скоммутировать, чтобы оператор и клиент могли общаться. Для этого астериск создает мост (bridge).

Как отловить событие входящего вызова и поднятии трубки оператора(для получения добавочного номера оператора)?
А вы уверены что вам нужен ARI для этого? Это достаточно просто решается диапланом и настройкой очереди
Если нужен ARI, то делаете тестовый вызов, смотрите что за пакет с данными к вам приходит и пишите свой парсер (это на тот случай, если не понятно как работаете используемая вами библиотека)

Re: Как получить информацию о входящем звонке Asterisk ARI

Добавлено: 02 окт 2021, 22:06
ded

Re: Как получить информацию о входящем звонке Asterisk ARI

Добавлено: 25 окт 2021, 18:25
AndyBack
Предложение почитать маны как всегда, внезапно, поражает свой новизной...

В АРИ по-дефолту не происходит ничего. Всю обработку звонка надо писать самому. Входящий просто повиснет в каком-то состоянии и там останется пока не щелкнут таймауты.
- все начинается с события "StasisStart", для чего любой звонок в диалплане должен быть зарулен в Stasis, т.е. в АРИ.
- вам надо самостоятельно подписаться и отловить это событие
- самостоятельно смаршрутизировать звонок (или отбить его)
- самостоятельно создать второй исходящий канал
- самостоятельно позвонить по нему и быть готовому к тому что он в свою очередь свалится вам в новом "StasisStart"
- самостоятельно понять, что именно этот новый канал относится к тому предыдущему входящему.
- подписаться на его события, где и ждать что снимут трубку (ответят на звонок)
- самостоятельно создать бридж и добавить туда 2 канала (исходящий и входящий)
- самостоятельно мониторить события на этих 2 каналах и бридже, в ожидании кто повесит трубку. (А могут трансфернуть, закинуть в конференцию, поставить на холд, етц)
- помнить, что в любой момент любой из каналов может повесить трубку, пока вы собираетесь с ним что-то сделать.
- корректно все закрыть и освободить бридж и каналы чтобы они не повисли по завершению звонка.

Фактически, это и есть написать собственное приложение, о чем постоянно талдычат во всех документациях по АРИ. Изначально надо понимать - у вас нет ничего. Диалплан не используется, CallerId не выставляется, КПВ нет и все надо делать самому ручками.

Зато нет диалплана и головной боли от него...

"DeviceStateChange" - не работает. Во всяком случае я нкогда его не получаю.