From e3a94a599b34727719f24b09183d8bdb25fbe476 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Haibo=20Chen=28=E9=99=88=E6=B5=B7=E5=8D=9A=29?= <495810242@qq.com> Date: Mon, 13 Oct 2025 17:14:39 +0800 Subject: [PATCH] merge (#33) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update log * update log level * Enhance config.yaml by adding a comment for log-level options * update log * Refactor SIP service start method to accept configuration parameter for log level management * 增加文档 * add common parser for device * 修复心跳单位错误 --- pkg/service/device.go | 75 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 61 insertions(+), 14 deletions(-) diff --git a/pkg/service/device.go b/pkg/service/device.go index d29f210..bd88de6 100644 --- a/pkg/service/device.go +++ b/pkg/service/device.go @@ -7,6 +7,7 @@ import ( "time" "github.com/ossrs/srs-sip/pkg/models" + "github.com/ossrs/srs-sip/pkg/utils" ) type DeviceInfo struct { @@ -15,14 +16,14 @@ type DeviceInfo struct { NetworkType string `json:"network_type"` ChannelMap sync.Map `json:"-"` Online bool `json:"online"` - HeartBeatInterval int `json:"heart_beat_interval"` - HeartBeatCount int `json:"heart_beat_count"` + HeartBeatInterval int `json:"heart_beat_interval"` // 心跳间隔时间,单位秒 + HeartBeatCount int `json:"heart_beat_count"` // 心跳超时次数 lastHeartbeat time.Time `json:"-"` } const ( - DefaultHeartbeatInterval = 60 * time.Second // 心跳检查间隔时间 - DefaultHeartbeatCount = 3 // 心跳检查次数 + DefaultHeartbeatInterval = 60 // 默认心跳检查间隔时间(秒) + DefaultHeartbeatCount = 3 // 默认心跳检查次数 ) type deviceManager struct { @@ -74,7 +75,7 @@ func (dm *deviceManager) checkHeartbeats() { device := value.(*DeviceInfo) if device.HeartBeatInterval == 0 { - device.HeartBeatInterval = int(DefaultHeartbeatInterval) + device.HeartBeatInterval = DefaultHeartbeatInterval } if device.HeartBeatCount == 0 { device.HeartBeatCount = DefaultHeartbeatCount @@ -232,15 +233,14 @@ func (dm *deviceManager) UpdateChannels(deviceID string, list ...models.ChannelI return fmt.Errorf("device not found: %s", deviceID) } - // clear ChannelMap - device.ChannelMap.Range(func(key, value interface{}) bool { - device.ChannelMap.Delete(key) - return true - }) - parser, ok := parserRegistry.GetParser(list[0].Manufacturer) if !ok { - return fmt.Errorf("no parser found for manufacturer: %s", list[0].Manufacturer) + // 如果找不到特定厂商的解析器,使用通用解析器 + parser, ok = parserRegistry.GetParser("Common") + if !ok { + return fmt.Errorf("no parser found for manufacturer: %s and common parser is not available", list[0].Manufacturer) + } + slog.Info("Using common parser for unknown manufacturer", "manufacturer", list[0].Manufacturer) } channels, err := parser.ParseChannels(list...) @@ -258,14 +258,29 @@ func (dm *deviceManager) UpdateChannels(deviceID string, list ...models.ChannelI func (dm *deviceManager) ApiGetChannelByDeviceId(deviceID string) []models.ChannelInfo { device, ok := dm.GetDevice(deviceID) if !ok { + slog.Info("Device not found", "device_id", deviceID) return nil } channels := make([]models.ChannelInfo, 0) device.ChannelMap.Range(func(key, value interface{}) bool { - channels = append(channels, value.(models.ChannelInfo)) + channel := value.(models.ChannelInfo) + slog.Debug("Found channel in ChannelMap", + "device_id", deviceID, + "channel_key", key, + "channel_id", channel.DeviceID, + "channel_name", channel.Name, + "channel_status", channel.Status, + "manufacturer", channel.Manufacturer, + "is_video_channel", utils.IsVideoChannel(channel.DeviceID)) + + // 只返回视频通道 + if utils.IsVideoChannel(channel.DeviceID) { + channels = append(channels, channel) + } return true }) + slog.Debug("Finished iterating ChannelMap", "device_id", deviceID, "total_channels", len(channels)) return channels } @@ -273,12 +288,35 @@ func (dm *deviceManager) GetAllVideoChannels() []models.ChannelInfo { channels := make([]models.ChannelInfo, 0) dm.devices.Range(func(key, value interface{}) bool { device := value.(*DeviceInfo) + deviceID := key.(string) + slog.Debug("Processing device", "device_id", deviceID, "online", device.Online) + + channelCount := 0 + videoChannelCount := 0 device.ChannelMap.Range(func(key, value interface{}) bool { - channels = append(channels, value.(models.ChannelInfo)) + channel := value.(models.ChannelInfo) + channelCount++ + isVideoChannel := utils.IsVideoChannel(channel.DeviceID) + slog.Debug("Found channel in device", + "device_id", deviceID, + "channel_key", key, + "channel_id", channel.DeviceID, + "channel_name", channel.Name, + "channel_status", channel.Status, + "manufacturer", channel.Manufacturer, + "parental", channel.Parental, + "is_video_channel", isVideoChannel) + + // 只添加视频通道 + if isVideoChannel { + videoChannelCount++ + channels = append(channels, channel) + } return true }) return true }) + slog.Debug("Finished getting all video channels", "total_channels", len(channels)) return channels } @@ -326,8 +364,17 @@ func (p *UniviewParser) ParseChannels(list ...models.ChannelInfo) ([]models.Chan return videoChannels, nil } +// Common channel parser implementation - used as fallback when no specific parser is found +type CommonParser struct{} + +func (p *CommonParser) ParseChannels(list ...models.ChannelInfo) ([]models.ChannelInfo, error) { + // 通用解析器:直接返回所有通道,不做特殊处理 + return list, nil +} + func init() { parserRegistry.RegisterParser("Hikvision", &HikvisionParser{}) parserRegistry.RegisterParser("DAHUA", &DahuaParser{}) parserRegistry.RegisterParser("UNIVIEW", &UniviewParser{}) + parserRegistry.RegisterParser("Common", &CommonParser{}) }