cefsharp 发送请求服务器_使用 WPF 版简易 SIP 服务器向 GB28181 摄像头发送直播请求...
使用?WPF?版簡易?SIP?服務(wù)器向?GB28181?攝像頭發(fā)送直播請求
目錄
一、引言
二、項目淵源
三、軟件使用及 SIP INVITE 流程
(一) 注冊和心跳
(二) 直播 INVITE
四、注意事項
五、資源
獨立觀察員 2020 年 9 月 16 日
一、引言
之前寫過一篇博客《使用 GB28181.Solution ZLMediaKit? MediaServerUI 進行攝像頭推流和播放》,里面是使用了?GB28181.Solution 工程的?GB28181.WinTool 測試程序來作為 SIP 服務(wù)器的,該程序界面上體現(xiàn)的功能是比較全的(不過本人只測試了直播功能)。實際上,好多功能本人用不到(比如云臺控制、警報之類的),加上該程序代碼有點紛繁復(fù)雜,而且似乎只能直播一個設(shè)備(未嚴(yán)格測試),所以想著參考該程序,自己寫個簡易的 SIP 服務(wù)器(UA),功能上只要求能夠接受注冊、發(fā)起直播請求等就行。
二、項目淵源
GB28181.Solution 里使用了 SIPSorcery 開源項目的代碼,本項目 SimpleSIPServer 也是從 SIPSorcery 的一個例子 SIPProxy 起頭的,里面還有些其它的例子,有助于學(xué)習(xí)如何使用 SIPSorcery,大家可以看看:
SIPSorcery 的核心功能通過 NuGet 包引入,當(dāng)前使用的是 v4.0.60-pre 版:
本項目還借用了 GB28181.Solution 中針對于 GB28181 進行擴充的實體定義(幾個文件夾都拷過來了,以備不時之需),以及幾個方法:
三、軟件使用及 SIP?INVITE?流程
(一) 注冊和心跳
首先啟動程序,在配置區(qū)按實際情況進行配置:
SIP 服務(wù)器默認(rèn)端口為 5060,DeviceId 目前來說不重要,媒體服務(wù)器的一些配置可參考引言中提到的文章(本文還是使用 ZLMediaKit 作為流媒體服務(wù)器)。
啟動服務(wù)主要是配置 SIP 通道,然后附加一些事件的處理方法:
攝像頭配置好 SIP 服務(wù)器后,會周期性地嘗試注冊和發(fā)送心跳到配置的 SIP 服務(wù)器 IP:Port。
這樣我們啟動服務(wù)器后,就能收到注冊請求(REGISTER)了。當(dāng)然,這次是運氣比較好,一下就收到了注冊請求,通常還會有先收到一段時間的心跳請求然后才收到注冊請求的情況。收到注冊請求后,我們先回了個 100 Trying 消息(應(yīng)該是非必需的),表示正在處理,處理完成后,又回了個 200 OK 消息,如下圖:
回應(yīng)心跳請求也是用 200 OK,有說法是不要回應(yīng)未注冊的心跳,我在本程序里也加了這個開關(guān),不過測試中好像和回應(yīng)的情況沒什么區(qū)別,大家可以自己試試。
抓包列表如下:
(二) 直播?INVITE
設(shè)備(攝像頭)注冊成功后,展開 “連入的客戶端” 區(qū)域,并點擊選中一項,然后就可以點擊 “請求開始直播”:
程序發(fā)送 INVITE 請求,然后攝像頭依次響應(yīng) 100 Trying、101 Dialog Establishement 中間狀態(tài),最后回復(fù) 200 OK:
收到 200 OK 后,程序需要發(fā)送 ACK 請求,然后攝像頭收到后就可以進行推流(RTP/PS)了:
可以看到 PS 流有個 SSRC (同步源標(biāo)識),這個是用來區(qū)分流的,由本程序在發(fā)出 INVITE 時附帶,生成和發(fā)送的時候是 10 進制,此處顯示為 16 進制:
由上圖還可看到,本程序依據(jù) ZLMediaKit 的播放地址規(guī)則(使用了十六進制形式的 SSRC),直接生成了播放地址,使用 PotPlayer 打開鏈接即可播放:
支持發(fā)起多個直播請求(多個設(shè)備),使用 MediaServerUI 查看:
停止直播就是發(fā)送 BYE 指令:
(電腦 C 盤突然空間不足了,抓包失敗)
四、注意事項
開發(fā)過程中遇到這樣一個情況:
IPC(網(wǎng)絡(luò)攝像頭) 回復(fù) 200 OK 后,程序發(fā)送 ACK 消息過去,但是 IPC 不認(rèn),還是繼續(xù)回復(fù) 200 OK,幾次之后就 BYE 了。
經(jīng)過流媒體服務(wù)器 Monibuca 的作者指導(dǎo),得知原因是,CallId 要和 200OK 的 CallId 一致。另外,這個通信過程中直接使用 IPC 的設(shè)備編號就行,不一定要使用通道編號(GB28181.WinTool 是使用通道編號)。
實際上,RFC 3261 中說:
The combination of the To tag, From tag, and Call-ID completely defines a peer-to-peer SIP relationship…
也就是 INVITE 整個通信過程中,由 FromTag、ToTag 和 CallId 三者一起唯一確定一個 SIP 的點對點關(guān)系,也就是說 ACK 和 BYE 兩個請求中,這三者要和 200 OK 發(fā)過來時的值一致:
五、資源
項目地址:https://gitee.com/DLGCY_GB28181/SimpleSIPServer
SIP 指令抓包數(shù)據(jù):關(guān)注微信公眾號 “獨立觀察員博客” 后回復(fù) “SIP” 獲取。
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的cefsharp 发送请求服务器_使用 WPF 版简易 SIP 服务器向 GB28181 摄像头发送直播请求...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python自带的数据库_Python小
- 下一篇: python 去掉文件头部几行_批量重命