asterisk - Asterisk 返回 501 - 未实现到 INFO 数据包
问题描述
我正在尝试通过 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
dtmfmode
我已经确定这与Asterisk 中的配置无关。我注意到的一件事是,当 Asterisk 响应 INVITE 时,它包含以下标题:
Allow: OPTIONS, REGISTER, SUBSCRIBE, NOTIFY, PUBLISH, INVITE, ACK, BYE, CANCEL, UPDATE, PRACK, MESSAGE, REFER
我希望 INFO 会出现在此处 - 但同样,使用软电话时也是如此,并且一切正常。还有哪些其他方面会影响 SIP INFO 的处理?
任何帮助将不胜感激进一步调试。
解决方案
原来是 SIP 对话的问题。
标签(+ call-id)标识一个对话。发送 INVITE 后,UAS 以 OK 响应,将远程标签粘贴到 To: 字段。每个后续请求都必须使用相同的标签(本地和远程 + call-id)来引用同一个对话框。这可以通过在使用 SIPp 场景时将[last_To:]粘贴到标头中来实现,以便我们获得正确的远程标记:
<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 进行响应,这要准确得多。
推荐阅读
- c# - 可以在运行时更新带有 XML 源的 DisplayNameAttribute 扩展吗?
- windows - Flutter windows桌面应用程序启动后立即关闭
- xml - 去测试 - Junit 结果
- cross-compiling - 在 Linux for Windows 上编译 Python C 扩展(交叉编译)
- npm - 使用 Netlify CLI 工具部署的 Netlify 问题
- php - curl响应是“内部服务器错误”,如何解决
- string - Powershell Base64 URL-safe 对上面的二进制哈希字符串进行编码,使其适用于 HTTP 请求
- datetime - MariaDB 在“视图”表上按日期时间字段过滤时返回空集,而 MySQL(和基本视图 sql)工作正常
- jupyter-notebook - 在 Jupyter-lab 中滚动提示音的键盘快捷键
- python - Python:尽管PC时间错误,如何获得正确的时间?