一、前言
搞gb28181開發,首要任務就是解析協議,按照gb28181的文檔來,還是非常詳細的,通過抓包工具可以查看到具體的收發數據,也可以打開網絡調試助手工具,監聽5060端口,看到上報的數據,都是一個通用規則的協議。
//設備端發送
REGISTER sip:34020000002000000001@3402000000 SIP/2.0
Via: SIP/2.0/UDP 192.168.0.64:5060;rport;branch=z9hG4bK1945388331
From: <sip:34020000001320000002@3402000000>;tag=33226951
To: <sip:34020000001320000002@3402000000>
Call-ID: 1455222403
CSeq: 1 REGISTER
Contact: <sip:34020000001320000002@192.168.0.64:5060>
Max-Forwards: 70
User-Agent: IP Camera
Expires: 3600
Content-Length: 0//服務端應答
SIP/2.0 200 OK
Via: SIP/2.0/UDP 192.168.0.64:5060;rport;branch=z9hG4bK1494593151
From: <sip:34020000001320000002@3402000000>;tag=33226951
To: <sip:34020000001320000002@3402000000>
Call-ID: 1455222403
CSeq: 2 REGISTER
User-Agent: wx_feiyangqingyun
Date: 2025-04-22T10:48:38.234
Content-Length: 0
消息頭
- 第1行表明這條SIP消息的方法(Method)是REGISTER。
- 34020000002000000001是SIP服務器的國標編碼。
- 國標編碼指的是由中心編碼(8位) 、行業編碼(2位) 、類型編碼(3位)、序號(7位)四個碼段共20位十進制數字字符構成。
- 具體國標編碼方法可以參考GB/T 28181—2016中的附錄D。
- 3402000000指的是SIP服務器的域國標ID。
- SIP/2.0指的是SIP協議版本。
Via頭
- 第2行為Via頭,Via頭中包含了發送請求方的相關信息,后續需要使用這些信息進行回復。
- SIP/2.0/UDP表示使用的是2.0版本的SIP協議,使用的傳輸協議是UDP,也可以使用TCP協議,大部分設備默認是UDP協議,GB2016以前只支持UDP協議。
- 192.168.0.64:5060為請求發送方的IP地址和端口號。
- Via頭中必須包含branch參數,具體值是一個在整個SIP通信過程中不重復的數值。
- branch是一個事務ID(Transaction ID),用于區分同一個UA所發起的不同Transaction,它不會對未來的request或者是response造成影響,對于遵循IETF RFC3261規范的實現,
- 這個branch參數的值必須用 z9hG4bK 字符串打頭。
- 其它部分是對To, From, Call-ID頭域和Request-URI按一定的算法加密后得到,也可以是隨機數或者UUID,目前沒發現有什么用途。
- rport字段表示使用rport機制路由響應,即發送的響應時,按照rport中的端口發送SIP響應。
- 也就是說IP和端口均完全遵照從哪里來的,發回哪里去的原則。
- 如果沒有rport字段時,服務端的策略是IP使用UDP包中的地址,即從哪里來回哪里去,但是端口使用的是via中的端口,詳情見IETF RFC35818。
From頭
- 第3行為From頭,From頭中包含了請求發送方的邏輯標識。
- 在GB28181協議中是發送請求的設備國標ID和域國標ID信息。
- tag參數是為了身份認證的,值為隨機數字字符。
To頭
- 第4行為To頭,To頭在SIP協議中是為了標明請求接收方的邏輯標識的。
- 在GB28181協議中填寫的是發送請求的設備國標ID和域國標ID信息。
Call-ID頭
- 第5行為Call-ID頭,Call-ID頭是全局唯一的,在同一個session中保持一致,在不同session中不同。
CSeq頭
- 第6行為CSeq頭,CSeq頭又叫Command Seqence(命令隊列),用于標識命令順序。
- 值為序號+Method,序號部分為無符號整數,最大值為2^31。
- 序號起始值是隨機的,后續在同一個session中依次遞增。
- 比如發1 REGISTER沒返回—>再發2 REGISTER—>沒返回—>再發3 REGISTER—>這時返回了2 REGISTER就知道是第2個請求得到了響應。
- 對于ACK和CANCLE中的CSeq與INVITE中的Cseq保持一致。
其他頭
- 第7行為Contact頭,Contact頭包含源的URI信息,用來給響應消息直接和源建立連接用。在GB28181協議中為SIP設備編碼@源IP地址端口。
- 第8行為Max-Forwards頭,Max-Forwards頭用于設置包最大中轉次數,默認是70。
- 第9行為User-Agent頭,User-Agent頭用于設置關于UA的信息,用戶可以自定義。
- 第10行為Expires頭,Expires頭表示超時時間。 值=0表示注銷。
- 第11行為Content-Length頭,Content-Length頭表示消息體的長度,因為REGISTER消息不需要消息體,因此為0。如果攜帶了xml或者sdp等消息體,則>0。
二、效果圖
三、相關地址
- 國內站點:https://gitee.com/feiyangqingyun
- 國際站點:https://github.com/feiyangqingyun
- 個人作品:https://blog.csdn.net/feiyangqingyun/article/details/97565652
- 文件地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取碼:01jf 文件名:bin_video_gb28181。
四、功能特點
- 支持設備注冊、注銷、心跳、校時、注冊認證、注銷認證等。
- 設備上線后可以手動獲取設備狀態、設備信息、配置信息、預置位信息等。
- 設備上線后自動獲取設備通道信息,包括中文通道名稱。識別到通道上線離線變化,會重新獲取該設備的所有通道信息。
- 支持視頻點播,可以分別點播主碼流和子碼流,內置rtp解包線程,解包后發給視頻播放組件解碼播放。
- 每個設備每個通道支持點播多個視頻,通過ssrc區分,支持共用端口和不同端口收流。
- 支持對某個設備下面所有通道、某個通道、某個通道對應的某個流分別關閉。
- 支持錄像文件查詢和回放,回放控制支持暫停播放、繼續播放、倍速播放、切換播放進度。
- 支持錄像文件下載,支持倍速比如8倍速下載,可同時多線程批量下載。
- 回放和下載同時支持IPC和NVR,比如攝像頭自帶的SD存儲卡錄像文件回放,NVR上的硬盤錄像文件回放。
- 支持云臺控制,向上、向下、向左、向右、左上、右上、左下、右下方位移動,鏡頭放大縮小,光圈放大縮小,鏡頭聚焦放焦。
- 支持預置位信息的查詢、調用、添加、修改、刪除等操作。
- 自動目錄訂閱功能,通道上線下線都有對應的信號通知。
- 內置定時讀取通道信息機制,以保證通道信息是最新的,比如有些NVR是不斷更新的通道信息。
- 支持警情訂閱,各種警情事件比如運動目標檢測報警、入侵檢測報警、徘徊檢測報警等自動上報。
- 國標服務同時支持udp和tcp方式,可選只監聽一種或者兩種都監聽,tcp方式自動處理粘包問題。
- 國標拉流同時支持udp、tcp被動、tcp主動三種方式,每個通道都可以自由選擇何種拉流方式。
- 內置拉流端口池,每次拉流從中取出一個,關閉流自動回收端口號,重復利用。
- 收流端口自動糾錯,自動跳過被占用的端口,不會出現端口占用導致收流失敗的情況。
- 視頻播放自適應硬解碼,極低資源占用,實時性極好,帶懸浮條顯示視頻流信息,可以直接在懸浮條單擊按鈕保存錄像文件到本地。
- 支持幾千路國標消息交互并發,實時視頻流支持64路同時顯示,可以拓展更多路數。
- 支持阿里云等云服務器,可以分別設置內網監聽地址和外網訪問地址,一般云服務器上是監聽地址用內網,對外訪問用外網地址。
- 支持視頻分發,也就是推流,視頻通道打開后可以自動推流到流媒體服務器,其他需要的地方拉流即可,支持rtsp、rtmp、hls、webrtc等方式拉流。
- SIP解析和交互采用純Qt底層代碼實現,udp/tcp通信交互,祖傳原創代碼解析,不依賴任何第三方。
- 代碼量少,gb28181交互部分共幾千行代碼,注釋詳細,接口友好,使用極其簡單,提供非常詳細的使用示例。
- 支持海康、大華、宇視、華為、天地偉業等所有國標設備。
- 支持所有Qt版本和編譯器以及操作系統,包括但不限于win、linux、mac、android、嵌入式linux、樹莓派香橙派、國產os等。
五、相關代碼