VIDEOCHAT  ::   FAQ  ::   Поиск  ::   Регистрация  ::   Вход

Realtime + cURL + PJSIP

Проблемы Asterisk без вэб-оболочек и их решения

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

Ответить
Severd
Сообщения: 16
Зарегистрирован: 03 мар 2016, 13:02

Realtime + cURL + PJSIP

Сообщение Severd »

Столкнулся с отсутствием подробной информации по настройке Realtime через cURL для PJSIP.
Основы, достаточно терпимо описаны в документации. Напишу под спойлер, минигайд.
PRIME_BBCODE_SPOILER_SHOW PRIME_BBCODE_SPOILER:
Если нужно брать аккаунты пользователей не из config-файла а откуда-то еще, да к тому-же динамически, пригодится Asterisk Realtime
Механизм Realtime на самом деле много что может, но меня интересует именно динамическая конфигурация аккаунтов.

Для этого в файле extconig.conf нужно прописать, откуда брать данные.

Дело еще усложняется тем, что данные нужно брать из не поддерживаемой базы данных, посредством скрипта.

Для этого используется cURL

Вообще, текущая конфигурация так и работает. Астериск обращается по http к скрипту на Perl. Скрипт лезет в базу, составляет конфигурацию sip-пира, и отдает Астериску. Так, динамически, "эмулируется" sip.conf
Но мне нужно перейти на стек PJSIP, а значит нужно работать с секциями pjsip.conf и магией sorcery.conf

Для этого нужно чтобы скрипт отдавал данные в формате секций PJSIP.
Прописываем транспорт в pjsip.conf
Смотрим, какие поля создаются в базах и отдаем в скрипте.

Запрашивать скрипт будем через http, поэтому положите его туда, где Апач сделает их доступными.

В extconfig.conf прописываем пути к скрипту(я сделал по одному для каждой секции). Минимум, нужно прописать три строчки: ps_endpoints, ps_auths, ps_aors. Если хочется передать параметры или авторизоваться, то используйте возможности cURL.

Но этого мало. Еще нужно в sorcery.conf прописать места загрузки секций.
Например так

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

aor=config,pjsip.conf,criteria=type=aor
auth=config,pjsip.conf,criteria=type=auth
endpoint=config,pjsip.conf,criteria=type=endpoint
aor=realtime,ps_aors
auth=realtime,ps_auths
endpoint=realtime,ps_endpoints
Смотрит сначала в конфиг файле. а потом лезем в скрипт.
Я думал, что если найдет в конфиге, то в скрипт не полезет... но вот фиг! Может я что-то не так сделал, но в скрипт лезет в любом случае.

В принципе все. Если сам pjsip правильно настроен - то должно заработать.
Настроил. Работает. Но...
PJSIP конфиг разбит на секции. Для реализации Realtime нужно прописать правила, откуда каждую секцию брать. После чего Астериск будет ОТДЕЛЬНЫМ http запросом брать данные по каждой секции, для каждого эндпоинта. А скрипт то будет каждый раз лезть в базу, чтоб вытащить разные поля по одной сущности. Можно ли как-то этого избежать используя возможности Астериск? Например заставить его брать данные для секций ENDPOINT, AOR, AUTH одним http запросом?

Судя по логам, запросы астериска выглядят так:

Дай все ENDPOINT что есть. -> Не дам, спрашивай по одному
Дай все AOR что есть. -> Не дам, спрашивай по одному
Дай все AUTH что есть. -> Не дам, спрашивай по одному
Дай ENDPOINT, что и так лежит в PJSIP.conf -> Не дам, смотри конфиг
Дай ENDPOINT по id@адрес, из базы. -> Держи.
Дай ENDPOINT по id, из базы. -> Держи.
Круто!
Дай этот-же ENDPOINT с тем-же id, из базы. -> Держи.
Дай AOR, из базы. -> Держи.
Дай AUTH, из базы. -> Держи.

И это еще цветочки. На самом деле Астериск почему-то спрашивает все дважды. По крайней мере, после очистки логов, я переподключил клиента к астериску, что привело к ВОСЬМИ! вызовам скрипта по URL. Четыре обращения к ENDPOINT (два по id@адрес), два AUTH и два AOR. А это ВОСЕМЬ запросов в базу на пустом месте.

Напоминаю, что в случае связки Realtime+cURL+SIP делался один вызов, инициирующий один запрос в базу. В случае Realtime+cURL+PJSIP это минимум 3 запроса, а по факту 8!

Надеюсь, что кто-то до меня заморачивался подобной ф... задачей. Буду рад подсказке по любой из проблем)
ded
Сообщения: 15628
Зарегистрирован: 26 авг 2010, 19:00

Re: Realtime + cURL + PJSIP

Сообщение ded »

Вряд ли кто-то заморачивался. Разве что на буржуйских ресурсах.
Задача дважды узкая: 1) realtime мало кто ставит; 2) PJSIP ещё не в массовом распространении.
Два специфических места в одно пятно.
Я бы не ставил это в production.
Severd
Сообщения: 16
Зарегистрирован: 03 мар 2016, 13:02

Re: Realtime + cURL + PJSIP

Сообщение Severd »

Ну, мне-то заморочиться пришлось.
Так-вот, все гораздо хуже, чем я думал...
Мало того, что он долбится в базу при каждом чихе, так еще обращается к ней поочереди из разных модулей Астериска!
Для борьбы с этим мракобесием, пришлось ввести кеширование запросов к секциям PJSIP.
Делается это в sorcery.conf
Посредством следующей записи:

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

;;; Asterisk realtime
[res_pjsip]
;;; for work with pjsip.conf
endpoint=config,pjsip.conf,criteria=type=endpoint
aor=config,pjsip.conf,criteria=type=aor
auth=config,pjsip.conf,criteria=type=auth
;;; for work with database
endpoint/cache = memory_cache,maximum_objects=200,expire_on_reload=yes,object_lifetime_maximum=60
endpoint=realtime,ps_endpoints
aor/cache = memory_cache,maximum_objects=400,expire_on_reload=yes,object_lifetime_maximum=3600
aor=realtime,ps_aors
auth/cache = memory_cache,maximum_objects=200,expire_on_reload=yes,object_lifetime_maximum=3600
auth=realtime,ps_auths
Подробнее о кешировании можно прочитать тут*.

PS: Если вы хотите что-бы realtime обращался к одному файлу-скрипту, а не к трем, то нужно переписывать исходный код астериска. Дело в том, что эта зараза, берет адрес скрипта из extconf.conf и тупо дописывает ему в конец, что заблогорассудится, наплевав на параметры которые вы хотели передать. (+++++/single?id=1234)
Severd
Сообщения: 16
Зарегистрирован: 03 мар 2016, 13:02

Re: Realtime + cURL + PJSIP

Сообщение Severd »

Правда и в этом случае без лукавого не обошлось. :evil:
Дело в том, что зарегистрированные таким образом Эндпоинты и т.д. не отображаются по команде "pjsip show endpoints"

Кто знает в чем дело? С ума же можно сойти! :?

ЗЫ: Авторизация/Звонки/обмен сообщениями работают нормально.
Ответить
© 2008 — 2025 Asterisk.ru
Digium, Asterisk and AsteriskNOW are registered trademarks of Digium, Inc.
Design and development by PostMet-Netzwerk GmbH