Realtime + cURL + PJSIP
Добавлено: 04 апр 2016, 13:21
Столкнулся с отсутствием подробной информации по настройке Realtime через cURL для 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!
Надеюсь, что кто-то до меня заморачивался подобной ф... задачей. Буду рад подсказке по любой из проблем)
Основы, достаточно терпимо описаны в документации. Напишу под спойлер, минигайд.
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 прописать места загрузки секций.
Например так
Смотрит сначала в конфиг файле. а потом лезем в скрипт.
Я думал, что если найдет в конфиге, то в скрипт не полезет... но вот фиг! Может я что-то не так сделал, но в скрипт лезет в любом случае.
В принципе все. Если сам pjsip правильно настроен - то должно заработать.
Механизм 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!
Надеюсь, что кто-то до меня заморачивался подобной ф... задачей. Буду рад подсказке по любой из проблем)