Как при регистрации/отключении определённого SIP-peer'а, запустить определённую shell-команду?
Есть смартфон, регистрирующийся на домашнем asterisk'e через sip по wi-fi. Смартфон подключен к Мегафону. К этому мегафоновскому номеру привязан Мультифон, который так же зарегистрирован на Asteriskе для входящих/исходящих звонков. В Мультифоне есть возможность принимать звонки на телефон (через GSM), либо через SIP (на Asterisk). Режим приёма звонков можно изменить, отправив https-запрос мегафоновскому серверу определённого вида (описано тут - http://multifon.ru/publications/settings_sip/index.html).
Хочу следующего. Зарегистрировался на сервере - мегафоновские звонки идут на SIP, отключился от сервера - звонки идут снова через GSM. Т.е. при регистрации/отключении SIP-клиента на сервере с * нужно запускать shell-команду, отправляющую http-запрос. Вижу способ некрасивый: периодически опрашивать из консоли sip show peers и потом парсить его. Думаю, есть какое-то более правильное решение. Подскажите пожалуйста.
_________________
Debian 6 "Squeeze" (2.6.32-5-686), * 1.8.9.0, C470IP & SPA2102, PCI 4xUSB 2.0, 2xHuawei E1550 unlocked
Почитайте о AMI тут.
http://www.voip-info.org/wiki/view/Asterisk+manager+API
| Grigoriy писал(а): |
| Можно конечно подключится по сокету в AMI и просто ждать нужного сообщения "ХХХ Подключился" или "ХХХ отключился" Почитайте о AMI тут. |
Спасибо за ответ.
Но мне кажется всё равно такое решение больше похоже на костыль и не сильно отличается от того, что я собирался сделать через sip show peers. Неужели никакого встроенного обработчика событий в * нет?
_________________
Debian 6 "Squeeze" (2.6.32-5-686), * 1.8.9.0, C470IP & SPA2102, PCI 4xUSB 2.0, 2xHuawei E1550 unlocked
asterisk_peer_check.sh
| Код: |
| #!/bin/bash # My SIP-smartphone peer peer=$1 path="/var/spool/asterisk/tmp" peer_state_last_file="$path/peer_state_$peer" #Multifon account multifon_login="7922XXXXXXX@multifon.ru" multifon_password="mypassword" # Jabber account for report xmpp_jid="jid@jabberserver.com" xmpp_bin="/usr/bin/sendxmpp" #getting actual peer state from asterisk peer_state_now=`asterisk -rx "sip show peers" | grep -i $peer | awk '{print $2}'`; #getting previous state of peer from file if [ -f "$peer_state_last_file" ]; then peer_state_last=`cat $peer_state_last_file` else #first run peer_state_last=$peer_state_now fi if [ "$peer_state_now" != "$peer_state_last" ] then #peer status changed if [ "$peer_state_now" = "(Unspecified)" ] then #GSM-2-GSM multifon_routing="0" else #GSM-2-SIP multifon_routing="1" fi #changing multifon status multifon_url="https://sm.megafon.ru/sm/client/routing/set?login=$multifon_login&password=$multifon_password&routing=$multifon_routing" w3m $multifon_url >/dev/null #jabber announce test ! -x $xmpp_bin || ( echo "[`hostname`] Asterisk: Megafon incoming calls set to $multifon_routing" | $xmpp_bin -i $xmpp_jid ) fi #writing actual peer state in file echo $peer_state_now > $peer_state_last_file |
| Код: |
| # Каждую минуту проверять подключение смартфона по Wi-Fi. * * * * * root /etc/cron/asterisk_peer_check.sh mywifipeer |
_________________
Debian 6 "Squeeze" (2.6.32-5-686), * 1.8.9.0, C470IP & SPA2102, PCI 4xUSB 2.0, 2xHuawei E1550 unlocked
С помощью USSD-комманды можно запросить сколько минут ещё осталось. Но остаток минут нужно как-нибудь засунуть в AstDB - Asterisk ведь должен знать сколько минут осталось а не я.
Как решить проблему?
Я вижу две возможности: взять chan_datacard и спрашивать через USSD, но это значит использовать модем только для этой цели: как то некрасиво.
Вторая возможность: Астер должен как-то залазить в СервисГид - там тоже написан остаток минут.
Или есть ещё какие-нибудь возможности?
а есть возможность автоматом совершить звонок на определенный ext при регистрации?
и где бы про эвенты почитать которые юзаються при регистрации?
_________________
ася #643888492