2016-09-14 9 views
-1

У меня есть следующая функция с целью получить входящие звонки с моего веб-интерфейса Python с сервера Asterisk.Asterisk AMI входящие вызовы не вызывают звонки

def fetch_events(event, manager): 

with app.app_context(): 

    if event.name == 'CoreShowChannel': 
     id = event.message['accountcode'] 
     data = { 
       'user_id': id, 
       'caller_id': event.message['CallerIDnum'], 
       'channel': event.message['Channel'], 
       'duration': event.message['Duration'], 
       'context': event.message['Context'], 
       'extension': event.message['Extension'], 
       'line': event.message['ConnectedLineNum'], 
       #'channel_state': event.message['ChannelState'], 
       'channel_state': event.message['ChannelStateDesc'], 
       } 
     user = System().getUserById(id) 
     if user: 
      profile = { 
         'firstname': user['firstname'], 
         'lastname': user['lastname'] 
         'email': user['email'] 
        } 

     else: 
      profile = { 
         'first_name': "No firstname", 
         'last_name': "No lastname" 
        } 
     data.update(profile) 
     g.channels.append(data) 
    if event.name == 'CoreShowChannelsComplete': 
     g.complete = True 

    if not event.name: 
     data = { 
      "connectivity":"Not connected", 
      "event-name":"No event name" 
     } 
     g.channels.append(data) 
     g.complete = True 


    @app.route('/incoming-calls') 
    def incoming_calls(): 
    /**** I have already login and connect *****/ 
    g.channels = [] 
    g.complete = False 
    manager.register_event('*', fetch_events) 
    res = manager.send_action({'Action':'CoreShowChannels'}) 

    try: 

     while not g.complete: 

      time.sleep(0.5) 
     manager.close() 
     return json.dumps(g.channels) 

Но когда я пытаюсь получить события входящих вызовов после регистрации метода handle_event, я получаю пустой массив. Кажется, что что-то не так с методом handle_event, но я не могу его найти.

ответ

0

Вы должны использовать (прослушивать) событие «Newexten» и извлекать «контекст» из этого события, а затем искать, если вызовы поступают из входящего контекста, если это правда, а затем использовать другие переменные из этого события. Не используйте действие «CoreShowChannel», потому что оно будет отображать текущие активные каналы.

+0

Пожалуйста, Милорад, не могли бы вы лучше объяснить мне код. Я до сих пор не понимаю тебя. – Oladapo

+0

И даже CoreShowChannel, который я сейчас использую, не показывает активных вызовов. – Oladapo

+0

Мне нужно проверить имя события как это -> if event.name == 'Newexten', зарегистрировать и отправить действие вроде этого -> manager.register_event ('*', handle_event) res = manager.send_action ({ Action ':' Newevent '}) – Oladapo

0

Когда кто-то звонит в Asterisk, например, входящий вызов на номер строки, Asterisk запускает событие Newexten. Структура данных этого события:

`{ event: 'Newexten', 
    privilege: 'call,all', 
    channel: 'SIP/NameOfyourSIPprovider-0000ae7d',//channel that will be bridged 
    channelstate: '0', 
    channelstatedesc: 'Down',//the channel is currently down because no one is answered 
    calleridnum: '060444333',// num of calling party 
    calleridname: '<unknown>', 
    connectedlinenum: '+34312345678',//your trunk num 
    connectedlinename: '<unknown>', 
    language: 'en', 
    accountcode: '', 
    context: 'from-trunk',//context(extensions.conf) for incoming calls 
    exten: '060444333',//num of calling party 
    priority: '1', 
    uniqueid: '1471265139.357602',//unique id of channel 
    linkedid: '1471265138.357596',//linked id of channel that will be bridged 
    extension: '060444333',//num of calling party 
    application: 'AppDial', 
    appdata: '(Outgoing Line)' }` 
+0

Oladapo вы должны прочитать этот документ https://wiki.asterisk.org/wiki/display/AST/AMI+v2+Specification, чтобы понимать поток вызовов и протокол AMI. Я лично использую Node.js для управления AMI. Я не знаком с интерфейсом python и AMI. –

+0

Милорад, Когда я звонил, он еще не в режиме производства, и я получаю IVR, как вы думаете, это может быть причиной. Потому что, даже когда я использую CoreShowChannel, я не получаю активных объектов вызовов. – Oladapo

+0

. Моя проблема в том, какое событие я регистрирую и отправляю действие, если вы посмотрите на мой исходный код на github https://github.com/Pinsonbavard/myproject/блоб/ведущий/звездочка/ами. Я знаю, что должен зарегистрировать регистрацию (*) для обозначения всех и отправить действие – Oladapo

Смежные вопросы