Asterisk returns 501 - 未对 INFO 数据包实施

Asterisk returns 501 - Not Implemented to INFO packets

我正在尝试通过 SIPp 发送 DTMF。由于 play_pcap_audio 操作不是 100% 可靠,我想构造 SIP INFO 消息以使我的测试更可靠,但是当我发送 INFO 数据包时,我得到 501 - 未实现来自 Asterisk 的响应。

如果我将我的软电话设置为使用 SIP INFO 发送 DTMF,则效果很好,所以我假设它与我发送的消息有关。但是对比实际消息并没有发现任何差异。

我发送的邀请:

INVITE sip:*203@192.168.200.208:5060 SIP/2.0
Via: SIP/2.0/UDP 172.17.0.2:5060;branch=z9hG4bK-234-1-7;rport
From: sipp <sip:2018005@192.168.200.208>;tag=1
To: <sip:*203@192.168.200.208:5060>
Call-ID: 1-234@172.17.0.2
CSeq: 4 INVITE
Contact: sip:2018005@172.17.0.2:5060
Authorization: //auth header omitted
Max-Forwards: 70
Allow: OPTIONS, SUBSCRIBE, NOTIFY, INVITE, ACK, CANCEL, BYE, REFER, INFO
Content-Type: application/sdp
Content-Length:   195

v=0
o=user1 53655765 2353687637 IN IP4 172.17.0.2
s=-
c=IN IP4 172.17.0.2
t=0 0
m=audio 8192 RTP/AVP 0
a=rtpmap:8 PCMA/8000
a=rtpmap:101 telephone-event/8000
a=fmtp:101 0-15
a=sendrecv

和 INFO 消息:


INFO sip:192.168.200.208:5060 SIP/2.0
Via: SIP/2.0/UDP 172.17.0.2:5060;branch=z9hG4bK-234-1-16
Max-Forwards: 70
Contact: <sip:2018005@172.17.0.2:5060;transport=UDP>
To: <sip:*203@192.168.200.208:5060>
From: "sipp" <sip:2018005@192.168.200.208>;tag=1
Call-ID: 1-234@172.17.0.2
CSeq: 5 INFO
User-Agent: SIPp docker
Authorization: // auth header omitted
Content-Length: 22

Signal=1
Duration=160

我已经确定这与 Asterisk 中的 dtmfmode 配置无关。 我注意到的一件事是当 Asterisk 响应 INVITE 时,它包含以下 header: Allow: OPTIONS, REGISTER, SUBSCRIBE, NOTIFY, PUBLISH, INVITE, ACK, BYE, CANCEL, UPDATE, PRACK, MESSAGE, REFER 我希望 INFO 在这里 - 但同样,使用软电话时也是一样的,而且一切正常。 还有哪些其他方面会影响 SIP INFO 的处理?

如能提供进一步调试方面的帮助,我们将不胜感激。

原来是 SIP 对话的问题。

标签 (+ a call-id) 标识一个对话框。发送 INVITE 后,UAS 以 OK 响应,将远程标签粘贴到 To: 字段。每个后续请求都必须使用相同的标签(本地和远程 + call-id)来引用相同的对话框。这可以通过在使用 SIPp 场景时将 [last_To:] 粘贴到 header 中来实现,以便我们获得正确的远程标记:

 <send>
        <![CDATA[
            ACK sip:[field3]@[remote_ip]:[remote_port] SIP/2.0
            Via: SIP/2.0/[transport] [local_ip]:[local_port];branch=[branch]
            From: <sip:[field0]@[field1]>;tag=[call_number]
            [last_To:]
            Call-ID: [call_id]
            CSeq: [cseq] ACK
            Contact: sip:[field0]@[local_ip]:[local_port]
            Max-Forwards: 10
            Content-Length: 0
        ]]>
    </send>

在上述情况下,从 UAC 发回 ACK 并建立对话。现在,当我们发送 INFO 时,我们必须引用相同的对话框(通过设置正确的标签)并且一切正常。 有趣的是,当没有正确设置这些值时,pjsip 给出 501 Not Implemented,而 chan_sip 响应 481 Call/Transaction Does Not Exist 更准确。