GB28181协议
GB28181协议(全称:GB/T 28181《公共安全视频监控联网系统信息传输、交换、控制技术要求》)是中国公共安全领域的国家标准,旨在规范视频监控设备间的互联互通,实现统一管理和数据安全传输。本文档描述了 Monibuca (m7s) 流媒体服务器中 GB28181 协议的实现,重点介绍协议的架构、连接处理和媒体流传输功能。
架构概述
Monibuca 中的 GB28181 被构建为一个插件,支持下级 GB28181 设备注册到 Monibuca (m7s),并在 Monibuca (m7s) 内部进行多协议的直播和录像点播,能通过 http 接口对下级设备进行云台控制,录像控制,播放控制,预置位设置,订阅报警、目录、移动位置,同时支持级联上级设备,供上级设备播放、录像点播放等功能。该插件默认在 554 端口注册标准 GB28181 服务,收流端口默认范围是10001-20000,并可以配置使用自定义端口。
核心组件
| 组件 | 描述 |
|---|---|
| GB28181Plugin | 主插件结构,包含配置和初始化逻辑 |
| Device | 下级设备 |
| Channel | 设备下的通道 |
| Platform | 上级设备 |
GB28181协议流程
与下级设备
注册相关
- 下级设备向 GB28181 插件发起注册请求
- GB28181 插件向下级设备获取设备信息及通道信息
- 下级设备向 GB28181 插件定时发送保活请求
播放直播
- 从播放请求里获取目标设备ID和通道ID
- 向目标设备发送invite请求
- 下级设备通过invite请求内的参数向 GB28181 插件发送流媒体数据
播放录像
- 从播放请求里获取目标设备ID和通道ID及录像的开始时间和结束时间
- 向目标设备发送invite请求,invite请求里设置录像的开始时间和结束时间
- 下级设备通过invite请求内的参数向 GB28181 插件发送流媒体数据
与上级设备
注册相关
- 通过接口添加上级设备的连接信息
- GB28181 插件向上级设备发起注册
- 注册成功后定时发送请求保活
播放直播
- 上级设备向 GB28181 插件发起invite请求
- GB28181插件 从invite请求中解析出下级设备的设备ID和通道ID
- 向下级目标设备发送invite请求
- 得到正确回应后,接收下级设备的流媒体数据并转发至上级设备
播放录像
- 上级设备向 GB28181 插件发起invite请求
- GB28181插件 从invite请求中解析出下级设备的设备ID和通道ID以及录像的开始时间和结束时间
- 向下级目标设备发送invite请求,invite请求里设置录像的开始时间和结束时间
- 得到正确回应后,接收下级设备的流媒体数据并转发至上级设备
配置和初始化
gb28181:
mediaip: 192.168.1.52 #流媒体收流IP,必填
sipip: 192.168.1.52 #SIP通讯IP,必填
mediaport: "10001-20000" #默认收流端口范围,可选
serial: "34020000002000000001" #服务器serverid,可选
realm: "3402000000" #服务器域,可选
password: "123456" #设备验证密码,可选
sip:
listenaddr:
- udp::5060 #SIP通讯端口,必填
onsub:
pull:
^\d{20}/\d{20}$: $0 #播放GB设备请求URL的正则,例如deviceid,channelid分别为34020000001110000003,34020000001320000003,则在系统内的地址为http://localhost:8080/flv/34020000001110000003/34020000001320000003.flv,其他协议类同
^gb_\d+/(.+)$: $1 #用来播放回放流,可以保证每个回放流进度不同
API接口说明
GB28181插件的API通过gRPC提供,并映射到HTTP接口。以下是主要的API端点及其功能,均基于 gb28181.proto 定义:
设备管理 (Device Management)
GET /gb28181/api/list- 描述: 获取设备列表 (同
GetDevices)。 - RPC:
List(GetDevicesRequest) returns (DevicesPageInfo) - 请求参数:
GetDevicesRequestpage(int32, 可选): 页码。count(int32, 可选): 每页数量。query(string, 可选): 查询关键字 (设备ID或名称)。status(bool, 可选): 设备在线状态。
- 响应:
DevicesPageInfo
- 描述: 获取设备列表 (同
GET /gb28181/api/devices/{deviceId}- 描述: 使用ID查询国标设备信息。
- RPC:
GetDevice(GetDeviceRequest) returns (DeviceResponse) - URL参数:
deviceId(string, 必选): 设备ID。
- 响应:
DeviceResponse
GET /gb28181/api/devices- 描述: 分页查询国标设备。
- RPC:
GetDevices(GetDevicesRequest) returns (DevicesPageInfo) - 请求参数:
GetDevicesRequest(同上List) - 响应:
DevicesPageInfo
DELETE /gb28181/api/devices/{deviceId}/delete- 描述: 移除设备。
- RPC:
DeleteDevice(DeleteDeviceRequest) returns (DeleteDeviceResponse) - URL参数:
deviceId(string, 必选): 设备ID。
- 响应:
DeleteDeviceResponse
POST /gb28181/api/device/add- 描述: 添加设备信息。
- RPC:
AddDevice(Device) returns (BaseResponse) - 请求体:
Devicemessage - 响应:
BaseResponse
POST /gb28181/api/device/update- 描述: 更新设备信息。
- RPC:
UpdateDevice(Device) returns (BaseResponse) - 请求体:
Devicemessage - 响应:
BaseResponse
GET /gb28181/api/devices/{deviceId}/status- 描述: 设备状态查询。
- RPC:
GetDeviceStatus(GetDeviceStatusRequest) returns (DeviceStatusResponse) - URL参数:
deviceId(string, 必选): 设备ID。
- 响应:
DeviceStatusResponse
通道管理 (Channel Management)
GET /gb28181/api/devices/{deviceId}/channels- 描述: 分页查询指定设备的通道。
- RPC:
GetChannels(GetChannelsRequest) returns (ChannelsPageInfo) - URL参数:
deviceId(string, 必选): 设备ID。
- 请求参数:
GetChannelsRequestpage(int32, 可选): 页码。count(int32, 可选): 每页数量。query(string, 可选): 查询关键字 (通道ID或名称)。online(bool, 可选): 通道在线状态。channelType(bool, 可选): 是否为设备通道。
- 响应:
ChannelsPageInfo
GET /gb28181/api/devices/{deviceId}/sync- 描述: 同步设备通道信息。
- RPC:
SyncDevice(SyncDeviceRequest) returns (SyncStatus) - URL参数:
deviceId(string, 必选): 设备ID。
- 响应:
SyncStatus
GET /gb28181/api/sub_channels/{deviceId}/{channelId}/channels- 描述: 分页查询子目录通道。
- RPC:
GetSubChannels(GetSubChannelsRequest) returns (ChannelsPageInfo) - URL参数:
deviceId(string, 必选): 设备ID。channelId(string, 必选): 父通道ID。
- 响应:
ChannelsPageInfo
POST /gb28181/api/channel/audio- 描述: 开启/关闭通道的音频。
- RPC:
ChangeAudio(ChangeAudioRequest) returns (BaseResponse) - 请求体:
ChangeAudioRequest - 响应:
BaseResponse
POST /gb28181/api/channel/stream/identification/update- 描述: 修改通道的码流类型。
- RPC:
UpdateChannelStreamIdentification(Channel) returns (BaseResponse) - 请求体:
Channelmessage - 响应:
BaseResponse
GET /gb28181/api/channel/raw- 描述: 国标通道编辑时的数据回显。
- RPC:
GetRawChannel(GetRawChannelRequest) returns (Channel) - 请求参数:
GetRawChannelRequest - 响应:
Channel
播放与录像 (Playback and Recording)
GET /gb28181/api/records/{deviceId}/{channelId}- 描述: 查询录像记录。
- RPC:
QueryRecord(QueryRecordRequest) returns (QueryRecordResponse) - URL参数:
deviceId(string, 必选): 设备ID。channelId(string, 必选): 通道ID。
- 请求参数:
QueryRecordRequest(包含开始/结束时间等) - 响应:
QueryRecordResponse
GET /gb28181/api/recording/{cmdType}/{deviceId}/{channelId}- 描述: 录制控制 (开始/停止)。
- RPC:
Recording(RecordingRequest) returns (BaseResponse) - URL参数:
cmdType(string, 必选): 命令类型 ("start" 或 "stop")。deviceId(string, 必选): 设备ID。channelId(string, 必选): 通道ID。
- 响应:
BaseResponse
GET /gb28181/api/playback/pause- 描述: 回放暂停。
- RPC:
PlaybackPause(PlaybackPauseRequest) returns (BaseResponse) - 请求参数:
PlaybackPauseRequest - 响应:
BaseResponse
GET /gb28181/api/playback/resume- 描述: 回放恢复。
- RPC:
PlaybackResume(PlaybackResumeRequest) returns (BaseResponse) - 请求参数:
PlaybackResumeRequest - 响应:
BaseResponse
GET /gb28181/api/playback/seek- 描述: 回放拖动播放。
- RPC:
PlaybackSeek(PlaybackSeekRequest) returns (BaseResponse) - 请求参数:
PlaybackSeekRequest(包含目标时间) - 响应:
BaseResponse
GET /gb28181/api/playback/speed- 描述: 回放倍速播放。
- RPC:
PlaybackSpeed(PlaybackSpeedRequest) returns (BaseResponse) - 请求参数:
PlaybackSpeedRequest(包含播放速度) - 响应:
BaseResponse
云台控制 (PTZ Control)
GET /gb28181/api/ptz/{deviceId}/{channelId}- 描述: PTZ 云台控制。
- RPC:
PtzControl(PtzControlRequest) returns (BaseResponse) - URL参数:
deviceId(string, 必选): 设备ID。channelId(string, 必选): 通道ID。
- 请求参数:
PtzControlRequest(包含PTZ命令,如 "UP", "DOWN", "ZOOM_IN" 等) - 响应:
BaseResponse
GET /gb28181/api/fi/iris/{deviceId}/{channelId}- 描述: 光圈控制。
- RPC:
IrisControl(IrisControlRequest) returns (BaseResponse) - URL参数 & 请求参数: 类似于PTZ控制。
- 响应:
BaseResponse
GET /gb28181/api/fi/focus/{deviceId}/{channelId}- 描述: 聚焦控制。
- RPC:
FocusControl(FocusControlRequest) returns (BaseResponse) - URL参数 & 请求参数: 类似于PTZ控制。
- 响应:
BaseResponse
GET /gb28181/api/preset/query/{deviceId}/{channelId}- 描述: 查询预置位。
- RPC:
QueryPreset(PresetRequest) returns (PresetResponse) - URL参数 & 请求参数: 类似于PTZ控制。
- 响应:
PresetResponse
GET /gb28181/api/preset/{deviceId}/{channelId}- 描述: 设置预置位。
- RPC:
AddPreset(PresetRequest) returns (BaseResponse) - URL参数 & 请求参数: 类似于PTZ控制。
- 响应:
BaseResponse
GET /gb28181/api/preset/call/{deviceId}/{channelId}- 描述: 调用预置位。
- RPC:
CallPreset(PresetRequest) returns (BaseResponse) - URL参数 & 请求参数: 类似于PTZ控制。
- 响应:
BaseResponse
GET /gb28181/api/preset/delete/{deviceId}/{channelId}- 描述: 删除预置位。
- RPC:
DeletePreset(PresetRequest) returns (BaseResponse) - URL参数 & 请求参数: 类似于PTZ控制。
- 响应:
BaseResponse
其他PTZ相关控制: 巡航 (Cruise), 扫描 (Scan), 雨刷 (Wiper), 辅助开关 (Auxiliary) 等,其API格式与上述类似,具体请参照
gb28181.proto。
平台管理 (Platform Management)
POST /gb28181/api/platform/add- 描述: 添加平台信息。
- RPC:
AddPlatform(Platform) returns (BaseResponse) - 请求体:
Platformmessage - 响应:
BaseResponse
GET /gb28181/api/platform/{id}- 描述: 获取平台信息。
- RPC:
GetPlatform(GetPlatformRequest) returns (PlatformResponse) - URL参数:
id(string, 必选): 平台ID。
- 响应:
PlatformResponse
POST /gb28181/api/platform/update- 描述: 更新平台信息。
- RPC:
UpdatePlatform(Platform) returns (BaseResponse) - 请求体:
Platformmessage - 响应:
BaseResponse
POST /gb28181/api/platform/{id}- 描述: 删除平台信息。
- RPC:
DeletePlatform(DeletePlatformRequest) returns (BaseResponse) - URL参数:
id(string, 必选): 平台ID。
- 响应:
BaseResponse
GET /gb28181/api/platform/list- 描述: 获取平台列表。
- RPC:
ListPlatforms(ListPlatformsRequest) returns (PlatformsPageInfo) - 请求参数:
ListPlatformsRequest(可包含分页等) - 响应:
PlatformsPageInfo
POST /gb28181/api/platform/channel/add- 描述: 添加平台通道。
- RPC:
AddPlatformChannel(AddPlatformChannelRequest) returns (BaseResponse) - 请求体:
AddPlatformChannelRequest - 响应:
BaseResponse
其他功能 (Other Functions)
POST /gb28181/api/transport/{deviceId}/{streamMode}- 描述: 修改数据流传输模式 (TCP/UDP)。
- RPC:
UpdateTransport(UpdateTransportRequest) returns (BaseResponse) - URL参数:
deviceId(string, 必选): 设备ID。streamMode(string, 必选): 流模式 ("TCP" 或 "UDP")。
- 响应:
BaseResponse
GET /gb28181/api/alarm/{deviceId}- 描述: 设备报警查询。
- RPC:
GetDeviceAlarm(GetDeviceAlarmRequest) returns (DeviceAlarmResponse) - URL参数:
deviceId(string, 必选): 设备ID。
- 请求参数:
GetDeviceAlarmRequest(可包含时间范围、报警级别等) - 响应:
DeviceAlarmResponse
GET /gb28181/api/{deviceId}/sync_status- 描述: 获取通道同步进度。
- RPC:
GetSyncStatus(GetSyncStatusRequest) returns (SyncStatus) - URL参数:
deviceId(string, 必选): 设备ID。
- 响应:
SyncStatus
GET /gb28181/api/{deviceId}/subscribe_info- 描述: 获取设备的订阅状态。
- RPC:
GetSubscribeInfo(GetSubscribeInfoRequest) returns (SubscribeInfoResponse) - URL参数:
deviceId(string, 必选): 设备ID。
- 响应:
SubscribeInfoResponse
GET /gb28181/api/snap/{deviceId}/{channelId}- 描述: 请求截图。
- RPC:
GetSnap(GetSnapRequest) returns (SnapResponse) - URL参数:
deviceId(string, 必选): 设备ID。channelId(string, 必选): 通道ID。
- 响应:
SnapResponse(通常包含图片URL或数据)
POST /gb28181/api/play/convertStop/{key}- 描述: 结束转码。
- RPC:
StopConvert(ConvertStopRequest) returns (BaseResponse) - URL参数:
key(string, 必选): 转码任务的标识。
- 响应:
BaseResponse
POST /gb28181/api/play/broadcast/{deviceId}/{channelId}- 描述: 语音广播命令。
- RPC:
StartBroadcast(BroadcastRequest) returns (BroadcastResponse) - URL参数:
deviceId(string, 必选): 设备ID。channelId(string, 必选): 通道ID。
- 响应:
BroadcastResponse
POST /gb28181/api/play/broadcast/stop/{deviceId}/{channelId}- 描述: 停止语音广播。
- RPC:
StopBroadcast(BroadcastRequest) returns (BaseResponse) - URL参数:
deviceId(string, 必选): 设备ID。channelId(string, 必选): 通道ID。
- 响应:
BaseResponse
GET /gb28181/api/play/ssrc- 描述: 获取所有的SSRC。
- RPC:
GetAllSSRC(google.protobuf.Empty) returns (SSRCListResponse) - 响应:
SSRCListResponse
GET /gb28181/api/testsip- 描述: 测试SIP连接。
- RPC:
TestSip(TestSipRequest) returns (TestSipResponse) - 请求参数:
TestSipRequest - 响应:
TestSipResponse
GET /gb28181/api/alarms/{deviceId}- 描述: 分页查询报警记录。
- RPC:
SearchAlarms(SearchAlarmsRequest) returns (SearchAlarmsResponse) - URL参数:
deviceId(string, 必选): 设备ID。
- 请求参数:
SearchAlarmsRequest(可包含分页、时间范围等) - 响应:
SearchAlarmsResponse
POST /gb28181/api/snap/upload- 描述: 接收JPEG文件。
- RPC:
UploadJpeg(UploadJpegRequest) returns (BaseResponse) - 请求体:
UploadJpegRequest(包含图片数据) - 响应:
BaseResponse
分组管理 (Group Management): 包括获取、添加、更新、删除分组,以及分组与通道的关联管理。具体API请参照
gb28181.proto中的GetGroups,AddGroup,UpdateGroup,DeleteGroup,AddGroupChannel,DeleteGroupChannel,GetGroupChannels。
注意: 上述列表可能未包含所有API,详细信息请直接查阅 plugin/gb28181/pb/gb28181.proto 文件。请求和响应的具体字段结构也定义在该 proto 文件中。
总结
Monibuca 中的 GB28181 插件支持:
- 下级设备直播播放,录像查询,录像播放,录像播放暂停(恢复),录像播放倍速,预置位设置,云台控制,订阅目录、移动位置、报警
- 向上级设备注册及保活,上级设备直播播放,录像查询,录像播放,云台控制,预置位设置,等功能