mirror of
https://github.com/Monibuca/plugin-gb28181.git
synced 2025-12-24 13:27:57 +08:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ed397063c4 | ||
|
|
5853120d30 | ||
|
|
4c47df0695 |
15
README.md
15
README.md
@@ -18,16 +18,14 @@ _ "m7s.live/plugin/gb28181/v4"
|
||||
|
||||
```yaml
|
||||
gb28181:
|
||||
autoinvite: true #表示自动发起invite,当Server(SIP)接收到设备信息时,立即向设备发送invite命令获取流
|
||||
invitemode: 1 #0、手动invite 1、表示自动发起invite,当Server(SIP)接收到设备信息时,立即向设备发送invite命令获取流,2、按需拉流,既等待订阅者触发
|
||||
position:
|
||||
autosubposition: false #是否自动订阅定位
|
||||
expires: 3600s #订阅周期(单位:秒),默认3600
|
||||
interval: 6s #订阅间隔(单位:秒),默认6
|
||||
prefetchrecord: false
|
||||
udpcachesize: 0 #表示UDP缓存大小,默认为0,不开启。仅当TCP关闭,切缓存大于0时才开启
|
||||
sipnetwork: udp
|
||||
sipip: "" #sip服务器地址 默认 自动适配设备网段
|
||||
sipport: 5060
|
||||
serial: "34020000002000000001"
|
||||
realm: "3402000000"
|
||||
username: ""
|
||||
@@ -36,10 +34,9 @@ gb28181:
|
||||
registervalidity: 60s #注册有效期
|
||||
|
||||
mediaip: "" #媒体服务器地址 默认 自动适配设备网段
|
||||
mediaport: 58200 #媒体服务器端口,用于接收设备的流
|
||||
medianetwork: tcp
|
||||
mediaportmin: 0 #媒体服务器端口范围最小值,设置后将开启端口范围模式
|
||||
mediaportmax: 0 #媒体服务器端口范围最大值,设置后将开启端口范围模式
|
||||
port:
|
||||
sip: udp:5060 #sip服务器端口
|
||||
media: tcp:58200 #媒体服务器端口,用于接收设备的流,范围端口表示法:udp:50000-60000
|
||||
|
||||
removebaninterval: 10m #定时移除注册失败的设备黑名单,单位秒,默认10分钟(600秒)
|
||||
loglevel: info
|
||||
@@ -106,7 +103,7 @@ type Device struct {
|
||||
| startTime | 否 | 开始时间(纯数字Unix时间戳) |
|
||||
| endTime | 否 | 结束时间(纯数字Unix时间戳) |
|
||||
|
||||
返回200代表成功
|
||||
返回200代表成功, 304代表已经在拉取中,不能重复拉(仅仅针对直播流)
|
||||
|
||||
### 停止从设备拉流
|
||||
|
||||
@@ -117,6 +114,8 @@ type Device struct {
|
||||
| id | 是 | 设备ID |
|
||||
| channel | 是 | 通道编号 |
|
||||
|
||||
http 200 表示成功,404流不存在
|
||||
|
||||
### 发送控制命令
|
||||
|
||||
`/gb28181/api/control`
|
||||
|
||||
@@ -12,6 +12,7 @@ import (
|
||||
"github.com/ghettovoice/gosip/sip"
|
||||
"go.uber.org/zap"
|
||||
. "m7s.live/engine/v4"
|
||||
"m7s.live/engine/v4/log"
|
||||
"m7s.live/plugin/gb28181/v4/utils"
|
||||
"m7s.live/plugin/ps/v4"
|
||||
)
|
||||
@@ -57,6 +58,7 @@ type ChannelEx struct {
|
||||
GpsTime time.Time //gps时间
|
||||
Longitude string //经度
|
||||
Latitude string //纬度
|
||||
*log.Logger `json:"-" yaml:"-"`
|
||||
}
|
||||
|
||||
// Channel 通道
|
||||
@@ -239,6 +241,7 @@ func (channel *Channel) Invite(opt *InviteOptions) (code int, err error) {
|
||||
}
|
||||
defer func() {
|
||||
if err != nil {
|
||||
GB28181Plugin.Error("Invite", zap.Error(err))
|
||||
channel.status.Store(0)
|
||||
if conf.InviteMode == 1 {
|
||||
// 5秒后重试
|
||||
@@ -317,11 +320,11 @@ func (channel *Channel) Invite(opt *InviteOptions) (code int, err error) {
|
||||
invite.AppendHeader(&subject)
|
||||
inviteRes, err := d.SipRequestForResponse(invite)
|
||||
if err != nil {
|
||||
plugin.Error(fmt.Sprintf("SIP->Invite %s :%s invite error: %s", channel.DeviceID, invite.String(), err.Error()))
|
||||
channel.Error("invite", zap.Error(err), zap.String("msg", invite.String()))
|
||||
return http.StatusInternalServerError, err
|
||||
}
|
||||
code = int(inviteRes.StatusCode())
|
||||
plugin.Info(fmt.Sprintf("Channel :%s invite response status code: %d", channel.DeviceID, code))
|
||||
channel.Info("invite response", zap.Int("status code", code))
|
||||
|
||||
if code == OK {
|
||||
ds := strings.Split(inviteRes.Body(), "\r\n")
|
||||
@@ -331,7 +334,7 @@ func (channel *Channel) Invite(opt *InviteOptions) (code int, err error) {
|
||||
if _ssrc, err := strconv.ParseInt(ls[1], 10, 0); err == nil {
|
||||
opt.SSRC = uint32(_ssrc)
|
||||
} else {
|
||||
plugin.Error("read invite response y ", zap.Error(err))
|
||||
channel.Error("read invite response y ", zap.Error(err))
|
||||
}
|
||||
break
|
||||
}
|
||||
|
||||
45
device.go
45
device.go
@@ -12,6 +12,7 @@ import (
|
||||
|
||||
"go.uber.org/zap"
|
||||
"m7s.live/engine/v4"
|
||||
"m7s.live/engine/v4/log"
|
||||
"m7s.live/plugin/gb28181/v4/utils"
|
||||
|
||||
// . "github.com/logrusorgru/aurora"
|
||||
@@ -69,6 +70,7 @@ type Device struct {
|
||||
GpsTime time.Time //gps时间
|
||||
Longitude string //经度
|
||||
Latitude string //纬度
|
||||
*log.Logger `json:"-" yaml:"-"`
|
||||
}
|
||||
|
||||
func (d *Device) MarshalJSON() ([]byte, error) {
|
||||
@@ -112,7 +114,7 @@ func (c *GB28181Config) RecoverDevice(d *Device, req sip.Request) {
|
||||
if c.MediaIP != "" {
|
||||
mediaIp = c.MediaIP
|
||||
}
|
||||
plugin.Info("RecoverDevice", zap.String("id", d.ID), zap.String("deviceIp", deviceIp), zap.String("servIp", servIp), zap.String("sipIP", sipIP), zap.String("mediaIp", mediaIp))
|
||||
d.Info("RecoverDevice", zap.String("deviceIp", deviceIp), zap.String("servIp", servIp), zap.String("sipIP", sipIP), zap.String("mediaIp", mediaIp))
|
||||
d.Status = string(sip.REGISTER)
|
||||
d.sipIP = sipIP
|
||||
d.mediaIP = mediaIp
|
||||
@@ -132,7 +134,7 @@ func (c *GB28181Config) StoreDevice(id string, req sip.Request) (d *Device) {
|
||||
d.UpdateTime = time.Now()
|
||||
d.NetAddr = deviceIp
|
||||
d.addr = deviceAddr
|
||||
plugin.Debug("UpdateDevice", zap.String("id", id), zap.String("netaddr", d.NetAddr))
|
||||
d.Debug("UpdateDevice", zap.String("netaddr", d.NetAddr))
|
||||
} else {
|
||||
servIp := req.Recipient().Host()
|
||||
//根据网卡ip获取对应的公网ip
|
||||
@@ -153,7 +155,6 @@ func (c *GB28181Config) StoreDevice(id string, req sip.Request) (d *Device) {
|
||||
if c.MediaIP != "" {
|
||||
mediaIp = c.MediaIP
|
||||
}
|
||||
plugin.Info("StoreDevice", zap.String("id", id), zap.String("deviceIp", deviceIp), zap.String("servIp", servIp), zap.String("sipIP", sipIP), zap.String("mediaIp", mediaIp))
|
||||
d = &Device{
|
||||
ID: id,
|
||||
RegisterTime: time.Now(),
|
||||
@@ -163,7 +164,9 @@ func (c *GB28181Config) StoreDevice(id string, req sip.Request) (d *Device) {
|
||||
sipIP: sipIP,
|
||||
mediaIP: mediaIp,
|
||||
NetAddr: deviceIp,
|
||||
Logger: GB28181Plugin.With(zap.String("id", id)),
|
||||
}
|
||||
d.Info("StoreDevice", zap.String("deviceIp", deviceIp), zap.String("servIp", servIp), zap.String("sipIP", sipIP), zap.String("mediaIp", mediaIp))
|
||||
Devices.Store(id, d)
|
||||
c.SaveDevices()
|
||||
}
|
||||
@@ -177,6 +180,7 @@ func (c *GB28181Config) ReadDevices() {
|
||||
for _, item := range items {
|
||||
if time.Since(item.UpdateTime) < conf.RegisterValidity {
|
||||
item.Status = "RECOVER"
|
||||
item.Logger = GB28181Plugin.With(zap.String("id", item.ID))
|
||||
Devices.Store(item.ID, item)
|
||||
}
|
||||
}
|
||||
@@ -202,6 +206,7 @@ func (d *Device) addOrUpdateChannel(channel *Channel) {
|
||||
channel.ChannelEx = old.(*Channel).ChannelEx
|
||||
}
|
||||
channel.device = d
|
||||
channel.Logger = d.Logger.With(zap.String("channel", channel.DeviceID), zap.String("name", channel.Name))
|
||||
d.channelMap.Store(channel.DeviceID, channel)
|
||||
}
|
||||
|
||||
@@ -375,13 +380,13 @@ func (d *Device) Catalog() int {
|
||||
request.AppendHeader(&expires)
|
||||
request.SetBody(BuildCatalogXML(d.sn, d.ID), true)
|
||||
// 输出Sip请求设备通道信息信令
|
||||
plugin.Sugar().Debugf("SIP->Catalog:%s", request)
|
||||
GB28181Plugin.Sugar().Debugf("SIP->Catalog:%s", request)
|
||||
resp, err := d.SipRequestForResponse(request)
|
||||
if err == nil && resp != nil {
|
||||
plugin.Sugar().Debugf("SIP<-Catalog Response: %s", resp.String())
|
||||
GB28181Plugin.Sugar().Debugf("SIP<-Catalog Response: %s", resp.String())
|
||||
return int(resp.StatusCode())
|
||||
} else if err != nil {
|
||||
plugin.Error("SIP<-Catalog error:", zap.Error(err))
|
||||
GB28181Plugin.Error("SIP<-Catalog error:", zap.Error(err))
|
||||
}
|
||||
return http.StatusRequestTimeout
|
||||
}
|
||||
@@ -403,7 +408,7 @@ func (d *Device) QueryDeviceInfo() {
|
||||
// received, _ := via.Params.Get("received")
|
||||
// d.SipIP = received.String()
|
||||
// }
|
||||
plugin.Info(fmt.Sprintf("QueryDeviceInfo:%s ipaddr:%s response code:%d", d.ID, d.NetAddr, response.StatusCode()))
|
||||
d.Info("QueryDeviceInfo", zap.Uint16("status code", uint16(response.StatusCode())))
|
||||
if response.StatusCode() == OK {
|
||||
break
|
||||
}
|
||||
@@ -450,13 +455,13 @@ func (d *Device) UpdateChannelPosition(channelId string, gpsTime string, lng str
|
||||
c.ChannelEx.GpsTime = time.Now() //时间取系统收到的时间,避免设备时间和格式问题
|
||||
c.ChannelEx.Longitude = lng
|
||||
c.ChannelEx.Latitude = lat
|
||||
plugin.Sugar().Debugf("更新通道[%s]坐标成功\n", c.Name)
|
||||
c.Debug("update channel position success")
|
||||
} else {
|
||||
//如果未找到通道,则更新到设备上
|
||||
d.GpsTime = time.Now() //时间取系统收到的时间,避免设备时间和格式问题
|
||||
d.Longitude = lng
|
||||
d.Latitude = lat
|
||||
plugin.Sugar().Debugf("未找到通道[%s],更新设备[%s]坐标成功\n", channelId, d.ID)
|
||||
d.Debug("update device position success", zap.String("channelId", channelId))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -465,19 +470,19 @@ func (d *Device) UpdateChannelStatus(deviceList []*notifyMessage) {
|
||||
for _, v := range deviceList {
|
||||
switch v.Event {
|
||||
case "ON":
|
||||
plugin.Debug("收到通道上线通知")
|
||||
d.Debug("receive channel online notify")
|
||||
d.channelOnline(v.DeviceID)
|
||||
case "OFF":
|
||||
plugin.Debug("收到通道离线通知")
|
||||
d.Debug("receive channel offline notify")
|
||||
d.channelOffline(v.DeviceID)
|
||||
case "VLOST":
|
||||
plugin.Debug("收到通道视频丢失通知")
|
||||
d.Debug("receive channel video lost notify")
|
||||
d.channelOffline(v.DeviceID)
|
||||
case "DEFECT":
|
||||
plugin.Debug("收到通道故障通知")
|
||||
d.Debug("receive channel video defect notify")
|
||||
d.channelOffline(v.DeviceID)
|
||||
case "ADD":
|
||||
plugin.Debug("收到通道新增通知")
|
||||
d.Debug("receive channel add notify")
|
||||
channel := Channel{
|
||||
DeviceID: v.DeviceID,
|
||||
ParentID: v.ParentID,
|
||||
@@ -497,10 +502,10 @@ func (d *Device) UpdateChannelStatus(deviceList []*notifyMessage) {
|
||||
d.addOrUpdateChannel(&channel)
|
||||
case "DEL":
|
||||
//删除
|
||||
plugin.Debug("收到通道删除通知")
|
||||
d.Debug("receive channel delete notify")
|
||||
d.deleteChannel(v.DeviceID)
|
||||
case "UPDATE":
|
||||
plugin.Debug("收到通道更新通知")
|
||||
d.Debug("receive channel update notify")
|
||||
// 更新通道
|
||||
channel := &Channel{
|
||||
DeviceID: v.DeviceID,
|
||||
@@ -528,9 +533,9 @@ func (d *Device) channelOnline(DeviceID string) {
|
||||
if v, ok := d.channelMap.Load(DeviceID); ok {
|
||||
c := v.(*Channel)
|
||||
c.Status = "ON"
|
||||
plugin.Sugar().Debugf("通道[%s]在线\n", c.Name)
|
||||
c.Debug("online")
|
||||
} else {
|
||||
plugin.Sugar().Debugf("更新通道[%s]状态失败,未找到\n", DeviceID)
|
||||
d.Debug("update channel status failed, not found", zap.String("channelId", DeviceID))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -538,8 +543,8 @@ func (d *Device) channelOffline(DeviceID string) {
|
||||
if v, ok := d.channelMap.Load(DeviceID); ok {
|
||||
c := v.(*Channel)
|
||||
c.Status = "OFF"
|
||||
plugin.Sugar().Debugf("通道[%s]离线\n", c.Name)
|
||||
c.Debug("offline")
|
||||
} else {
|
||||
plugin.Sugar().Debugf("更新通道[%s]状态失败,未找到\n", DeviceID)
|
||||
d.Debug("update channel status failed, not found", zap.String("channelId", DeviceID))
|
||||
}
|
||||
}
|
||||
|
||||
7
go.mod
7
go.mod
@@ -8,10 +8,10 @@ require (
|
||||
github.com/logrusorgru/aurora v2.0.3+incompatible
|
||||
github.com/pion/rtp v1.7.13
|
||||
go.uber.org/zap v1.23.0
|
||||
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db
|
||||
golang.org/x/net v0.8.0
|
||||
golang.org/x/text v0.8.0
|
||||
m7s.live/engine/v4 v4.12.0
|
||||
m7s.live/engine/v4 v4.12.8
|
||||
m7s.live/plugin/ps/v4 v4.0.1
|
||||
)
|
||||
|
||||
require (
|
||||
@@ -49,11 +49,12 @@ require (
|
||||
github.com/tklauser/go-sysconf v0.3.11 // indirect
|
||||
github.com/tklauser/numcpus v0.6.0 // indirect
|
||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2 // indirect
|
||||
github.com/yapingcat/gomedia v0.0.0-20230222121919-c67df405bf33 // indirect
|
||||
github.com/yapingcat/gomedia v0.0.0-20230426092936-387031404274 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.2 // indirect
|
||||
go.uber.org/atomic v1.10.0 // indirect
|
||||
go.uber.org/multierr v1.8.0 // indirect
|
||||
golang.org/x/crypto v0.4.0 // indirect
|
||||
golang.org/x/exp v0.0.0-20221205204356-47842c84f3db // indirect
|
||||
golang.org/x/mod v0.8.0 // indirect
|
||||
golang.org/x/sync v0.1.0 // indirect
|
||||
golang.org/x/sys v0.6.0 // indirect
|
||||
|
||||
10
go.sum
10
go.sum
@@ -188,8 +188,8 @@ github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYm
|
||||
github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4=
|
||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2 h1:00txxvfBM9muc0jiLIEAkAcIMJzfthRT6usrui8uGmg=
|
||||
github.com/x-cray/logrus-prefixed-formatter v0.5.2/go.mod h1:2duySbKsL6M18s5GU7VPsoEPHyzalCE06qoARUCeBBE=
|
||||
github.com/yapingcat/gomedia v0.0.0-20230222121919-c67df405bf33 h1:uyZY++dluUg7iTSsNzuOVln/mC2U2KXwgKLfKLCJ74Y=
|
||||
github.com/yapingcat/gomedia v0.0.0-20230222121919-c67df405bf33/go.mod h1:WSZ59bidJOO40JSJmLqlkBJrjZCtjbKKkygEMfzY/kc=
|
||||
github.com/yapingcat/gomedia v0.0.0-20230426092936-387031404274 h1:cj4I+bvWX9I+Hg6tnZ7DAiOVxzhyLhdvYVKp+WpM/2c=
|
||||
github.com/yapingcat/gomedia v0.0.0-20230426092936-387031404274/go.mod h1:WSZ59bidJOO40JSJmLqlkBJrjZCtjbKKkygEMfzY/kc=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
@@ -332,5 +332,7 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
m7s.live/engine/v4 v4.12.0 h1:CRPbJ0jhHVZArc5mvV7e6Seb4Ye816kGzs3FOVKnfHw=
|
||||
m7s.live/engine/v4 v4.12.0/go.mod h1:AiJPBwdA77DM3fymlcH2qYPR8ivL6ib9UVLm1Rft/to=
|
||||
m7s.live/engine/v4 v4.12.8 h1:cNGyajzEkbUzIcPtcedGbxvMlIuScWxDb/raYFgAHKE=
|
||||
m7s.live/engine/v4 v4.12.8/go.mod h1:LoALBfV5rmsz5TJQr6cmLxM33mfUE5BKBq/sMtXOVlc=
|
||||
m7s.live/plugin/ps/v4 v4.0.1 h1:iKgo9D4g6vo3I97Je1hG8v/6+IDRei7sHnTCYBEyasY=
|
||||
m7s.live/plugin/ps/v4 v4.0.1/go.mod h1:lAPr3gGIFoU4ctMRnPeyjbcREueyT6TfiKhWBgDrOGM=
|
||||
|
||||
19
handle.go
19
handle.go
@@ -6,7 +6,6 @@ import (
|
||||
"encoding/xml"
|
||||
"fmt"
|
||||
|
||||
"github.com/logrusorgru/aurora"
|
||||
"go.uber.org/zap"
|
||||
"m7s.live/plugin/gb28181/v4/utils"
|
||||
|
||||
@@ -32,7 +31,7 @@ func (a *Authorization) Verify(username, passwd, realm, nonce string) bool {
|
||||
r2 := a.getDigest(s2)
|
||||
|
||||
if r1 == "" || r2 == "" {
|
||||
plugin.Error("Authorization algorithm wrong")
|
||||
GB28181Plugin.Error("Authorization algorithm wrong")
|
||||
return false
|
||||
}
|
||||
//3、将密文 1,nonce 和密文 2 依次组合获取 1 个字符串,并对这个字符串使用算法加密,获得密文 r3,即Response
|
||||
@@ -56,9 +55,9 @@ func (c *GB28181Config) OnRegister(req sip.Request, tx sip.ServerTransaction) {
|
||||
from, _ := req.From()
|
||||
|
||||
id := from.Address.User().String()
|
||||
plugin.Sugar().Infof("OnRegister: %s, %s, from: %s", req.Destination(), id, req.Source())
|
||||
GB28181Plugin.Info("OnRegister", zap.String("id", id), zap.String("source", req.Source()), zap.String("destination", req.Destination()))
|
||||
if len(id) != 20 {
|
||||
plugin.Sugar().Infof("Wrong GB-28181 id: %s", id)
|
||||
GB28181Plugin.Info("Wrong GB-28181", zap.String("id", id))
|
||||
return
|
||||
}
|
||||
passAuth := false
|
||||
@@ -148,7 +147,7 @@ func (d *Device) syncChannels() {
|
||||
func (c *GB28181Config) OnMessage(req sip.Request, tx sip.ServerTransaction) {
|
||||
from, _ := req.From()
|
||||
id := from.Address.User().String()
|
||||
plugin.Sugar().Debugf("SIP<-OnMessage from %s : %s", req.Source(), req.String())
|
||||
GB28181Plugin.Debug("SIP<-OnMessage", zap.String("id", id), zap.String("source", req.Source()), zap.String("req", req.String()))
|
||||
if v, ok := Devices.Load(id); ok {
|
||||
d := v.(*Device)
|
||||
switch d.Status {
|
||||
@@ -177,7 +176,7 @@ func (c *GB28181Config) OnMessage(req sip.Request, tx sip.ServerTransaction) {
|
||||
if err != nil {
|
||||
err = utils.DecodeGbk(temp, []byte(req.Body()))
|
||||
if err != nil {
|
||||
plugin.Error("decode catelog err", zap.Error(err))
|
||||
GB28181Plugin.Error("decode catelog err", zap.Error(err))
|
||||
}
|
||||
}
|
||||
var body string
|
||||
@@ -199,7 +198,7 @@ func (c *GB28181Config) OnMessage(req sip.Request, tx sip.ServerTransaction) {
|
||||
//在KeepLive 进行位置订阅的处理,如果开启了自动订阅位置,则去订阅位置
|
||||
if c.Position.AutosubPosition && time.Since(d.GpsTime) > c.Position.Interval*2 {
|
||||
d.MobilePositionSubscribe(d.ID, c.Position.Expires, c.Position.Interval)
|
||||
plugin.Sugar().Debugf("位置自动订阅,设备[%s]成功\n", d.ID)
|
||||
GB28181Plugin.Debug("Mobile Position Subscribe", zap.String("deviceID", d.ID))
|
||||
}
|
||||
case "Catalog":
|
||||
d.UpdateChannels(temp.DeviceList)
|
||||
@@ -214,7 +213,7 @@ func (c *GB28181Config) OnMessage(req sip.Request, tx sip.ServerTransaction) {
|
||||
d.Status = "Alarmed"
|
||||
body = BuildAlarmResponseXML(d.ID)
|
||||
default:
|
||||
plugin.Sugar().Warnf("DeviceID:", aurora.Red(d.ID), " Not supported CmdType : "+temp.CmdType+" body:\n", req.Body)
|
||||
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
|
||||
@@ -252,7 +251,7 @@ func (c *GB28181Config) OnNotify(req sip.Request, tx sip.ServerTransaction) {
|
||||
if err != nil {
|
||||
err = utils.DecodeGbk(temp, []byte(req.Body()))
|
||||
if err != nil {
|
||||
plugin.Error("decode catelog err", zap.Error(err))
|
||||
GB28181Plugin.Error("decode catelog err", zap.Error(err))
|
||||
}
|
||||
}
|
||||
var body string
|
||||
@@ -266,7 +265,7 @@ func (c *GB28181Config) OnNotify(req sip.Request, tx sip.ServerTransaction) {
|
||||
// case "Alarm":
|
||||
// //报警事件通知 TODO
|
||||
default:
|
||||
plugin.Sugar().Warnf("DeviceID:", aurora.Red(d.ID), " Not supported CmdType : "+temp.CmdType+" body:", req.Body)
|
||||
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
|
||||
|
||||
6
main.go
6
main.go
@@ -1,13 +1,13 @@
|
||||
package gb28181
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
myip "github.com/husanpao/ip"
|
||||
"go.uber.org/zap"
|
||||
. "m7s.live/engine/v4"
|
||||
"m7s.live/engine/v4/util"
|
||||
)
|
||||
@@ -73,7 +73,7 @@ func (c *GB28181Config) initRoutes() {
|
||||
c.routes[k[0:lastdot]] = k
|
||||
}
|
||||
}
|
||||
plugin.Info(fmt.Sprintf("LocalAndInternalIPs detail: %s", c.routes))
|
||||
GB28181Plugin.Info("LocalAndInternalIPs", zap.Any("routes", c.routes))
|
||||
}
|
||||
|
||||
func (c *GB28181Config) OnEvent(event any) {
|
||||
@@ -117,5 +117,5 @@ func (c *GB28181Config) IsMediaNetworkTCP() bool {
|
||||
|
||||
var conf GB28181Config
|
||||
|
||||
var plugin = InstallPlugin(&conf)
|
||||
var GB28181Plugin = InstallPlugin(&conf)
|
||||
var PullStreams sync.Map //拉流
|
||||
|
||||
@@ -118,7 +118,7 @@ func RequestForResponse(transport string, request sip.Request,
|
||||
func (c *GB28181Config) startServer() {
|
||||
addr := c.ListenAddr + ":" + strconv.Itoa(int(c.SipPort))
|
||||
|
||||
logger := utils.NewZapLogger(plugin.Logger, "GB SIP Server", nil)
|
||||
logger := utils.NewZapLogger(GB28181Plugin.Logger, "GB SIP Server", nil)
|
||||
logger.SetLevel(levelMap[c.LogLevel])
|
||||
// logger := log.NewDefaultLogrusLogger().WithPrefix("GB SIP Server")
|
||||
srvConf := gosip.ServerConfig{}
|
||||
@@ -132,9 +132,9 @@ func (c *GB28181Config) startServer() {
|
||||
srv.OnRequest(sip.BYE, c.OnBye)
|
||||
err := srv.Listen(strings.ToLower(c.SipNetwork), addr)
|
||||
if err != nil {
|
||||
plugin.Logger.Error("gb28181 server listen", zap.Error(err))
|
||||
GB28181Plugin.Logger.Error("gb28181 server listen", zap.Error(err))
|
||||
} else {
|
||||
plugin.Info(fmt.Sprint(aurora.Green("Server gb28181 start at"), aurora.BrightBlue(addr)))
|
||||
GB28181Plugin.Info(fmt.Sprint(aurora.Green("Server gb28181 start at"), aurora.BrightBlue(addr)))
|
||||
}
|
||||
|
||||
if c.MediaNetwork == "tcp" {
|
||||
|
||||
Reference in New Issue
Block a user