# gb28181 **Repository Path**: tonyjia/gb28181 ## Basic Information - **Project Name**: gb28181 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-06 - **Last Updated**: 2024-11-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # gb28181 gb28181是实现基于GB28181的通信库,区分client和server,以便于快速构建发起请求和处理响应,实现数据的共享互通。 ## 支持的能力 - 设备端 - 注册和注销 - 实时视频点播 - 通知 - 状态信息报送(心跳) - 目录通知 - 服务端 - 信息查询 - 设备目录查询 - 设备通道查询 - 实时视频点播 - 目录订阅 ## 使用说明 ### 提供的方法 ```go type ISipCommander interface { // Register 向上级平台注册接口,需要传递注册的有效期,单位为s,不传递默认值为3600秒 Register(model.SipServerInfo, int) error // GetDeviceInfo 获取注册在平台的设备信息 GetDeviceInfo(model.Device) error // GetChannelInfo 获取注册在平台的设备通道信息 GetChannelInfo(device model.Device) error // Play 点播 播放指定通道的视频流 Play(device model.Device, detail model.MediaServer, channel model.Channel) (model.StreamInfo, error) // StopPlay 停止点播 停止指定设备通道的视频流 StopPlay(channel model.Channel, device model.Device) error // SubscribeCatalog 订阅 d SubscribeCatalog(d model.Device) error // NotifyCatalog 将自身的目录变动通知到上级平台 NotifyCatalog(channel []model.Channel, device model.Device) error } ``` ## 非发布订阅回调事件定义 ```go //场景:上级平台查询设备通道信息 handMap[constant.EVENT_MESSAGE_Query_Catalog] = func(data interface{}) (interface{}, error) { //入参类型 model.Device device := data.(model.Device) //出参 返回 []model.Channel var channels []model.Channel channel := model.Channel{ DeviceId: "32011500991320000040", Name: "test001", Manufacturer: "simulator", Model: "Mars", Owner: "Owner", CivilCode: "3402000100", Address: "10.88.204.23", Parental: "0", ParentID: "32011500991320000000", SafetyWay: "0", RegisterWay: "1", Secrecy: "1", Status: "ON", } channels = append(channels, channel) return channels, nil } //场景:上级平台查询设备信息 handMap[constant.EVENT_MESSAGE_Query_DeviceInfo] = func(data interface{}) (interface{}, error) { log.Info("回调查询设备信息") //入参类型:model.Device device := model.Device{ DeviceID: "32011500002000000001", } //出参类型:model.Device return device, nil } //场景:设备查询后下级平台的设备信息返回 handMap[constant.EVENT_MESSAGE_DeviceInfo] = func(data interface{}) (interface{}, error) { //入参参数:model.Device log.Infof("获取设备信息%v", data) device := data.(model.Device) log.Infof("获取设备信息%v", device) return nil, nil } // 场景:设备查询后下级平台的通道信息返回 handMap[constant.EVENT_MESSAGE_Catalog] = func(data interface{}) (interface{}, error) { //入参参数:[]model.Channel device := data.([]model.Channel) log.Infof("获取设备信息%+v", device) return nil, nil } // 场景:上级平台点播事件 handMap[constant.EVENT_INVITE] = func(data interface{}) (interface{}, error) { //入参:model.StreamInfo streaminfo := data.(model.StreamInfo) media := model.MediaServer{ IP: streaminfo.Ip, Port: streaminfo.MediaServerId, } play, err := sipComm.Play(deviceCamera, media, model.Channel{ DeviceId: "34020000001320000001", }) if err != nil { return nil, err } //出参:model.StreamInfo,error return play, nil } cmd.NewServer(&sipComm, handMap).Run() ``` ## 发布订阅回调函数定义 ```go // subscriberID为订阅该消息的设备ID eventBus := event.GetEventBus() eventBus.RegisterHandler(event.Catalog, CatalogEventHandler) eventBus.RegisterHandler(event.Keepalive, KeepaliveEventHandler) func CatalogEventHandler(subscriberID string, data interface{}) { log.Infof("保活数据,%s: %v\n", subscriberID, data) } func KeepaliveEventHandler(subscriberID string, data interface{}) { log.Infof("保活数据,%s: %v\n", subscriberID, data) } ``` ## 初始化 ``` go sipComm := gbsip.SipCommander{ SipInfo: model.SipServerInfo{ Username: "test", ReginID: "3201150000", DeviceID: "32011500002000000001", IP: "10.88.204.23", Port: 5060, PassWord: "12345678", }, SysInfo: model.SipDeviceInfo{ DeviceID: "31011500991320000532", DeviceType: "IPC", }, } //此处handMap可参考回调事件定义 cmd.NewServer(&sipComm, handMap).Run() ```