Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Архитектура Asterisk

IqTek
September 26, 2019

Архитектура Asterisk

Модульность - простота подключения новой функциональности
Абстрактность - все модули используют единые абстрактные интерфейсы и взаимодействуют без знания технологий

IqTek

September 26, 2019
Tweet

More Decks by IqTek

Other Decks in Programming

Transcript

  1. Конференция AsterConf 2017 Общий обзор • Модульность - простота подключения

    новой функциональности • Абстрактность - все модули используют единые абстрактные интерфейсы и взаимодействуют без знания технологий и Гончаровский Игорь Архитектура Asterisk
  2. Конференция AsterСonf 2017 История развития Гончаровский Игорь Архитектура Asterisk •

    Списки - asterisk 0+. Автор - Марк Спенср • Astobj - 2004 год. Атор - Asterisk Team • Astobj2 - 2007 год. Автор - Луиджи Риззо
  3. Конференция AsterСonf 2017 Минусы реализаций Гончаровский Игорь Архитектура Asterisk •

    Медленный доступ • Сложность в понимании • Возможность случайных ошибок • Контейнер - одно- и дву- направленные списки • Полное отсутствие докуметации
  4. Конференция AsterСonf 2017 astobj2 Гончаровский Игорь Архитектура Asterisk • Код

    прошел core review • Реализованы деревья и хэш-таблицы • Не используются макросы • Документирование кода
  5. Конференция AsterСonf 2017 astobj2 (пример) Гончаровский Игорь Архитектура Asterisk ao2_alloc(sizeof(*obj),

    destroy_foo); obj->bar = ast_strdup(bar); obj->baz = ast_strdup(baz); • ao2_ref(obj, +1) • ao2_ref(obj, -1) • ao2_cleanup(obj)
  6. Конференция AsterСonf 2017 astobj2_container (пример) Гончаровский Игорь Архитектура Asterisk •

    hash_table = ao2_container_alloc(13, foo_hash, /* хэш-функция */, foo_cmp /* сравнение */); • rb_tree = ao2_container_alloc_rbtree( AO2_ALLOC_OPT_LOCK_RWLOCK, /* AO2 флаг объекта*/ AO2_CONTAINER_ALLOC_OPT_DUPS_REJECT, /* AO2 флаг контейнера */ foo_sort, /* функция сортировки */ foo_cmp) /* функция сравнения */ • linked_list = ao2_container_alloc_list(0, /* AO2 флаг объекта */ AO2_CONTAINER_ALLOC_OPT_INSERT_BEGIN, /* AO2 флаг контейнера */ NULL, /* функция сортировки */ foo_cmp); /* Функция сравнения */
  7. Конференция AsterСonf 2017 Модули asterisk Гончаровский Игорь Архитектура Asterisk •

    Драйвер канала • Приложение • Функция диалплана • Ресурс • Кодек • Формат • CDR • CEL • Bridge Уровень поддержки: • core • extended • deprecated
  8. Конференция AsterСonf 2017 Задачи Гончаровский Игорь Архитектура Asterisk • Коммутация

    • Прикладные задачи • Планирование задач и каналов ввода/вывода • Операции кодирования
  9. Конференция AsterСonf 2017 API Гончаровский Игорь Архитектура Asterisk • Channel

    API • Bridging Framework • Application API • Asterisk Realtime Architecture • Codec translator API • File format API
  10. Конференция AsterСonf 2017 Channel API Гончаровский Игорь Архитектура Asterisk Каждый

    канал: • Собственная pvt структура • Отдельный поток выполнения ◦ Для выполнения pbx ◦ Для исходящего вызова
  11. Конференция AsterСonf 2017 Bridging Гончаровский Игорь Архитектура Asterisk Комментарий к

    ast_do_masquarade(): /* XXX This operation is a bit odd. We're essentially putting the guts of * the clone channel into the original channel. Start by killing off the * original channel's backend. While the features are nice, which is the * reason we're keeping it, it's still awesomely weird. XXX */
  12. Конференция AsterСonf 2017 Masquarading Гончаровский Игорь Архитектура Asterisk • Сложный

    код, охватывающий большой объем подситем • Сложности при работе с AMI • Возможные блокировки • Любое изменени может сломать: ◦ Пакрковки ◦ Переводы вызова ◦ Прослушивание ◦ и т.п.
  13. Конференция AsterСonf 2017 Bridging API Гончаровский Игорь Архитектура Asterisk •

    Замена masquarading • Затрачено 10 человеко/лет • Bridge только отслеживает состояние каналов • Стратегия микширования - отдельный мараметр • Встроенные функции для перевода вызова • AMI события BridgeEnter, BridgeLeave
  14. Конференция AsterСonf 2017 Bridging API Гончаровский Игорь Архитектура Asterisk Базовые

    сценарии: • Соединение двух каналов (bridge_simple) • Конференция (bridge_softmix) • Native Briging (bridge_native_rtp, bidge_native_dahdi) • features.conf features • Парковка (bridge_holding) • Оптимизация Local каналов
  15. Конференция AsterСonf 2017 Bridging API Гончаровский Игорь Архитектура Asterisk Как

    результат: • Отказ от masquarading • Замена для MeetMe • Замена для chan_agent • Шина Stasis (AMI/CEL/CDR) • ARI • Уменьшение количества блокировок • Улучшения в логике Local каналов
  16. Конференция AsterСonf 2017 Гончаровский Игорь Архитектура Asterisk Аня PJSIP/ann-1 chan_pjsip

    context=internal Диалплан pbx_config Функции Приложения func_* app_*
  17. Конференция AsterСonf 2017 Гончаровский Игорь Архитектура Asterisk Аня PJSIP/ann-1 chan_pjsip

    context=internal Диалплан pbx_config Функции Приложения func_curl app_playback res_curl format_gsm
  18. Конференция AsterСonf 2017 Гончаровский Игорь Архитектура Asterisk Аня PJSIP/ann-1 chan_pjsip

    context=internal Диалплан pbx_config Приложения app_dial IAX2/max-2 bridge_simple
  19. Конференция AsterСonf 2017 Гончаровский Игорь Архитектура Asterisk Аня PJSIP/ann-1 chan_pjsip

    context=internal Диалплан pbx_config IAX2/max-2 bridge_simple Stasis CDR CEL AMI ARI
  20. Конференция AsterСonf 2017 Гончаровский Игорь Архитектура Asterisk Аня PJSIP/ann-1 chan_pjsip

    context=internal Диалплан pbx_config IAX2/max-2 bridge_simple Stasis CDR CEL AMI ARI codec_opus codec_g729
  21. Конференция AsterСonf 2017 Встроенные ограничения Гончаровский Игорь Архитектура Asterisk •

    1024 byte limitation in AGI for request size • 255 символов на строку • 3Кб на запись CDR • 10 параллельных запросов CURL • Синтаксис диалплана ◦ ExecIf($[1 = 0]?NoOp(${CURL(http://rocket-launch)})) и т.п.