0

我是 Kamailio 4.3.1 的新手,我正在尝试按照此http://kb.asipto.com/kamailio:k43-async-sip-routing-nodejs页面上的说明使用它。显然,这是一种使用 NodeJS 进行异步路由的新方法。我对示例进行了一些修改,并使用 REGISTER sip 对其进行了调整,并且效果很好。但现在我正在寻找一种让事情变得更复杂的方法。在示例中,仅当收到 REGISTER 方法时才调用 NodeJS 例程。当“200 OK”从寄存器的目的地返回时,我正在尝试对 NodeJS 进行类似的异步调用。

如果我们有:

Alice---REGISTER(Alice)---> Kamailio (异步调用 NodeJs)---REGISTER(Alice)-->Asterisk

稍后当 Asterisk 接受 REGISTER 时,我想要这个:

Alice<---200 OK---Kamailio(对 NodeJS 的异步调用)<---200 OK---Asterisk

为了捕获 200 OK,我将 Kamailio 配置为使用 EVAPI 执行异步调用,如下所示:

request_route 
{
    ....
    route(REGISTRAR);
    ....
exit;
}

route[REGISTRAR]
{
    ...
    t_on_reply("2OO_OK_RSP"); # Here I tell that I want to catch the "200 OK"
    ...
exit;
}

# When the 200 OK arrives, this code is called
onreply_route[2OO_OK_RSP]
{
    # Here is my async call to NodeJS
    evapi_async_relay("send message to NodeJS about 200 OK");
}

#When NodeJS returns
event_route[evapi:message-received] 
{
    if(200 OK)
    {
        t_countinue("..", "...", RSP_200OK)
    }
}

route[RSP_200OK]
{
    t_on_branch("MANAGE_BRANCH");
    t_on_failure("MANAGE_FAILURE");

    route(RELAY); # I am trying here to relay the 200 OK, which finishes by calling t_relay();

    exit;
}

所以这是我处理 200 OK 的配置。我想说它可以工作(因为最后 200 Ok 被转发给 Alice)但是 Kamailio 记录了这条消息: tm [tm.c:1479]: _w_t_relay_to(): ERROR: w_t_relay_to: unsupported route type: 4

我不喜欢这样。我知道出了点问题,当我查看 Kamailio 的源代码时,很明显这不是处理“200 OK”之类的消息的正确位置。

我的问题是,一旦 NodeJS 回复,有没有其他方法(好方法)来中继/路由 200 OK?我也试过

t_reply("200","OK"); instead of t_relay();

但这会生成一条 SIP 消息“200 OK”,其中不包含 Asterisk 收到的消息的所有内容。可能我可以告诉 Kamailio 回复完全相同的 200 OK,它刚刚收到?先感谢您!

此致,

安东

4

2 回答 2

0

所以最后我可以找到如何部分解决我的问题。我发现模块 EVAPI 提出了一个名为 evapi_relay() 的方法,它不会暂停当前事务,而是向 NodeJS 应用程序发送消息并立即中继 SIP 消息。我说这部分解决了我的问题,因为但是我仍然无法通过暂停交易来完成整个过程(没有 Kamailio 错误)。就我而言,它并不那么重要,但我想在某些情况下问题会持续存在。

安东

于 2015-10-27T10:56:20.223 回答
-1

来自 EVAPI 模块文档:在 evapi_async_relay() 返回 true 后,request_route() 中不应发生中继,应在其后退出。

将作为参数提供的事件数据中继到连接的应用程序。在评估参数之前,使用 tm 模块(使用t_suspend()/t_continue()框架)暂停请求处理。event_route[evapi:message-received]SIP请求的路由一旦被触发就可以继续。返回true后evapi_async_relay(),不应在中进行中继request_route(),应在exit;之后进行。

于 2016-09-27T00:07:41.827 回答