Есть Asterisk. Есть пользователи. Задача, написать декстопное приложение, которое будет показывать алерт при входящем и исходящем вызове пользователю. При этом мне надо знать телефон\имя пользователя кому звонят\кто звонит.
Собственно как это правильно делать?
1. Писать клиента для SIP (при этом будет ли это работать, если пользователь будет звонить через физический телефон, т.е. будет два подключения одного пользователя)? Вроде входящий должен буду я поймать, а вот исходящий?
2. Писать клиента к Asterisk Manager Interface, который будет подписываться на какие то события и я буду ловить инфу о том, что пользователь звонит\ему звонят.
3. Еще как то.
Думаю, что AMI - оптимальный вариант. Впоследствии, при желании можно будет наращивать функционал приложения.
Быстрое гугление по теме дало такой вариант: https://asternet.codeplex.com/releases/view/134917
интерфейсы AJAM2 или AMI - самый простой способ получить все что нужно
можно и без обработки event-ов через AMI получить
спросить (Action: Command)
core show channels
найти в выхлопе нужный канал внутреннего номера
затем
core show channel имя_канала
в выхлопе будет куча полей, в том числе и "Connected Line ID"
дольше отрабатывает, но вполне работоспособный способ
из велосипедов: XMPP, отправка специально формируемого UDP или TCP пакета на определенный адрес и порт
В том то и дело, что это должно работать в реальном времени. Идет звонок - пользователю инфа о звонке. Мне бы помогла инфа о том, какое именно событие мне надо отслеживать. Еще важно, что текущему пользователю не надо получать инфу о событиях другого пользователя, а события, насколько я понимаю, будут генерится без привязки к пользователю, и не хотелось бы вообще получать не нужные события.
Вы, насколько я понял, предлагаете периодически получать список каналов и обрабатывать результат. Да, если нельзя подписаться на события, то буду делать именно так. Но это не оптимально, зачем мне опрашивать астерикс постоянно.
что именно ловить проще узнать просто сделав пару вызовов
подписаться на определенные события нельзя
можно использовать eventfilter, для каждого логина
eventfilter=Event: Newchannel
eventfilter=!Channel: DAHDI*
можно использовать промежуточный прокси для событий
к perl написан модуль Asterisk::AMI в examples/event_proxy.pl лежит пример
можно попробовать наложить фильтры только на нужные события нужным клиентам
где-то ещё видел подобное