diff --git a/Cis.Application/Cis.Application.xml b/Cis.Application/Cis.Application.xml index 1b4c7d7..40d6810 100644 --- a/Cis.Application/Cis.Application.xml +++ b/Cis.Application/Cis.Application.xml @@ -416,19 +416,40 @@ - + 获取 ptz - - + - + 获取 ptz + + + + + 获取 ptz + + + + + + + + 获取 ptz + + + + + + + 获取 ptz + + diff --git a/Cis.Application/Cm/Service/CmMarkLabelService.cs b/Cis.Application/Cm/Service/CmMarkLabelService.cs index a007476..ce2c93d 100644 --- a/Cis.Application/Cm/Service/CmMarkLabelService.cs +++ b/Cis.Application/Cm/Service/CmMarkLabelService.cs @@ -26,7 +26,7 @@ public class CmMarkLabelService : IDynamicApiController, ITransient [HttpPost] public async Task Add([FromForm] CmMarkLabel entity) { - bool ret = _cameraSdk.GetPtzInfoById(entity.CbCameraId.ToString(), out PtzInfo ptzInfo); + bool ret = _cameraSdk.TryGetPtzInfoById(entity.CbCameraId.ToString(), out PtzInfo ptzInfo); if (!ret) return false; entity.PanPosition = ptzInfo.Pan; entity.TiltPosition = ptzInfo.Tilt; @@ -37,7 +37,7 @@ public class CmMarkLabelService : IDynamicApiController, ITransient [HttpPost] public async Task AddReturnId([FromForm] CmMarkLabel entity) { - bool ret = _cameraSdk.GetPtzInfoById(entity.CbCameraId.ToString(), out PtzInfo ptzInfo); + bool ret = _cameraSdk.TryGetPtzInfoById(entity.CbCameraId.ToString(), out PtzInfo ptzInfo); if (!ret) return 0; entity.PanPosition = ptzInfo.Pan; entity.TiltPosition = ptzInfo.Tilt; diff --git a/Cis.Application/Core/Center/CameraDataCenter.cs b/Cis.Application/Core/Center/CameraDataCenter.cs index 0c6d78b..3a21605 100644 --- a/Cis.Application/Core/Center/CameraDataCenter.cs +++ b/Cis.Application/Core/Center/CameraDataCenter.cs @@ -1,8 +1,8 @@ using Cis.Application.Core.Component.MarkSeacher; using Cis.Application.Core.Component.PtzServer; using EC.Helper.CameraSDK; +using FreeRedis; using StackExchange.Profiling.Internal; -using StackExchange.Redis; using System.Collections.Concurrent; namespace Cis.Application.Core; @@ -11,7 +11,7 @@ public class CameraDataCenter : ISingleton { #region Attr - private readonly IDatabase _cache; + private readonly RedisClient _cache; private readonly CameraDataOptions _options; private readonly ICameraSdkServer _cameraSdkServer; private readonly IMarkSearcherServer _markSearcherServer; @@ -25,7 +25,7 @@ public class CameraDataCenter : ISingleton #endregion Attr public CameraDataCenter( - IDatabase cache, + RedisClient cache, ICameraSdkServer cameraSdkServer, IMarkSearcherServer markSearcherServer ) @@ -49,11 +49,11 @@ public class CameraDataCenter : ISingleton private void InitThread() { // 初始化 CameraPtzThread - RefreshCameraPtzThread = new Thread(() => + RefreshCameraPtzThread = new Thread(async () => { while (true) { - RefreshCameraPtzInfos(); + await RefreshCameraPtzInfos(); Thread.Sleep(_options.CameraPtz.LoopInterval); } }) @@ -63,20 +63,20 @@ public class CameraDataCenter : ISingleton // 启动 CameraPtzThread RefreshCameraPtzThread.Start(); - // 初始化 MarkSearcherThread - RefreshMarkSearcherThread = new Thread(() => - { - while (true) - { - RefreshMarkSearchers(); - Thread.Sleep(_options.MarkSearcher.LoopInterval); - } - }) - { - IsBackground = true// 设置后台线程 - }; - // 启动 MarkSearcherThread - RefreshMarkSearcherThread.Start(); + //// 初始化 MarkSearcherThread + //RefreshMarkSearcherThread = new Thread(async () => + //{ + // while (true) + // { + // await RefreshMarkSearchers(); + // Thread.Sleep(_options.MarkSearcher.LoopInterval); + // } + //}) + //{ + // IsBackground = true// 设置后台线程 + //}; + //// 启动 MarkSearcherThread + //RefreshMarkSearcherThread.Start(); } /// @@ -84,13 +84,12 @@ public class CameraDataCenter : ISingleton /// 有待改善,应设置超时计数机制 /// https://blog.csdn.net/qq_28368039/article/details/118597396 /// - private async void RefreshCameraPtzInfos() + private async Task RefreshCameraPtzInfos() { - HashEntry[] entries = _cache.HashGetAll(CacheInfo.CameraIpCounts); + string[] cameraIpList = await _cache.HKeysAsync(CacheInfo.CameraIpCounts); List tasks = new(); - foreach (HashEntry entry in entries) + foreach (string cameraIp in cameraIpList) { - string cameraIp = entry.Name; tasks.Add(RefreshCameraPtzInfo(cameraIp)); } await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(_options.CameraPtz.Timeout)); @@ -103,21 +102,20 @@ public class CameraDataCenter : ISingleton /// private async Task RefreshCameraPtzInfo(string cameraIp) { - bool ret = _cameraSdkServer.GetPtzInfoByIp(cameraIp, out PtzInfo ptzInfo); + bool ret = _cameraSdkServer.TryGetPtzInfoByIp(cameraIp, out PtzInfo ptzInfo); if (!ret) return; - await _cache.HashSetAsync(CacheInfo.CameraPtzInfos, cameraIp, ptzInfo.ToJson()); + await _cache.HSetAsync(CacheInfo.CameraPtzInfos, cameraIp, ptzInfo.ToJson()); } /// /// 刷新所有 markSearcher /// - private async void RefreshMarkSearchers() + private async Task RefreshMarkSearchers() { - HashEntry[] entries = _cache.HashGetAll(CacheInfo.CameraId2Ip); + string[] cameraIdList = await _cache.HKeysAsync(CacheInfo.CameraId2Ip); List tasks = new(); - foreach (HashEntry entry in entries) + foreach (string cameraId in cameraIdList) { - string cameraId = entry.Name; tasks.Add(RefreshMarkSearcher(cameraId.ToLong())); } await Task.WhenAny(Task.WhenAll(tasks), Task.Delay(_options.CameraPtz.Timeout)); @@ -132,10 +130,11 @@ public class CameraDataCenter : ISingleton { MarkSearcherBase markSearcher = _markSearcherServer.GetSearcher(cameraId); if (markSearcher == null) return; - string cameraIp = _cache.HashGet(CacheInfo.CameraId2Ip, cameraId); - RedisValue value = _cache.HashGet(CacheInfo.CameraPtzInfos, cameraIp); - if (!value.HasValue) return; - PtzInfo ptzInfo = value.ToString().FromJson(); + string cameraIp = await _cache.HGetAsync(CacheInfo.CameraId2Ip, cameraId.ToString()); + string ptzInfoStr = await _cache.HGetAsync(CacheInfo.CameraPtzInfos, cameraIp); + if (string.IsNullOrEmpty(ptzInfoStr)) return; + PtzInfo ptzInfo = ptzInfoStr.ToObject(); + if (ptzInfo == null) return; markSearcher.UpdateCameraCalcParams(ptzInfo); List resultList = await markSearcher.SearchAsync(); SearchResultListDict[cameraId] = resultList; diff --git a/Cis.Application/Core/Component/CameraSDK/CameraSdkServer.cs b/Cis.Application/Core/Component/CameraSDK/CameraSdkServer.cs index eeab93b..9043bff 100644 --- a/Cis.Application/Core/Component/CameraSDK/CameraSdkServer.cs +++ b/Cis.Application/Core/Component/CameraSDK/CameraSdkServer.cs @@ -1,6 +1,6 @@ using Cis.Application.Core.Component.PtzServer; using EC.Helper.CameraSDK; -using StackExchange.Redis; +using FreeRedis; using System.Collections.Concurrent; namespace Cis.Application.Core.Component.CameraSDK; @@ -12,7 +12,7 @@ public class CameraSdkServer : ICameraSdkServer, ISingleton { #region Attr - private readonly IDatabase _cache; + private readonly RedisClient _cache; /// /// {ip, ICameraSDK} @@ -21,7 +21,7 @@ public class CameraSdkServer : ICameraSdkServer, ISingleton #endregion Attr - public CameraSdkServer(IDatabase cache) + public CameraSdkServer(RedisClient cache) { _cache = cache; } @@ -54,20 +54,38 @@ public class CameraSdkServer : ICameraSdkServer, ISingleton #region Main Method - public bool GetPtzInfoById(string cameraId, out PtzInfo ptzInfo) + public PtzInfo GetPtzInfoByIp(string ip) { - RedisValue value = _cache.HashGet(CacheInfo.CameraId2Ip, cameraId); - if (!value.HasValue) { ptzInfo = PtzInfo.Default; return false; } - string ip = value.ToString(); - return GetPtzInfoByIp(ip, out ptzInfo); + bool ret = CameraSdkDict.TryGetValue(ip, out ICameraSDK cameraSDK); + if (!ret) return PtzInfo.Default; + return cameraSDK.GetPtzInfo(); } - public bool GetPtzInfoByIp(string ip, out PtzInfo ptzInfo) + public async Task GetPtzInfoByIpAsync(string ip) + { + return await Task.Run(() => GetPtzInfoByIp(ip)); + } + + public bool TryGetPtzInfoByIp(string ip, out PtzInfo ptzInfo) { bool ret = CameraSdkDict.TryGetValue(ip, out ICameraSDK cameraSDK); if (!ret) { ptzInfo = PtzInfo.Default; return false; } return cameraSDK.TryGetPtzInfo(out ptzInfo); } + public async Task GetPtzInfoByIdAsync(string cameraId) + { + string ip = await _cache.HGetAsync(CacheInfo.CameraId2Ip, cameraId); + if (string.IsNullOrEmpty(ip)) return PtzInfo.Default; + return GetPtzInfoByIp(ip); + } + + public bool TryGetPtzInfoById(string cameraId, out PtzInfo ptzInfo) + { + string ip = _cache.HGet(CacheInfo.CameraId2Ip, cameraId); + if (string.IsNullOrEmpty(ip)) { ptzInfo = PtzInfo.Default; return false; } + return TryGetPtzInfoByIp(ip, out ptzInfo); + } + #endregion Main Method } \ No newline at end of file diff --git a/Cis.Application/Core/Component/CameraSDK/ICameraSdkServer.cs b/Cis.Application/Core/Component/CameraSDK/ICameraSdkServer.cs index 30adb5c..172b960 100644 --- a/Cis.Application/Core/Component/CameraSDK/ICameraSdkServer.cs +++ b/Cis.Application/Core/Component/CameraSDK/ICameraSdkServer.cs @@ -37,18 +37,39 @@ public interface ICameraSdkServer /// /// 获取 ptz /// - /// - /// + /// /// - public bool GetPtzInfoById(string cameraId, out PtzInfo ptzInfo); + public PtzInfo GetPtzInfoByIp(string ip); /// /// 获取 ptz /// /// + /// + public Task GetPtzInfoByIpAsync(string ip); + + /// + /// 获取 ptz + /// + /// + /// + /// + public bool TryGetPtzInfoByIp(string ip, out PtzInfo ptzInfo); + + /// + /// 获取 ptz + /// + /// + /// + public Task GetPtzInfoByIdAsync(string cameraId); + + /// + /// 获取 ptz + /// + /// /// /// - public bool GetPtzInfoByIp(string ip, out PtzInfo ptzInfo); + public bool TryGetPtzInfoById(string cameraId, out PtzInfo ptzInfo); #endregion Main Method } \ No newline at end of file diff --git a/Cis.Application/Core/Component/MarkSeacher/MarkSearcherServer.cs b/Cis.Application/Core/Component/MarkSeacher/MarkSearcherServer.cs index cb497e3..5c6db29 100644 --- a/Cis.Application/Core/Component/MarkSeacher/MarkSearcherServer.cs +++ b/Cis.Application/Core/Component/MarkSeacher/MarkSearcherServer.cs @@ -2,7 +2,7 @@ using Cis.Application.Cm; using Cis.Application.Core.Component.PtzServer; using EC.Helper.CameraSDK; -using StackExchange.Redis; +using FreeRedis; using System.Collections.Concurrent; namespace Cis.Application.Core.Component.MarkSeacher; @@ -17,7 +17,7 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton private readonly SqlSugarRepository _cbCameraRep; private readonly SqlSugarRepository _cbCameraParamsRep; private readonly SqlSugarRepository _cmMarkLableRep; - private readonly IDatabase _cache; + private readonly RedisClient _cache; private readonly ICameraSdkServer _cameraSdkServer; @@ -34,7 +34,7 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton #endregion Attr public MarkSearcherServer( - IDatabase cache, + RedisClient cache, ICameraSdkServer cameraSdkServer ) { @@ -89,7 +89,7 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton if (!ret) return false; } } - ret = _cameraSdkServer.GetPtzInfoByIp(cbCamera.Ip, out PtzInfo ptzInfo); + ret = _cameraSdkServer.TryGetPtzInfoByIp(cbCamera.Ip, out PtzInfo ptzInfo); if (!ret) return false; // 创建相机计算参数 @@ -117,8 +117,8 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton ret = MarkSearcherDict.TryAdd(cameraId, markSearcher); if (!ret) return false; // 记录缓存 - _cache.HashSet(CacheInfo.CameraId2Ip, cbCamera.Id, cbCamera.Ip); - _cache.HashIncrement(CacheInfo.CameraIpCounts, cbCamera.Ip); + _cache.HSet(CacheInfo.CameraId2Ip, cbCamera.Id.ToString(), cbCamera.Ip); + _cache.HIncrBy(CacheInfo.CameraIpCounts, cbCamera.Ip, 1); return true; } @@ -144,11 +144,10 @@ public class MarkSearcherServer : IMarkSearcherServer, ISingleton { bool ret = MarkSearcherDict.TryRemove(cameraId, out _); if (!ret) return false; - RedisValue value = _cache.HashGet(CacheInfo.CameraId2Ip, cameraId); - if (!value.HasValue) return false; - string cameraIp = (string)value; - _cache.HashDelete(CacheInfo.CameraId2Ip, cameraId); - _cache.HashDecrement(CacheInfo.CameraIpCounts, cameraIp); + string cameraIp = _cache.HGet(CacheInfo.CameraId2Ip, cameraId.ToString()); + if (string.IsNullOrEmpty(cameraIp)) return false; + _cache.HDel(CacheInfo.CameraId2Ip, cameraId.ToString()); + _cache.HIncrBy(CacheInfo.CameraIpCounts, cameraIp, -1); //int ipCount = (int)_cache.HashGet(CacheInfo.CameraIpCounts, cameraIp); //if (ipCount <= 0) //{ diff --git a/Cis.Core/Cache/CacheSetup.cs b/Cis.Core/Cache/CacheSetup.cs index 3e847ed..1138f5d 100644 --- a/Cis.Core/Cache/CacheSetup.cs +++ b/Cis.Core/Cache/CacheSetup.cs @@ -1,4 +1,4 @@ -using StackExchange.Redis; +using FreeRedis; namespace Cis.Core; @@ -10,11 +10,10 @@ public static class CacheSetup /// public static void AddCache(this IServiceCollection services) { - services.AddSingleton(options => + services.AddSingleton(options => { var redisOptions = App.GetOptions(); - ConnectionMultiplexer multiplexer = ConnectionMultiplexer.Connect(redisOptions.ConnectionString); - IDatabase cache = multiplexer.GetDatabase(); + RedisClient cache = new(redisOptions.ConnectionString); return cache; }); } diff --git a/Cis.Core/Cache/SqlSugarCache.cs b/Cis.Core/Cache/SqlSugarCache.cs index 501cca6..69be39c 100644 --- a/Cis.Core/Cache/SqlSugarCache.cs +++ b/Cis.Core/Cache/SqlSugarCache.cs @@ -7,7 +7,7 @@ namespace Cis.Core; /// public class SqlSugarCache : ICacheService, ISingleton { - private static readonly ICache _cache = NewLife.Caching.Cache.Default; + private static readonly ICache _cache = Cache.Default; public void Add(string key, V value) { diff --git a/Cis.Core/Cis.Core.csproj b/Cis.Core/Cis.Core.csproj index 82ea3ed..27d689b 100644 --- a/Cis.Core/Cis.Core.csproj +++ b/Cis.Core/Cis.Core.csproj @@ -24,16 +24,16 @@ + - - + diff --git a/Cis.Core/CoreConfig.json b/Cis.Core/CoreConfig.json index cf8258a..da4d820 100644 --- a/Cis.Core/CoreConfig.json +++ b/Cis.Core/CoreConfig.json @@ -9,9 +9,9 @@ //"ConnectionString": "DataSource=./cis.db", //"DbType": "PostgreSQL", //"ConnectionString": "HOST=127.0.0.1;PORT=5432;USER ID=pgsql;PASSWORD=123456;DATABASE=cis;", - "EnableInitDb": true // 启用库表初始化 + "EnableInitDb": false // 启用库表初始化 } - ] + ] }, "Redis": { "ConnectionString": "127.0.0.1:6379,password=123456,defaultDatabase=2"