RestComm SIpServlet - 作为IMS网络中的应用服务器的Sip Servlet

时间:2017-10-06 08:46:11

标签: restcomm mobicents-sip-servlets sip-servlet ims

我正在尝试使用RestComm SipServlet开发IMS应用程序服务器。 最初我的目标只是在调用流中插入AS而不做任何特殊操作。 enter image description here

应用程序服务器只需要doStuff并转发初始邀请。 问题是RestComm的sip堆栈没有从Invite addind中删除Route到路由头,因此邀请被路由到AS再次生成一个循环。 当我尝试编辑SipRequest删除Route Header时,由于我无法修改系统头,因此AS回答为500。

这是一段代码

Route::group(['middleware' => 'auth'], function () {
     # Notifications
    Route::group(['prefix' => 'notification'], function () {
        Route::post('show/{show}', 'NotificationController@show']);
        Route::post('number', 'NotificationController@number']);
        Route::post('all ', 'NotificationController@all']);
    });
});

}

我疯了:/ 希望有人能给我一些建议......

3 个答案:

答案 0 :(得分:0)

我也是Sip Servlets的新手,但是当我阅读我在这个信息上遇到的文档时:

"路由修饰符,由以下字符串之一组成:ROUTE,ROUTE_BACK或NO_ROUTE。路由修改器与路由信息一起用于在外部路由请求。"与mobicents-dar.properties相关。

也许有帮助。

答案 1 :(得分:0)

不太可能我仍在努力解决原始问题。我一直在检查Bartek给我的提示。不幸的是,文档很差,可能我完全不了解它。 无论如何,我将分享我的结果操纵dar属性文件。 定义取自SipServlet Specification v1.1

ROUTE 修饰符表示SipApplicationRouterInfo.getRoutes()返回有效路由。由容器决定它们是外部的还是返回内部路径。返回的所有路由必须是相同的类型,因此容器可以通过仅检查第一条路径来进行确定。

    2017-10-10 15:55:01,372 ERROR [SipApplicationDispatcherImpl] (pool-AffinityJAIN-thread-1) Unexpected exception while processing request 
    INVITE sip:test2@mydomain.net SIP/2.0
    Via: SIP/2.0/TCP 10.39.117.121:50302;rport=50302;branch=z9hG4bKPj921L-Q-IghWuH.rSX.uNoNMh9T7gZilB;received=10.39.117.121
    Via: SIP/2.0/TCP 10.39.117.93:6560;received=10.39.117.93;branch=z9hG4bK+aa78dad05a4a559d9e4635f37906172a1+sip+5+a64ded2b
    Route: <sip:moby@moby.dev.mydomain.sys;lr>
    Route: <sip:odi_6fWaVvB68v@10.39.117.121:5054;lr;orig>
    Record-Route: <sip:sprout.dev.mydomain.sys:5054;transport=TCP;lr;service=scscf;billing-role=charge-orig>
    Record-Route: <sip:10.39.117.93:6560;lr>
    From: "itsme" <sip:test_1@mydomain.net>;tag=10.39.117.93+5+2cdeefc2+8fc7709c
    To: <sip:test2@mydomain.net>
    CSeq: 1 INVITE
    Expires: 180
    Call-Info: <sip:10.39.117.93:6560>;method="NOTIFY;Event=telephone-event;Duration=2000"
    P-Charging-Function-Addresses: ccf=pri_ccf_address
    Supported: outbound,path,replaces
    P-Charging-Vector: icid-value="0be3bd9333dd5089baf80bf17225e3d6";orig-ioi=mydomain.net
    Contact: <sip:test_1@195.130.246.72:46973;transport=tcp;rinstance=e637627c20b12d87;ob>;+sip.instance="<urn:uuid:968fdfa1-95d3-59cb-acb3-403d721daeee>"
    P-Asserted-Identity: <sip:test_1@mydomain.net>
    Max-Forwards: 68
    Call-ID: 0gQAAC8WAAACBAAALxYAAOYHyDdZmVO7ntMtj/uEnAYHN75Z51iTlNo7aI6WHcJ6VqorSJqCC0eLxClj9KOJnw--@10.39.117.93
    Allow: SUBSCRIBE,NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS
    User-Agent: X-Lite release 5.0.1 stamp 86895
    P-Visited-Network-ID: perim.dev.ims.ext1.net
    Accept: application/sdp,application/dtmf-relay
    Session-Expires: 600
    P-Served-User: <sip:test_1@mydomain.net>;regstate=reg;sescase=orig
    Content-Type: application/sdp
    Content-Length: 281

    v=0
    o=- 14048926850737 14048926850737 IN IP4 10.39.117.93
    s=-
    c=IN IP4 10.39.117.93
    t=0 0
    m=audio 45234 RTP/AVP 120 0 101
    a=sendrecv
    a=rtpmap:120 opus/48000/2
    a=rtpmap:101 telephone-event/8000
    a=fmtp:120 useinbandfec=1; usedtx=1; maxaveragebitrate=64000
    a=fmtp:101 0-15

    org.mobicents.servlet.sip.core.DispatcherException: Impossible to parse the route returned by the application router into a compliant address
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.checkRouteModifier(InitialRequestDispatcher.java:575)
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.dispatchMessage(InitialRequestDispatcher.java:299)
            at org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl.processRequest(SipApplicationDispatcherImpl.java:927)
            at gov.nist.javax.sip.EventScanner.deliverRequestEvent(EventScanner.java:250)
            at gov.nist.javax.sip.EventScanner.deliverEvent(EventScanner.java:146)
            at gov.nist.javax.sip.SipProviderImpl.handleEvent(SipProviderImpl.java:185)
            at gov.nist.javax.sip.DialogFilter.processRequest(DialogFilter.java:1328)
            at gov.nist.javax.sip.stack.SIPServerTransactionImpl.processRequest(SIPServerTransactionImpl.java:851)
            at gov.nist.javax.sip.stack.ConnectionOrientedMessageChannel.processMessage(ConnectionOrientedMessageChannel.java:473)
            at gov.nist.javax.sip.parser.NioPipelineParser$Dispatch.run(NioPipelineParser.java:132)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
            at gov.nist.javax.sip.MDCScheduledTHExecutor$MDCFuture.run(MDCScheduledTHExecutor.java:57)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)
    Caused by: java.text.ParseException: :Bad address spec
            at gov.nist.javax.sip.parser.Parser.createParseException(Parser.java:45)
            at gov.nist.javax.sip.parser.AddressParser.address(AddressParser.java:120)
            at gov.nist.javax.sip.parser.StringMsgParser.parseAddress(StringMsgParser.java:328)
            at gov.nist.javax.sip.address.AddressFactoryImpl.createAddress(AddressFactoryImpl.java:124)
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.checkRouteModifier(InitialRequestDispatcher.java:537)
    ... 17 more

