我是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,刚收到它? 提前谢谢!
致以最诚挚的问候,
安东
答案 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()
中不会发生转发,应该退出;。