Я новичок в Asterisk. Мое требование заключается в том, что когда я получаю вызов, мне нужно идентифицировать идентификатор вызывающего абонента и открыть этот идентификатор при ответе на вызов. У меня есть некоторые знания в AMI и AGI. Я хочу знать, как я могу сделать это, используя скрипт php.
Любой пример или что-то, что я могу использовать, чтобы сделать это, пожалуйста, приложите здесь.
Многое из этого зависит от версии Asterisk, которую вы используете. Я бы порекомендовал использовать Asterisk 13, так как он является LTS и имеет более приятные события AMI, чем другие версии.
Здесь есть два подхода. Во-первых, использовать AMI, который будет перенаправлять события через TCP-сокет. Второе — использовать AGI, в частности FastAGI, который даст вашему удаленному приложению контроль над каналом. В этом приложении вы можете самостоятельно извлечь идентификатор вызывающего абонента.
Если вы решите использовать AMI, вы должны прослушивать два события: Newchannel — который поднимается при создании канала — и Newcallerid — которая возникает при изменении идентификатора участника канала. Это должно охватывать подавляющее большинство времени, когда меняется идентификация абонента, и предоставлять вам как идентификатор вызывающего абонента канала, так и информацию о подключенной линии, которая является идентификатором стороны, с которой разговаривает этот канал.
Вам не нужно ссылочного вложенного события в Мост событие (которое не существует в 13, и заменяется BridgeEnter/BridgeLeave события) — это то, что я думаю, что Археопс имел в виду. Ссылка активируется только тогда, когда канал «связан» с другим каналом моста и не имеет отношения к идентификатору вызывающего абонента. Идентификация стороны может измениться в этой ситуации, но это будет передано в событии NewcallerId, так что слушать его бессмысленно.
Кроме того, вы можете использовать FastAGI. Если вы пойдете по этому маршруту, вы захотите, чтобы в вашем плане набора было что-то, что вызывает ваш сервер FastAGI:
exten => _X.,1,NoOp()
same => n,AGI(agi://127.0.0.1)
same => n,...
В вашем сценарии — который может быть написан на разных языках, учитывая количество Библиотеки AGI доступны — вы можете извлечь CallerID, используя получить переменную командование и CallerID функция. Ниже приведен пример в файле node.js:
return agi.getFullVariable('${CALLERID(NUMBER)}').then(function (number) {
callerId.number = number;
return agi.getFullVariable('${CALLERID(NAME)}');
}).then(function (name) {
callerId.name = name;
Кроме того, ничто из этого не является «экспертным» уровнем манипулирования звездочкой. Это просто требует некоторого программирования и базового понимания API Asterisk. Удачи!
Если вы новичок в asterisk, вы можете использовать уже разработанное программное обеспечение, например asternic fop / fop2. Это позволяет делать всплеск с Callerid при входящем звонке, и я уверен, что будет проще, если это будет работать.
Если вы все еще хотите сделать это через звездочку, вы должны следить за событием «ссылка». Однако в этом событии не будет никакого callerid, поэтому вы также искали события «NewChannel» и «set» расширения с CALLERID (num) = что-то, что изменит callerid.
Вы можете связать события, используя канал uniqueid.
Эта задача не тривиальна и требует опыта в php.
Также вы можете изменить звездный план набора звёзд, чтобы инициировать действие UserEvent с информацией, необходимой для ответа на вызов, после этого просто собирайте UserEvents. Это требует высокой экспертизы в диалплане звездочек и низкого уровня php.
Если вам подходит всплывающее окно в браузере, я предлагаю использовать websocket для уведомления веб-страницы о новом вызове (со всеми параметрами).
Вы можете сделать это, прослушивая события AMI и отправляя данные в браузеры с помощью nodejs, при этом вы можете избежать опроса на сервер Asterisk, чтобы проверить, получен ли ответ на вызов.
Посмотрите на этот код:
https://www.backloop.biz/en/products/asterisk-call-notifier-en