我还尝试使用route字段指向IMS节点以转发SIP消息。它可以工作,但我认为这样就不会在Record-Route头中添加AS而导致循环。

ROUTE_BACK 指示容器在推送从SipApplicationRouterInfo.getRoutes()获取的外部路由之前推送自己的路由。 应用程序路由器行为

在这种情况下,我有以下错误,AS回答为500。

    2017-10-10 15:52:57,276 ERROR [SipApplicationDispatcherImpl] (pool-AffinityJAIN-thread-14) Unexpected exception while processing request 
    INVITE sip:test2@mydomain.net SIP/2.0
    Via: SIP/2.0/TCP 10.39.117.121:43312;rport=43312;branch=z9hG4bKPj5IBDrImFUbO1J.J1LrwUcUQ-rsT28TRh;received=10.39.117.121
    Via: SIP/2.0/TCP 10.39.117.93:6560;received=10.39.117.93;branch=z9hG4bK+84bf75e3c2c4ccae314be5e5849bd4961+sip+3+a64ded21
    Route: <sip:moby@moby.dev.mydomain.sys;lr>
    Route: <sip:odi_kMFF/TQSEV@10.39.117.121:5054;lr;orig>
    Record-Route: <sip:sprout.dev.mydomain.sys:5054;transport=TCP;lr;service=scscf;billing-role=charge-orig>
    Record-Route: <sip:10.39.117.93:6560;lr>
    From: "Gennaro" <sip:test_1@mydomain.net>;tag=10.39.117.93+3+7334eef2+84ee6a06
    To: <sip:test2@mydomain.net>
    CSeq: 1 INVITE
    Expires: 180
    Call-Info: <sip:10.39.117.93:6560>;method="NOTIFY;Event=telephone-event;Duration=2000"
    P-Charging-Function-Addresses: ccf=pri_ccf_address
    Supported: outbound,path,replaces
    P-Charging-Vector: icid-value="4167d34dd3fb232bb1f5fcf458dc1a9e";orig-ioi=mydomain.net
    Contact: <sip:test_1@195.130.246.72:46973;transport=tcp;rinstance=e637627c20b12d87;ob>;+sip.instance="<urn:uuid:968fdfa1-95d3-59cb-acb3-403d721daeee>"
    P-Asserted-Identity: <sip:test_1@mydomain.net>
    Max-Forwards: 68
    Call-ID: 0gQAAC8WAAACBAAALxYAAK2OW7qCKhw2LAbw9q+UyCfK2Js5PtCkUUpQsljED2+H/KOnkWSV97W3n9Uqpa3r4w--@10.39.117.93
    Allow: SUBSCRIBE,NOTIFY,INVITE,ACK,CANCEL,BYE,REFER,INFO,OPTIONS
    User-Agent: X-Lite release 5.0.1 stamp 86895
    P-Visited-Network-ID: perim.dev.ims.ext1.net
    Accept: application/sdp,application/dtmf-relay
    Session-Expires: 600
    P-Served-User: <sip:test_1@mydomain.net>;regstate=reg;sescase=orig
    Content-Type: application/sdp
    Content-Length: 281

    v=0
    o=- 76884298267467 76884298267467 IN IP4 10.39.117.93
    s=-
    c=IN IP4 10.39.117.93
    t=0 0
    m=audio 45230 RTP/AVP 120 0 101
    a=sendrecv
    a=rtpmap:120 opus/48000/2
    a=rtpmap:101 telephone-event/8000
    a=fmtp:120 useinbandfec=1; usedtx=1; maxaveragebitrate=64000
    a=fmtp:101 0-15

    java.lang.IllegalArgumentException: not allowed to set parameter, the URI is not modifiable
            at org.mobicents.servlet.sip.address.SipURIImpl.setParameter(SipURIImpl.java:401)
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.checkRouteModifier(InitialRequestDispatcher.java:591)
            at org.mobicents.servlet.sip.core.dispatchers.InitialRequestDispatcher.dispatchMessage(InitialRequestDispatcher.java:299)
            at org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl.processRequest(SipApplicationDispatcherImpl.java:927)
            at gov.nist.javax.sip.EventScanner.deliverRequestEvent(EventScanner.java:250)
            at gov.nist.javax.sip.EventScanner.deliverEvent(EventScanner.java:146)
            at gov.nist.javax.sip.SipProviderImpl.handleEvent(SipProviderImpl.java:185)
            at gov.nist.javax.sip.DialogFilter.processRequest(DialogFilter.java:1328)
            at gov.nist.javax.sip.stack.SIPServerTransactionImpl.processRequest(SIPServerTransactionImpl.java:851)
            at gov.nist.javax.sip.stack.ConnectionOrientedMessageChannel.processMessage(ConnectionOrientedMessageChannel.java:473)
            at gov.nist.javax.sip.parser.NioPipelineParser$Dispatch.run(NioPipelineParser.java:132)
            at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
            at java.util.concurrent.FutureTask.run(FutureTask.java:266)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
            at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
            at gov.nist.javax.sip.MDCScheduledTHExecutor$MDCFuture.run(MDCScheduledTHExecutor.java:57)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
            at java.lang.Thread.run(Thread.java:748)

