Kamailio 4.3.1注册/ 200 OK asycnhornous

时间:2015-10-26 16:25:19

标签: node.js asynchronous routing sip kamailio

我是Kamailio 4.3.1的新手,我正在尝试使用此http://kb.asipto.com/kamailio:k43-async-sip-routing-nodejs页面上所述的内容。显然,这是一种使用NodeJS进行异步路由的新方法。 我修改了一些示例并使用REGISTER sip对其进行了修改,它的工作原理相当不错。但现在我正在寻找一种让事情变得更复杂的方法。 在示例中,仅在收到REGISTER方法时才调用NodeJS例程。我想在' 200 OK'时尝试对NodeJS进行类似的异步调用。从REGISTERS的目的地回来。

如果我们有:

爱丽丝--- REGISTER(爱丽丝)---> 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():错误:w_t_relay_to:不支持的路由类型:4

我不喜欢这样。我知道有些问题,当我查看Kamailio的源代码时,很明显这不是处理像#34; 200 OK"这样的消息的正确位置。

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

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

但这会产生一条SIP消息" 200 OK"它不包含Asterisk收到的所有消息。也许我可以告诉Kamailio回复完全相同的200 OK,刚收到它? 提前谢谢!

致以最诚挚的问候,

安东

2 个答案:

答案 0 :(得分:0)

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

安东

答案 1 :(得分:-1)

From EVAPI module documentation:在evapi_async_relay()返回true之后,request_route()中不会发生中继,应该退出。

  

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