From 35e916dd1cb22711d78bdf5f8c7f61881cdea0c3 Mon Sep 17 00:00:00 2001 From: langhuihui <178529795@qq.com> Date: Tue, 5 Dec 2023 19:17:17 +0800 Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=B8=AD=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=A2=9D=E5=A4=96=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- device.go | 2 +- handle.go | 28 ++++++++++++++++------ main.go | 72 +++++++++++++++++++++++++++---------------------------- server.go | 10 ++++---- 4 files changed, 63 insertions(+), 49 deletions(-) diff --git a/device.go b/device.go index f551e3e..c7d94e9 100644 --- a/device.go +++ b/device.go @@ -234,7 +234,7 @@ func (d *Device) deleteChannel(DeviceID string) { func (d *Device) UpdateChannels(list ...ChannelInfo) { for _, c := range list { - if _, ok := conf.Ignores[c.DeviceID]; ok { + if _, ok := conf.ignores[c.DeviceID]; ok { continue } //当父设备非空且存在时、父设备节点增加通道 diff --git a/handle.go b/handle.go index c8cf122..0f9e19c 100644 --- a/handle.go +++ b/handle.go @@ -7,10 +7,10 @@ import ( "fmt" "strconv" - "go.uber.org/zap" - "m7s.live/plugin/gb28181/v4/utils" - "github.com/ghettovoice/gosip/sip" + "go.uber.org/zap" + . "m7s.live/engine/v4" + "m7s.live/plugin/gb28181/v4/utils" "net/http" "time" @@ -195,6 +195,11 @@ func (d *Device) syncChannels() { } } +type MessageEvent struct { + Type string + Device *Device +} + func (c *GB28181Config) OnMessage(req sip.Request, tx sip.ServerTransaction) { from, ok := req.From() if !ok || from.Address == nil || from.Address.User() == nil { @@ -267,13 +272,18 @@ func (c *GB28181Config) OnMessage(req sip.Request, tx sip.ServerTransaction) { case "Alarm": d.Status = DeviceAlarmedStatus body = BuildAlarmResponseXML(d.ID) + case "Broadcast": + GB28181Plugin.Info("broadcast message", zap.String("body", req.Body())) default: d.Warn("Not supported CmdType", zap.String("CmdType", temp.CmdType), zap.String("body", req.Body())) response := sip.NewResponseFromRequest("", req, http.StatusBadRequest, "", "") tx.Respond(response) return } - + EmitEvent(MessageEvent{ + Type: temp.CmdType, + Device: d, + }) tx.Respond(sip.NewResponseFromRequest("", req, http.StatusOK, "OK", body)) } else { GB28181Plugin.Debug("Unauthorized message, device not found", zap.String("id", id)) @@ -283,6 +293,8 @@ func (c *GB28181Config) OnBye(req sip.Request, tx sip.ServerTransaction) { tx.Respond(sip.NewResponseFromRequest("", req, http.StatusOK, "OK", "")) } +type NotifyEvent MessageEvent + // OnNotify 订阅通知处理 func (c *GB28181Config) OnNotify(req sip.Request, tx sip.ServerTransaction) { from, ok := req.From() @@ -323,15 +335,17 @@ func (c *GB28181Config) OnNotify(req sip.Request, tx sip.ServerTransaction) { case "MobilePosition": //更新channel的坐标 d.UpdateChannelPosition(temp.DeviceID, temp.Time, temp.Longitude, temp.Latitude) - // case "Alarm": - // //报警事件通知 TODO + case "Alarm": + d.Status = DeviceAlarmedStatus default: d.Warn("Not supported CmdType", zap.String("CmdType", temp.CmdType), zap.String("body", req.Body())) response := sip.NewResponseFromRequest("", req, http.StatusBadRequest, "", "") tx.Respond(response) return } - + EmitEvent(NotifyEvent{ + Type: temp.CmdType, + Device: d}) tx.Respond(sip.NewResponseFromRequest("", req, http.StatusOK, "OK", body)) } } diff --git a/main.go b/main.go index 4384b73..e65706c 100644 --- a/main.go +++ b/main.go @@ -13,50 +13,44 @@ import ( ) type GB28181PositionConfig struct { - AutosubPosition bool //是否自动订阅定位 - Expires time.Duration `default:"3600s"` //订阅周期(单位:秒) - Interval time.Duration `default:"6s"` //订阅间隔(单位:秒) + AutosubPosition bool `desc:"是否自动订阅定位"` //是否自动订阅定位 + Expires time.Duration `default:"3600s" desc:"订阅周期"` //订阅周期 + Interval time.Duration `default:"6s" desc:"订阅间隔"` //订阅间隔 } type GB28181Config struct { - InviteMode int `default:"1"` //邀请模式,0:手动拉流,1:预拉流,2:按需拉流 - InviteIDs string //按照国标gb28181协议允许邀请的设备类型:132 摄像机 NVR - ListenAddr string `default:"0.0.0.0"` + InviteMode int `default:"1" desc:"拉流模式" enum:"0:手动拉流,1:预拉流,2:按需拉流"` //邀请模式,0:手动拉流,1:预拉流,2:按需拉流 + InviteIDs string `desc:"允许邀请的设备类型( 11~13位是设备类型编码),逗号分割"` //按照国标gb28181协议允许邀请的设备类型:132 摄像机 NVR + ListenAddr string `default:"0.0.0.0" desc:"监听IP地址"` //监听地址 //sip服务器的配置 - SipNetwork string `default:"udp"` //传输协议,默认UDP,可选TCP - SipIP string //sip 服务器公网IP - SipPort uint16 `default:"5060"` //sip 服务器端口,默认 5060 - Serial string `default:"34020000002000000001"` //sip 服务器 id, 默认 34020000002000000001 - Realm string `default:"3402000000"` //sip 服务器域,默认 3402000000 - Username string //sip 服务器账号 - Password string //sip 服务器密码 + SipNetwork string `default:"udp" desc:"废弃,请使用 Port"` //传输协议,默认UDP,可选TCP + SipIP string `desc:"sip 服务IP地址"` //sip 服务器公网IP + SipPort uint16 `default:"5060" desc:"废弃,请使用 Port"` //sip 服务器端口,默认 5060 + Serial string `default:"34020000002000000001" desc:"sip 服务 id"` //sip 服务器 id, 默认 34020000002000000001 + Realm string `default:"3402000000" desc:"sip 服务域"` //sip 服务器域,默认 3402000000 + Username string `desc:"sip 服务账号"` //sip 服务器账号 + Password string `desc:"sip 服务密码"` //sip 服务器密码 Port struct { // 新配置方式 - Sip string `default:"udp:5060"` - Media string `default:"tcp:58200-59200"` + Sip string `default:"udp:5060" desc:"sip服务端口号"` + Media string `default:"tcp:58200-59200" desc:"媒体服务端口号"` } - // AckTimeout uint16 //sip 服务应答超时,单位秒 - RegisterValidity time.Duration `default:"3600s"` //注册有效期,单位秒,默认 3600 - // RegisterInterval int //注册间隔,单位秒,默认 60 - HeartbeatInterval time.Duration `default:"60s"` //心跳间隔,单位秒,默认 60 - // HeartbeatRetry int //心跳超时次数,默认 3 + RegisterValidity time.Duration `default:"3600s" desc:"注册有效期"` //注册有效期,单位秒,默认 3600 + HeartbeatInterval time.Duration `default:"60s" desc:"心跳间隔"` //心跳间隔,单位秒,默认 60 //媒体服务器配置 - MediaIP string //媒体服务器地址 - MediaPort uint16 `default:"58200"` //媒体服务器端口 - MediaNetwork string `default:"tcp"` //媒体传输协议,默认UDP,可选TCP - MediaPortMin uint16 `default:"58200"` - MediaPortMax uint16 `default:"59200"` - // MediaIdleTimeout uint16 //推流超时时间,超过则断开链接,让设备重连 + MediaIP string `desc:"媒体服务IP地址"` //媒体服务器地址 + MediaPort uint16 `default:"58200" desc:"废弃,请使用 Port"` //媒体服务器端口 + MediaNetwork string `default:"tcp" desc:"废弃,请使用 Port"` //媒体传输协议,默认UDP,可选TCP + MediaPortMin uint16 `default:"58200" desc:"废弃,请使用 Port"` + MediaPortMax uint16 `default:"59200" desc:"废弃,请使用 Port"` - // WaitKeyFrame bool //是否等待关键帧,如果等待,则在收到第一个关键帧之前,忽略所有媒体流 - RemoveBanInterval time.Duration `default:"600s"` //移除禁止设备间隔 - // UdpCacheSize int //udp缓存大小 - LogLevel string `default:"info"` //trace, debug, info, warn, error, fatal, panic - routes map[string]string - DumpPath string //dump PS流本地文件路径 - Ignores map[string]struct{} - tcpPorts PortManager - udpPorts PortManager + RemoveBanInterval time.Duration `default:"600s" desc:"移除禁止设备间隔"` //移除禁止设备间隔 + routes map[string]string + DumpPath string `desc:"dump PS流本地文件路径"` //dump PS流本地文件路径 + Ignores []string `desc:"忽略的设备ID"` //忽略的设备ID + ignores map[string]struct{} + tcpPorts PortManager + udpPorts PortManager Position GB28181PositionConfig //关于定位的配置参数 @@ -89,11 +83,17 @@ func (c *GB28181Config) OnEvent(event any) { c.MediaPortMin = ports[0] c.MediaPortMax = ports[1] } else { - c.MediaPortMin = 0 + c.MediaPortMin = 0 c.MediaPortMax = 0 c.MediaPort = ports[0] } } + if len(c.Ignores) > 0 { + c.ignores = make(map[string]struct{}) + for _, v := range c.Ignores { + c.ignores[v] = util.Null + } + } os.MkdirAll(c.DumpPath, 0766) c.ReadDevices() go c.initRoutes() diff --git a/server.go b/server.go index efe915f..ca9532f 100755 --- a/server.go +++ b/server.go @@ -7,13 +7,13 @@ import ( "strings" "time" - "github.com/logrusorgru/aurora/v4" - "go.uber.org/zap" - "m7s.live/plugin/gb28181/v4/utils" - "github.com/ghettovoice/gosip" "github.com/ghettovoice/gosip/log" "github.com/ghettovoice/gosip/sip" + "github.com/logrusorgru/aurora/v4" + "go.uber.org/zap" + . "m7s.live/engine/v4" + "m7s.live/plugin/gb28181/v4/utils" ) var srv gosip.Server @@ -119,7 +119,7 @@ func (c *GB28181Config) startServer() { addr := c.ListenAddr + ":" + strconv.Itoa(int(c.SipPort)) logger := utils.NewZapLogger(GB28181Plugin.Logger, "GB SIP Server", nil) - logger.SetLevel(uint32(levelMap[c.LogLevel])) + logger.SetLevel(uint32(levelMap[EngineConfig.LogLevel])) // logger := log.NewDefaultLogrusLogger().WithPrefix("GB SIP Server") srvConf := gosip.ServerConfig{} if c.SipIP != "" {