NO_ROUTE 表示应用程序路由器未返回任何路由,并且应忽略SipApplicationRouterInfo.getRoutes()值(如果有)。

在这种情况下,请求似乎停留在AS中,无法将请求转发到IMS节点。

希望这能解释一下情况。 感谢

答案 2 :(得分:0)

问题在于应用路由器无法识别该路由是指向其自身的,因此不会删除它。如果打开DEBUG级别的日志记录,则会看到类似以下内容的

DEBUG [org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl] (Mobicents-SIP-Servlets-UDPMessageChannelThread-1) the triplet host/port/transport : tas.core.ims1.test/-1/UDP is external : true

注意,它解析为外部。尝试将hostnames属性添加到SIP连接器:

<subsystem xmlns="urn:org.mobicents:sip-servlets-as8:1.0" application-router="configuration/dars/mobicents-dar.properties" stack-properties="configuration/mss-sip-stack.properties" path-name="org.mobicents.ext" app-dispatcher-class="org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl" concurrency-control-mode="SipApplicationSession" congestion-control-interval="-1">
    <connector name="sip-udp" protocol="SIP/2.0" scheme="sip" socket-binding="sip-udp" use-static-address="true" static-server-address="2345:470:eb88:150::23" hostnames="tas.core.ims1.test"/>
    <connector name="sip-tcp" protocol="SIP/2.0" scheme="sip" socket-binding="sip-tcp" use-static-address="true" static-server-address="2345:470:eb88:150::23" hostnames="tas.core.ims1.test"/>
    ...
</subsystem>

另一种选择是使用主机名而不是static-server-address属性中的IP地址:

<subsystem xmlns="urn:org.mobicents:sip-servlets-as8:1.0" application-router="configuration/dars/mobicents-dar.properties" stack-properties="configuration/mss-sip-stack.properties" path-name="org.mobicents.ext" app-dispatcher-class="org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl" concurrency-control-mode="SipApplicationSession" congestion-control-interval="-1">
    <connector name="sip-udp" protocol="SIP/2.0" scheme="sip" socket-binding="sip-udp" use-static-address="true" static-server-address="tas.core.ims1.test"/>
    <connector name="sip-tcp" protocol="SIP/2.0" scheme="sip" socket-binding="sip-tcp" use-static-address="true" static-server-address="tas.core.ims1.test"/>
    ...
</subsystem>

再次检查日志,您会发现它现在解析为内部日志:

DEBUG [org.mobicents.servlet.sip.core.SipApplicationDispatcherImpl] (Mobicents-SIP-Servlets-UDPMessageChannelThread-1) the triplet host/port/transport : tas.core.ims1.test/-1/UDP is external : false

它现在还将弹出通往自身的路线。就我而言,如果我通过调用SipServletRequest::getPoppedRoute()打印出弹出的路线,则会看到:

Route: <sip:defaultapp@tas.core.ims1.test;lr>