ВидеоКонф(ВКС)  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

originate, каналы и CDR - полный бардак

Раздел для разработчиков для обсуждения программных и аппаратных продуктов и их реализации.

Модераторы: april22, Zavr2008

Re: originate, каналы и CDR - полный бардак

Сообщение kasper » 21 ноя 2011, 21:44

Vslav1 писал(а):
Например чем ваше
console dial 4991234567@from-probe
так уж отличается от originate?

А отличие тем, что console dial создаёт один канал, а originate сначала два, а потом ещё третий.
Ну зачем мне три, когда нужен только один?

У вас где то ошибка, нет можно конечно с помощью originate и больше каналов наплодить но у меня он создаёт только 1, специально проверил "core show channels + ami events" + и то и то показывает 1 канал.(покажите как вы его используете)
И хотя сразу сразу узнать ИМЯ_КАНАЛА не получается (счётчик, на основании которого генерится имя, наверное медленно считает ;) )
но в ответе на Dial идентификатор Uniqueid канала возвращается сразу!

Ничё нипонял, но да ладно...
А оказывается его можно использовать вместо переменной ИМЯ_КАНАЛА, :idea:
хотя внешне они выглядят по разному:

А вот это и для меня новость...
Однако применение под большим сомнением, при перехватах и переводах а может и ещё где нить, выполняется некая ф-я masquerade, после неё получается что этот uniqueid уже будет соответствовать другому имени канала. Тогда можем получить следующее, операция masquerade выполнилась но по ami наша программа ещё не получил об этом информацию и шлёт например hangup в результате получаем редко возникающие глюки которые сложно отловить.
Так поделитесь секретом как читать быстро :!:
Я пробовал только метод регистрации функции обратного вызова, которая вызывается при обработке события.
в PhpAGI это:
Код: выделить все
add_event_handler($event, $callback)


Мне далеко до ваших проблем, я на с++ пишу. Текущий мой алгоритм парсинга ами вроде около 10000 событий в секунду (хотя могу немного врать, в хистори icq на работе цифра, вобщем для моих задач с большим запасом)
The asterisk is my hero
kasper
 
Сообщений: 199
Зарегистрирован: 03 авг 2011, 11:00

Re: originate, каналы и CDR - полный бардак

Сообщение Vslav1 » 22 ноя 2011, 17:42

Не всегда с помощью core show channels можно успеть посмотреть.
Вот ответ по AMI где чётко видно ДВА КАНАЛА:
Код: выделить все
        Asterisk Call Manager/1.0
        Response: Success Message: Authentication accepted
        Response: Success Message: Originate successfully queued
        Event: Newchannel Privilege: call,all Channel: Local/1234@international-fdb7,1 State: Down CallerIDNum: CallerIDName: Uniqueid: 1308317336.820
        Event: Newchannel Privilege: call,all Channel: Local/1234@international-fdb7,2 State: Ring CallerIDNum: CallerIDName: Uniqueid: 1308317336.821


И идентификатор Uniqueid у них разный и отличается на единицу.
Или я чего0то не понимаю и
Local/1234@international-fdb7,1
Local/1234@international-fdb7,2
это один и тот же канал,

Кстати раньше, в версии 1. 4 чтобы сделать отбой после успешного Originate достаточно было его послать Hangup для любого из каналов. А теперь в версии 1.6 нужно делать Hangup для третьего канала - переименованного.

А про "сразу узнать канал" имел в виду ответ, который сразу приходит после console dial (выделено цветом):

Action: Command
Command: console dial 1234@from-probe

Asterisk Call Manager/1.1
Response: Success
Message: Authentication accepted

Response: Follows
Privilege: Command
--END COMMAND--

Event: Newchannel
Privilege: call,all
SequenceNumber: 5243680
File: channel.c
Line: 972
Func: __ast_channel_alloc_ap
Channel: Console/dsp
ChannelState: 5
ChannelStateDesc: Ringing
CallerIDNum:
CallerIDName:
AccountCode:
Exten: 2709
Context: from-probe
Uniqueid: 1321968050.109670

А то, что использовать вместо переменной ИМЯ_КАНАЛА идентификатор Uniqueid нужно осторожно полностью согласен.

