Захват SIP «200 OK» в скрипте Python Freeswitch

avatar
Ricardo
1 июля 2021 в 20:20
87
2
-1

Я пытаюсь запустить скрипт Python, используя "mod_python" на своем сервере FreeSwitch, чтобы проверить локальную базу данных REDIS. Пока мне удалось запустить скрипт из диалплана следующим образом:

  <condition field="destination_number" expression="^(.*)$" break="on-true">
    <action application="log" data="ORIGIN : ${caller_id_number}"/>
    <action application="set" data="did=$1"/>
    <action application="log" data="DID = $1"/>
    <action application="python" data="test"/>
    <action application="bridge" data="sofia/external/$1@10.X.X.1"/>
  </condition>

Сценарий Python выглядит примерно так:

import redis
from datetime import timedelta
import freeswitch

def handler(session, args):
    did = session.getVariable("did")
    llave = "k"+did
    cliente = redis.Redis(host='localhost', port=6379, db=0)
    resultado = cliente.get(llave)
    if resultado is None:
        freeswitch.consoleLog("INFO","DID no esta en cache, agregando a la BD + TTL 10 minutos")
        cliente.set(llave,did)
        cliente.expire(llave, timedelta(minutes=20))
    else:
        ttl = cliente.ttl(llave)
        freeswitch.consoleLog("INFO","DID en cache, TTL= %s segs\n" % ttl)
        freeswitch.consoleLog("INFO","Colgando llamada")
        session.hangup("21")

Все работает нормально. Что мне нужно сделать, так это «проверить/захватить», если на вызов ответили, чтобы внести изменения в базу данных REDIS. До сих пор я пытался добавить в скрипт что-то вроде этого:

if session.ready():
    // some work to do in REDIS
else:
    // no changes in REDIS DB

не повезло. Есть ли способ зафиксировать ответ на вызов в скрипте python?

Источник
May.D
1 июля 2021 в 20:26
0

Рикардо, донде эста ла кабеса?

Ricardo
1 июля 2021 в 20:40
0

Disculpa..no entendí eso...

Ответы (2)

avatar
Ricardo
15 июля 2021 в 14:42
0

Спасибо за подсказку. Наконец-то я нашел больше доступа к состояниям и переменным FreeSwitch с помощью сценариев LUA.... я решил эту проблему, написав небольшой сценарий LUA... команда, которую я искал, была:

if session:answered() then

с помощью этой команды я смог зафиксировать «200 OK» в случае ответа на вызов. Спасибо!

avatar
Lin Yu Cheng
15 июля 2021 в 00:37
0

Я думаю, вам следует попробовать вызвать "мост" в скрипте python вместо xml, например:

dn = session:getVariable("destination_number")
session.execute("bridge", "sofia/external/" + dn + "@10.X.X.1")