Это зависит от версии Asterisk, которую вы используете. Я бы рекомендовал использовать Asterisk 13, так как это как LTS, так и более приятные события AMI, чем другие версии.
Существует два подхода, которые вы можете предпринять здесь. Первое - использовать AMI, который будет проливать события на вас через TCP-сокет. Второй - использовать AGI, в частности FastAGI, который даст вашему удаленному управлению приложениями канал. В этом приложении вы можете самостоятельно извлечь Caller ID.
Если вы решили использовать AMI, вы должны в основном прослушивать два события: Newchannel - который поднимается при создании канала - и Newcallerid - который поднимается, когда изменяется идентификация стороны канала. Это должно охватывать большую часть времени, когда меняется идентификация участника, и должен предоставить вам как идентификатор вызывающего абонента канала, так и информацию о подключенной линии, которая является идентификатором стороны стороны, с которой разговаривает канал.
Вы не должны нуждаться в подсобытий Link в Bridge случае (который не существует в 13, и заменяется BridgeEnter/BridgeLeave событий) - что то, что я думаю, что Arheops имел в виду. Ссылка возникает только тогда, когда канал «связан» с другим каналом в мосту и не имеет отношения к идентификатору вызывающего абонента. Идентификация партии может измениться в этой ситуации, но это будет передано в событии NewcallerId, поэтому ее бессмысленно слушать.
В качестве альтернативы вы можете использовать FastAGI. Если вы идете по этому пути, вы хотите, чтобы в вашем диалплане то, что вызывает ваш FastAGI сервер:
exten => _X.,1,NoOp()
same => n,AGI(agi://127.0.0.1)
same => n,...
В вашем сценарии - которые могут быть записаны в большом разнообразии языков, учитывая количество AGI libraries доступны - вы можете извлечь CallerID с помощью команды get variable и функции 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. Удачи!
Я encoradge использовать уже разработанные мягкой, если я не вижу никакого понимания звездочки в вопросе. – arheops