使用 WPF 版簡易 SIP 服務器向 GB28181 攝像頭發送直播請求
目錄 隱藏 一、引言 二、專案淵源 三、軟體使用及 SIP INVITE 流程 (一) 注冊和心跳 (二) 直播 INVITE 四、注意事項 五、資源獨立觀察員 2020 年 9 月 16 日
一、引言
之前寫過一篇博客《使用 GB28181.Solution ZLMediaKit MediaServerUI 進行攝像頭推流和播放》,里面是使用了 GB28181.Solution 工程的 GB28181.WinTool 測驗程式來作為 SIP 服務器的,該程式界面上體現的功能是比較全的(不過本人只測驗了直播功能),實際上,好多功能本人用不到(比如云臺控制、警報之類的),加上該程式代碼有點紛繁復雜,而且似乎只能直播一個設備(未嚴格測驗),所以想著參考該程式,自己寫個簡易的 SIP 服務器(UA),功能上只要求能夠接受注冊、發起直播請求等就行,
二、專案淵源
GB28181.Solution 里使用了 SIPSorcery 開源專案的代碼,本專案 SimpleSIPServer 也是從 SIPSorcery 的一個例子 SIPProxy 起頭的,里面還有些其它的例子,有助于學習如何使用 SIPSorcery,大家可以看看:

SIPSorcery 的核心功能通過 NuGet 包引入,當前使用的是 v4.0.60-pre 版:

本專案還借用了 GB28181.Solution 中針對于 GB28181 進行擴充的物體定義(幾個檔案夾都拷過來了,以備不時之需),以及幾個方法:

三、軟體使用及 SIP INVITE 流程
(一) 注冊和心跳
首先啟動程式,在配置區按實際情況進行配置:

SIP 服務器默認埠為 5060,DeviceId 目前來說不重要,媒體服務器的一些配置可參考引言中提到的文章(本文還是使用 ZLMediaKit 作為流媒體服務器),
啟動服務主要是配置 SIP 通道,然后附加一些事件的處理方法:

攝像頭配置好 SIP 服務器后,會周期性地嘗試注冊和發送心跳到配置的 SIP 服務器 IP:Port,

這樣我們啟動服務器后,就能收到注冊請求(REGISTER)了,當然,這次是運氣比較好,一下就收到了注冊請求,通常還會有先收到一段時間的心跳請求然后才收到注冊請求的情況,收到注冊請求后,我們先回了個 100 Trying 訊息(應該是非必需的),表示正在處理,處理完成后,又回了個 200 OK 訊息,如下圖:

回應心跳請求也是用 200 OK,有說法是不要回應未注冊的心跳,我在本程式里也加了這個開關,不過測驗中好像和回應的情況沒什么區別,大家可以自己試試,
抓包串列如下:

(二) 直播 INVITE
設備(攝像頭)注冊成功后,展開 “連入的客戶端” 區域,并點擊選中一項,然后就可以點擊 “請求開始直播”:

程式發送 INVITE 請求,然后攝像頭依次回應 100 Trying、101 Dialog Establishement 中間狀態,最后回復 200 OK:

收到 200 OK 后,程式需要發送 ACK 請求,然后攝像頭收到后就可以進行推流(RTP/PS)了:

可以看到 PS 流有個 SSRC (同步源標識),這個是用來區分流的,由本程式在發出 INVITE 時附帶,生成和發送的時候是 10 進制,此處顯示為 16 進制:

由上圖還可看到,本程式依據 ZLMediaKit 的播放地址規則(使用了十六進制形式的 SSRC),直接生成了播放地址,使用 PotPlayer 打開鏈接即可播放:

支持發起多個直播請求(多個設備),使用 MediaServerUI 查看:

停止直播就是發送 BYE 指令:

(電腦 C 盤突然空間不足了,抓包失敗)
四、注意事項
開發程序中遇到這樣一個情況:
IPC(網路攝像頭) 回復 200 OK 后,程式發送 ACK 訊息過去,但是 IPC 不認,還是繼續回復 200 OK,幾次之后就 BYE 了,
經過流媒體服務器 Monibuca 的作者指導,得知原因是,CallId 要和 200OK 的 CallId 一致,另外,這個通信程序中直接使用 IPC 的設備編號就行,不一定要使用通道編號(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 的點對點關系,也就是說 ACK 和 BYE 兩個請求中,這三者要和 200 OK 發過來時的值一致:

五、資源
專案地址:https://gitee.com/DLGCY_GB28181/SimpleSIPServer
SIP 指令抓包資料:關注微信公眾號 “獨立觀察員博客” 后回復 “SIP” 獲取,


同步首發:http://dlgcy.com/wpf-simple-sip-server-gb28181/
微信公眾號
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/66529.html
標籤:其他