А какую AGI библиотеку на C++ используете, CAGI ?
Vslav1
 
Сообщений: 15
Зарегистрирован: 16 ноя 2011, 12:02

Re: originate, каналы и CDR - полный бардак

Сообщение kasper » 22 ноя 2011, 20:22

Ну наконец то мы дошли до той точки где произошло отклонение от существующий реалий.
Итак итог. Вы сообщаете что вам нравится использовать dial вместо originate. Уточняю именно Application dial, вызывая его через agi , которое вызываете из ami. Получаете следующую проблему что и для команд agi и для Application dial нужен канал с которым dial будет работать. Попрежднему продолжаете упорно идти в этом направлении, находите cli > console dial exten@context, который создаёт tech console канал и выполняет на нём контекст. Оправдываете это всё тем что Originate которому в параметрах передаёте tech local канал создаёт их 2.
Т.е. Вы считаете что вызов из ами cli команды "console dial exten@any-context" добавление в "any-context" async agi, обработка этого agi снова из ами, вызывая там application dial это всё лучше чем 2 канала? Но да ладно как хотите.
Создаётся впечатление что всё это ради того что бы поработать с ами.
А теперь к реалиям во первых к созданию 2-х local каналов originate не имеет никакого отношения, это особенность local, в этом его особенность реализации и обсуждение этого оффтоп, originate с console, sip, iax и прочими создаёт 1 канал,

Код: выделить все
Вот это
Action: Originate
Channel: Console/default
Context: any-context
Exten: anyexten
Priority: anypriority

как я уже писал сомневаюсь что сильно отличается от вашего console dial. Ами выше проверил, работает и канал создаётся 1

Далее uniqueid который вы получаете из event newchannel следующий за вашей командой "console dial 1234@from-probe", может быть создано вовсе не вашей командой, нет ну если вы конечно уверены что только она будет создавать console каналы то пожалуйста, делайте очередное ограничение.

И ради чего это всё если можно просто вызвать
Код: выделить все
Action: Originate
Channel: SIP/Provaider/НомерДляПроверки
Application: Hangup

И сразу в ответ на эту команду получить результат удалось дозвонится или нет.


Даже если предположить что метод выше неустраивает своей гибкостью а local тем что создаёт 2-й канал то async agi и вот это вот
Код: выделить все
"Потом через некоторое время узнаём статус канала так: Action: Status"

Вообще не в какие ворота, даже если вы используете свою команду "console dial exten@any-contex" application dial можно разместить в any-context и отправлять userevent при поднятии трубки с помощью опции M(x) а не делать диал в ami. Таким образом вам не нужно знать имя канала, вы можете завершить канал сразу как подняли трубку и сразу же узнаете о том что она поднята а не через некоторое время.
+ Ко всему вы пишете простое средство мониторинга и вас не устраивает 1 лишний канал или каллфайл? Такое впечатление что вы одновременно всю москву проверить хотите.

Вобщем Vslav1, на ваши вопросы мы вам ответили а ваше применение dial никуда не годится ИМХО.

Код: выделить все
А какую AGI библиотеку на C++ используете, CAGI ?

Свою
The asterisk is my hero
kasper
 
Сообщений: 199
Зарегистрирован: 03 авг 2011, 11:00

Re: originate, каналы и CDR - полный бардак

Сообщение Vslav1 » 23 ноя 2011, 11:34

Уважаемый kasper!
Вы всё свалили в одну кучу. А я рассматривал возможные РАЗНЫЕ способы создания исходящего звонка. :|

Один способ:
Код: выделить все
Вызов из ами cli команды "console dial exten@any-context"


Второй способ:
Код: выделить все
Добавление в "any-context" async agi, обработка этого agi снова из ами, вызывая там application dial


Я даже не предполагал, что можно в Originate указывать канал Сonsole !
Красиво :!:
Полностью согласен, что Ваш вариант оптимальный по простоте:
Код: выделить все
Action: Originate
Channel: Console/default
. . .
Vslav1
 
Сообщений: 15
Зарегистрирован: 16 ноя 2011, 12:02

Пред.

Вернуться в Разработка

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

© 2008 — 2024 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH