From 63a0f4e093a038500a1781b47d3352d6b5b7b453 Mon Sep 17 00:00:00 2001 From: wanggang <76527413@qq.com> Date: Wed, 20 Nov 2019 10:33:15 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=AE=BE=E5=A4=87=E6=8E=A5?= =?UTF-8?q?=E5=85=A5=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Former-commit-id: 4b0e517fb33605d82f9ea178daa3bb464bf80618 --- projects/Infrastructure/Data/EfDbContext.cs | 27 ++- projects/Infrastructure/Web/BaseStartup.cs | 7 +- .../Application/Domain/Entities/Device.cs | 1 + .../Services/IoTCenter/IoTCenterHub.cs | 8 + .../IoTCenter/Controllers/AppController.cs | 3 +- .../Assets/StreamingAssets/wwwroot/js/node.js | 2 +- .../Assets/StreamingAssets/wwwroot/js/page.js | 117 ++++++------ .../DeviceServices/BaseDeviceService.cs | 30 +++ .../DeviceServices/FBee/FBeeService.cs | 180 +++++------------- .../DeviceServices/Onvif/OnvifService.cs | 61 +++--- 10 files changed, 212 insertions(+), 224 deletions(-) diff --git a/projects/Infrastructure/Data/EfDbContext.cs b/projects/Infrastructure/Data/EfDbContext.cs index 8891e9c7..728353c0 100644 --- a/projects/Infrastructure/Data/EfDbContext.cs +++ b/projects/Infrastructure/Data/EfDbContext.cs @@ -1,6 +1,9 @@ using Infrastructure.Domain; using Infrastructure.Extensions; +using Microsoft.AspNetCore.Hosting; using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; @@ -11,18 +14,34 @@ namespace Infrastructure.Data { public class EfDbContext : DbContext { - public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => + public static readonly ILoggerFactory DebugLogFactory = LoggerFactory.Create(builder => { - builder.AddConsole(); + //builder.AddConsole(); }); - public EfDbContext(DbContextOptions options) : base(options) + public static readonly ILoggerFactory ProductLogFactory = LoggerFactory.Create(builder => { + }); + + private readonly IHostEnvironment _env; + private readonly IConfiguration _cfg; + + public EfDbContext(DbContextOptions options, IHostEnvironment env, IConfiguration cfg) : base(options) + { + this._env = env; + this._cfg = cfg; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { - optionsBuilder?.UseLoggerFactory(MyLoggerFactory); + if (this._env.IsDevelopment()) + { + optionsBuilder?.UseLoggerFactory(DebugLogFactory); + } + else + { + optionsBuilder?.UseLoggerFactory(ProductLogFactory); + } optionsBuilder?.EnableSensitiveDataLogging(); base.OnConfiguring(optionsBuilder); } diff --git a/projects/Infrastructure/Web/BaseStartup.cs b/projects/Infrastructure/Web/BaseStartup.cs index 80c00769..992c5e43 100644 --- a/projects/Infrastructure/Web/BaseStartup.cs +++ b/projects/Infrastructure/Web/BaseStartup.cs @@ -56,9 +56,10 @@ namespace Infrastructure.Web public virtual void ConfigureServices(IServiceCollection services) { - if(!this._env.IsDevelopment()) + if (!this._env.IsDevelopment()) { - services.AddResponseCompression(options => { + services.AddResponseCompression(options => + { options.Providers.Add(); options.Providers.Add(); }); @@ -212,7 +213,7 @@ namespace Infrastructure.Web { throw new ArgumentNullException(nameof(app)); } - if(!env.IsDevelopment()) + if (!env.IsDevelopment()) { app.UseResponseCompression(); } diff --git a/projects/IoT.Shared/Application/Domain/Entities/Device.cs b/projects/IoT.Shared/Application/Domain/Entities/Device.cs index 6bf8ddae..b0ce8fd0 100644 --- a/projects/IoT.Shared/Application/Domain/Entities/Device.cs +++ b/projects/IoT.Shared/Application/Domain/Entities/Device.cs @@ -101,6 +101,7 @@ namespace Application.Domain.Entities var oldData = this.Data.FirstOrDefault(o => o.Key == data.Key); if (oldData == null) { + oldData = data; this.Data.Add(data); } else diff --git a/projects/IoT.Shared/Services/IoTCenter/IoTCenterHub.cs b/projects/IoT.Shared/Services/IoTCenter/IoTCenterHub.cs index 7af0c9ab..675591e1 100644 --- a/projects/IoT.Shared/Services/IoTCenter/IoTCenterHub.cs +++ b/projects/IoT.Shared/Services/IoTCenter/IoTCenterHub.cs @@ -180,6 +180,14 @@ namespace IoTCenter.Services var model = message.FromJson(); this._dataService.Edit(model); } + //else if (method == $"Edit{nameof(Data)}List") + //{ + // var list = message.FromJson>(); + // foreach (var model in list) + // { + // this._dataService.Edit(model); + // } + //} else if (method == $"Delete{nameof(Data)}")//删除数据返回 { var model = message.FromJson(); diff --git a/projects/IoTCenter/Controllers/AppController.cs b/projects/IoTCenter/Controllers/AppController.cs index 4aa91a54..ef7acc21 100644 --- a/projects/IoTCenter/Controllers/AppController.cs +++ b/projects/IoTCenter/Controllers/AppController.cs @@ -322,7 +322,8 @@ namespace IoTCenter.Controllers var hours = Convert.ToInt32(DateTime.Now.ToString("%z")); using (var client = new InfluxClient(new Uri(url), usr, pwd)) { - var fileds = String.Join(',', device.Data.Where(o => o.Type == DeviceDataType.Int || o.Type == DeviceDataType.Float).Select(o => o.Key)); + var keys = device.Data.Where(o => o.Type == DeviceDataType.Int || o.Type == DeviceDataType.Float).Select(o => o.Key); + var fileds = String.Join(',', keys); if (!string.IsNullOrEmpty(fileds)) { var query = $"select {fileds} from {measurementName} where time>now()-{time} and DeviceNumber = '{device.Number}' limit 10000"; diff --git a/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/node.js b/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/node.js index bc5b56cd..0d14cd19 100644 --- a/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/node.js +++ b/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/node.js @@ -118,7 +118,7 @@ function onMessage(method, json, to, from) { if (method == 'DeviceEntityInserted' || method == 'DeviceEntityUpdated' || method == 'DeviceEntityDeleted') { - loadData(); + toastr.info(item.DisplayName + '更新'); } else if (method == 'DataEntityInserted' || method == 'DataEntityUpdated' || diff --git a/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/page.js b/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/page.js index c9c08ce5..8d3827e9 100644 --- a/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/page.js +++ b/projects/IoTClient/Assets/StreamingAssets/wwwroot/js/page.js @@ -25,7 +25,7 @@ var volume = 0.5; if (isApp) { Framework7.use(Framework7Vue); } -toastr.options.timeOut = 500; +toastr.options.timeOut = 200; toastr.options.positionClass = "toast-top-center"; var f7params = isApp? { routes: [], @@ -421,7 +421,6 @@ function UpdateChart(deviceNumber) { var data = response.data; UpdateChartInternal(canvas, device.DisplayName, data); console.log('折线图更新成功'); - toastr.info('折线图更新成功'); }) .catch(function (error) { console.log(error); @@ -483,15 +482,19 @@ function playHls(videoElement) { ? Enumerable.from(vm.model.Devices).where(function (o) { return o.Number === number; }).firstOrDefault() : vm.model; if (device) { - var url = Enumerable.from(device.Data).where(o => o.Name === '子码流hls').firstOrDefault().Value; - var hasPtz = Enumerable.from(device.Data).where(o => o.Name === '缩放支持').firstOrDefault(); - if (hasPtz && hasPtz.Value === '是') { - $('#ptz').show(); - } - else { - $('#ptz').hide(); + var name = isApp ? "子码流hls" : "主码流hls"; + var data = Enumerable.from(device.Data).where(o => o.Name === name).firstOrDefault(); + if (data) { + var url = data.Value; + var hasPtz = Enumerable.from(device.Data).where(o => o.Name === '缩放支持').firstOrDefault(); + if (hasPtz && hasPtz.Value === '是') { + $('#ptz').show(); + } + else { + $('#ptz').hide(); + } + video.src = url; } - video.src = url; } } function playFlv(videoElement) { @@ -500,51 +503,55 @@ function playFlv(videoElement) { var device = vm.model.Devices ? Enumerable.from(vm.model.Devices).where(function (o) { return o.Number === number; }).firstOrDefault() : vm.model; - var url = Enumerable.from(device.Data).where(o => o.Name === '子码流flv').firstOrDefault().Value; - var hasPtz = Enumerable.from(device.Data).where(o => o.Name === '缩放支持').firstOrDefault(); - if (hasPtz && hasPtz.Value === '是') { - $('#ptz').show(); - } - else { - $('#ptz').hide(); - } - closePlayer(livePlayer); - try { - livePlayer = flvjs.createPlayer({ - type: 'flv', - url: url, - isLive: true, - cors: true - }, { - enableWorker: true, - enableStashBuffer: false, - stashInitialSize: 1, - fixAudioTimestampGap: false - }); - livePlayer.attachMediaElement(videoElement); - livePlayer.load(); - livePlayer.volume = volume; - livePlayer.muted = muted; - timer = setInterval(function () { - console.log('.'); - if (livePlayer.statisticsInfo.speed == 0) { - console.log('reload1'); - clearInterval(timer); - playFlv(videoElement); - } - else if (decodedFrames && livePlayer.statisticsInfo.decodedFrames <= decodedFrames) { - console.log('reload2'); - clearInterval(timer); - playFlv(videoElement); - } - else if (livePlayer.buffered.end(0) - livePlayer.currentTime > 1) { - console.log('reset currentTime'); - livePlayer.currentTime = livePlayer.buffered.end(0) - 0.001; - } - decodedFrames = livePlayer.statisticsInfo.decodedFrames; - }, 10 * 1000); - } catch (e) { - console.log(e); + var name = isApp ? "子码流flv" : "主码流flv"; + var data = Enumerable.from(device.Data).where(o => o.Name === name).firstOrDefault(); + if (data) { + var url = data.Value; + var hasPtz = Enumerable.from(device.Data).where(o => o.Name === '缩放支持').firstOrDefault(); + if (hasPtz && hasPtz.Value === '是') { + $('#ptz').show(); + } + else { + $('#ptz').hide(); + } + closePlayer(livePlayer); + try { + livePlayer = flvjs.createPlayer({ + type: 'flv', + url: url, + isLive: true, + cors: true + }, { + enableWorker: true, + enableStashBuffer: false, + stashInitialSize: 1, + fixAudioTimestampGap: false + }); + livePlayer.attachMediaElement(videoElement); + livePlayer.load(); + livePlayer.volume = volume; + livePlayer.muted = muted; + timer = setInterval(function () { + console.log('.'); + if (livePlayer.statisticsInfo.speed == 0) { + console.log('reload1'); + clearInterval(timer); + playFlv(videoElement); + } + else if (decodedFrames && livePlayer.statisticsInfo.decodedFrames <= decodedFrames) { + console.log('reload2'); + clearInterval(timer); + playFlv(videoElement); + } + else if (livePlayer.buffered.end(0) - livePlayer.currentTime > 1) { + console.log('reset currentTime'); + livePlayer.currentTime = livePlayer.buffered.end(0) - 0.001; + } + decodedFrames = livePlayer.statisticsInfo.decodedFrames; + }, 10 * 1000); + } catch (e) { + console.log(e); + } } } } diff --git a/projects/IoTNode/DeviceServices/BaseDeviceService.cs b/projects/IoTNode/DeviceServices/BaseDeviceService.cs index b258debc..2643936f 100644 --- a/projects/IoTNode/DeviceServices/BaseDeviceService.cs +++ b/projects/IoTNode/DeviceServices/BaseDeviceService.cs @@ -8,6 +8,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using System; +using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -69,6 +70,35 @@ namespace IoTNode.DeviceServices eventPubliser.Publish(new EntityUpdatedEvent(data)); } + public void UpdateDevice(IRepository repo, Device device) + { + if (repo.SaveChanges() > 0) + { + this.SendToServer(Methods.EditDevice, device.To()); + } + } + + public void UpdateData(IRepository repo, Device device, Data data) + { + var data2 = device.AddorUpdateData(data); + if (repo.SaveChanges() > 0 && !data2.Hidden) + { + this.SendDataToServer(data2); + } + } + + //public void SendDataToServer(List list) + //{ + // using var scope = _applicationServices.CreateScope(); + // var iotNodeClient = scope.ServiceProvider.GetService(); + // iotNodeClient.ClientToServer($"Edit{typeof(Data).Name}", list, null); + // var eventPubliser = scope.ServiceProvider.GetService(); + // foreach (var data in list) + // { + // eventPubliser.Publish(new EntityUpdatedEvent(data)); + // } + //} + public Product UpdateProduct(string productName, string productNumber, string path, string categoryNumber, string productIcon) { var scope = _applicationServices.CreateScope(); diff --git a/projects/IoTNode/DeviceServices/FBee/FBeeService.cs b/projects/IoTNode/DeviceServices/FBee/FBeeService.cs index c5075442..9cacbd01 100644 --- a/projects/IoTNode/DeviceServices/FBee/FBeeService.cs +++ b/projects/IoTNode/DeviceServices/FBee/FBeeService.cs @@ -141,9 +141,7 @@ namespace IoTNode.DeviceServices.FBee deviceRepo.Add(device); } device.Ip = ip; - deviceRepo.SaveChanges(); - var deviceDto = device.To(); - this.SendToServer(Methods.EditDevice, deviceDto); + this.UpdateDevice(deviceRepo, device); } var gateways = deviceRepo.ReadOnlyTable().Where(o => o.Product.Name == "FBee网关").ToList(); foreach (var gateway in gateways) @@ -497,79 +495,49 @@ namespace IoTNode.DeviceServices.FBee deviceRepo.Add(device); } device.IsOnline = isOnline != 0x00; - - var dataList = new List(); - device.AddorUpdateData(device.CreateData(Keys.DeviceId, deviceId, DeviceDataType.Int, Keys.DeviceId, hidden: true, timestamp: timestamp)); - device.AddorUpdateData(device.CreateData(Keys.Address, address, DeviceDataType.String, Keys.Address, hidden: true, timestamp: timestamp)); - device.AddorUpdateData(device.CreateData(Keys.EndPoint, endpoint, DeviceDataType.Int, Keys.EndPoint, hidden: true, timestamp: timestamp)); + this.UpdateDevice(deviceRepo, device); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.DeviceId, deviceId, DeviceDataType.Int, Keys.DeviceId, hidden: true, timestamp: timestamp)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Address, address, DeviceDataType.String, Keys.Address, hidden: true, timestamp: timestamp)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.EndPoint, endpoint, DeviceDataType.Int, Keys.EndPoint, hidden: true, timestamp: timestamp)); if (new int[] { 0x0002, 0x0009, 0x0081, 0x0202, 0x0220, 0x0051 }.Contains(deviceId)) { if (deviceId == 0x202) { } - var state = device.CreateData(Keys.State, switchState == 0 ? "关" : (switchState == 1 ? "开" : "停"), DeviceDataType.String, "状态", timestamp: timestamp); - if (!device.Data.Any(o => o.Key == Keys.State)) - { - device.AddorUpdateData(state); - dataList.Add(state); - } + this.UpdateData(deviceRepo, device, device.CreateData(Keys.State, switchState == 0 ? "关" : (switchState == 1 ? "开" : "停"), DeviceDataType.String, "状态", timestamp: timestamp)); } var battery = ms.ReadByte(); - device.AddorUpdateData(device.CreateData(Keys.Battery, battery, DeviceDataType.Int, Keys.Battery, hidden: true, timestamp: timestamp)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Battery, battery, DeviceDataType.Int, Keys.Battery, hidden: true, timestamp: timestamp)); var epCount = ms.ReadByte(); - device.AddorUpdateData(device.CreateData(Keys.EndPointCount, battery, DeviceDataType.Int, Keys.EndPointCount, hidden: true, timestamp: timestamp)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.EndPointCount, battery, DeviceDataType.Int, Keys.EndPointCount, hidden: true, timestamp: timestamp)); if (device.Name == "光强检测器") { ms.Read(2); var light = BitConverter.ToInt16(ms.Read(2)); var desc = this.GetDescription(Keys.Light, light); - var deviceData = device.CreateData(Keys.Light, light, DeviceDataType.Int, "光照度", "lux", desc, timestamp: timestamp); - if (!device.Data.Any(o => o.Key == Keys.Light)) - { - device.AddorUpdateData(deviceData); - dataList.Add(deviceData); - } + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Light, light, DeviceDataType.Int, "光照度", "lux", desc, timestamp: timestamp)); } else if (device.Name == "温湿度传感器") { var temperature = BitConverter.ToInt16(ms.Read(2)) / 100f; - var data1 = device.CreateData(Keys.Temperature, temperature, DeviceDataType.Float, "温度", "℃", this.GetDescription(Keys.Temperature, temperature), timestamp: timestamp); - if (!device.Data.Any(o => o.Key == Keys.Temperature)) - { - device.AddorUpdateData(data1); - dataList.Add(data1); - } + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Temperature, temperature, DeviceDataType.Float, "温度", "℃", this.GetDescription(Keys.Temperature, temperature), timestamp: timestamp)); var humidity = BitConverter.ToInt16(ms.Read(2)) / 100f; - var data2 = device.CreateData(Keys.Humidity, humidity, DeviceDataType.Float, "湿度", "RH%", this.GetDescription(Keys.Humidity, humidity), timestamp: timestamp); - if (!device.Data.Any(o => o.Key == Keys.Humidity)) - { - device.AddorUpdateData(data2); - dataList.Add(data2); - } + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Humidity, humidity, DeviceDataType.Float, "湿度", "RH%", this.GetDescription(Keys.Humidity, humidity), timestamp: timestamp)); } else if (device.Name == "烟雾报警器" || device.Name == "人体感应器") { var state = BitConverter.ToInt16(ms.Read(2)); - var data1 = device.CreateData(Keys.Warning, state == 1 ? "警报" : "正常", DeviceDataType.String, "状态", timestamp: timestamp); - if (!device.Data.Any(o => o.Key == Keys.Warning)) - { - device.AddorUpdateData(data1); - dataList.Add(data1); - } + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Warning, state == 1 ? "警报" : "正常", DeviceDataType.String, "状态", timestamp: timestamp)); } //var historyData = ms.ReadHexString((int)(ms.Length - ms.Position)); //device.AddorUpdateData(device.CreateData(Keys.Data, historyData, DeviceDataType.String, Keys.Data, hidden: true)); - device.AddorUpdateData(device.CreateData(Keys.ZoneType, zoneType, DeviceDataType.String, Keys.ZoneType, hidden: true, timestamp: timestamp)); - deviceRepo.SaveChanges(); - var deviceDto = device.To(); - this.SendToServer(Methods.EditDevice, deviceDto); - foreach (var item in dataList) - { - this.SendDataToServer(item); - } - this.UpdateStatus(device); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.ZoneType, zoneType, DeviceDataType.String, Keys.ZoneType, hidden: true, timestamp: timestamp)); + //deviceRepo.SaveChanges(); + //var deviceDto = device.To(); + //this.SendToServer(Methods.EditDevice, deviceDto); + //this.UpdateStatus(device); } else { @@ -707,31 +675,30 @@ namespace IoTNode.DeviceServices.FBee var device = this.GetDeviceByAddress(deviceRepo, sn, address); if (device != null) { - var dataList = new List(); + Data deviceData = null; var switchState = ms.ReadInt(); if (device.Name.Contains("二路开关") || device.Name.Contains("三路开关")) { if (endpoint == 0x10) { - device.AddorUpdateData(device.CreateData(Keys.L1State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L1状态", timestamp: timestamp)); + deviceData = device.CreateData(Keys.L1State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L1状态", timestamp: timestamp); } else if (endpoint == 0x11) { - device.AddorUpdateData(device.CreateData(Keys.L2State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L2状态", timestamp: timestamp)); + deviceData = device.CreateData(Keys.L2State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L2状态", timestamp: timestamp); } else if (endpoint == 0x12) { - device.AddorUpdateData(device.CreateData(Keys.L3State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L3状态", timestamp: timestamp)); + deviceData = device.CreateData(Keys.L3State, switchState == 0 ? "关" : "开", DeviceDataType.String, "L3状态", timestamp: timestamp); } } else { - device.AddorUpdateData(device.CreateData(Keys.State, switchState == 0 ? "关" : (switchState == 1 ? "开" : "停"), DeviceDataType.String, "状态", timestamp: timestamp)); + deviceData = device.CreateData(Keys.State, switchState == 0 ? "关" : (switchState == 1 ? "开" : "停"), DeviceDataType.String, "状态", timestamp: timestamp); } - deviceRepo.SaveChanges(); - foreach (var item in device.Data.Where(o => !o.Hidden)) + if (deviceData != null) { - this.SendDataToServer(item); + this.UpdateData(deviceRepo, device, deviceData); } } else @@ -778,9 +745,7 @@ namespace IoTNode.DeviceServices.FBee var device = this.GetDeviceByAddress(deviceRepo, sn, address); if (device != null) { - device.AddorUpdateData(device.CreateData(Keys.Brightness, ms.ReadByte(), DeviceDataType.Int, "亮度", timestamp: timestamp)); - deviceRepo.SaveChanges(); - this.SendDataToServer(device.Data.FirstOrDefault(o => o.Key == Keys.Brightness)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Brightness, ms.ReadByte(), DeviceDataType.Int, "亮度", timestamp: timestamp)); } else { @@ -824,9 +789,7 @@ namespace IoTNode.DeviceServices.FBee var device = this.GetDeviceByAddress(deviceRepo, sn, address); if (device != null) { - device.AddorUpdateData(device.CreateData(Keys.Hue, ms.ReadByte(), DeviceDataType.Int, "色调", timestamp: timestamp)); - deviceRepo.SaveChanges(); - this.SendDataToServer(device.Data.FirstOrDefault(o => o.Key == Keys.Hue)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Hue, ms.ReadByte(), DeviceDataType.Int, "色调", timestamp: timestamp)); } else { @@ -856,9 +819,7 @@ namespace IoTNode.DeviceServices.FBee var device = this.GetDeviceByAddress(deviceRepo, sn, address); if (device != null) { - device.AddorUpdateData(device.CreateData(Keys.Saturation, ms.ReadByte(), DeviceDataType.Int, "饱和度", timestamp: timestamp)); - deviceRepo.SaveChanges(); - this.SendDataToServer(device.Data.FirstOrDefault(o => o.Key == Keys.Saturation)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Saturation, ms.ReadByte(), DeviceDataType.Int, "饱和度", timestamp: timestamp)); } else { @@ -952,24 +913,22 @@ namespace IoTNode.DeviceServices.FBee var snid = ms.ReadHexString(4); using (var scope = _applicationServices.CreateScope()) { - var gatewayRepo = scope.ServiceProvider.GetService>(); - var gateway = gatewayRepo.Table() + var deviceRepo = scope.ServiceProvider.GetService>(); + var device = deviceRepo.Table() .Include(o => o.Data) .FirstOrDefault(o => o.Number == sn); - if (gateway == null) + if (device == null) { Console.WriteLine($"gateway {sn} hasn't save in database"); } else { - gateway.UserName = ms.ReadASIIString(20); - gateway.Password = ms.ReadASIIString(20); - - gateway.AddorUpdateData(gateway.CreateData(Keys.Version, version, DeviceDataType.String, "版本", timestamp: timestamp)); - gateway.AddorUpdateData(gateway.CreateData(Keys.DeviceCount, ms.ReadByte(), DeviceDataType.Int, "设备数量", timestamp: timestamp)); - gatewayRepo.SaveChanges(); - this.SendDataToServer(gateway.Data.FirstOrDefault(o => o.Key == Keys.Version)); - this.SendDataToServer(gateway.Data.FirstOrDefault(o => o.Key == Keys.DeviceCount)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Version, version, DeviceDataType.String, "版本", timestamp: timestamp)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.DeviceCount, ms.ReadByte(), DeviceDataType.Int, "设备数量", timestamp: timestamp)); + this.UpdateDevice(deviceRepo, device); + device.UserName = ms.ReadASIIString(20); + device.Password = ms.ReadASIIString(20); + this.UpdateDevice(deviceRepo, device); ms.ReadByte(); ms.ReadByte(); ms.ReadByte(); @@ -1020,9 +979,7 @@ namespace IoTNode.DeviceServices.FBee var device = this.GetDeviceByAddress(deviceRepo, sn, address); if (device != null) { - device.AddorUpdateData(device.CreateData(Keys.ColorTemperature, ms.ReadInt(), DeviceDataType.Int, "色温", timestamp: timestamp)); - deviceRepo.SaveChanges(); - this.SendDataToServer(device.Data.FirstOrDefault(o => o.Key == Keys.ColorTemperature)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.ColorTemperature, ms.ReadInt(), DeviceDataType.Int, "色温", timestamp: timestamp)); } else { @@ -1177,7 +1134,6 @@ namespace IoTNode.DeviceServices.FBee var clusterId = (ClusterId)ms.ReadInt(); if (device != null) { - var dataList = new List(); var deviceId = Convert.ToInt32(device.GetDataValue(Keys.DeviceId)); var reportCount = ms.ReadByte(); var props = new Dictionary(); @@ -1230,7 +1186,9 @@ namespace IoTNode.DeviceServices.FBee var status = props.First().Value[0]; if (status == 0x00)//离网 { + var model = device.To(); deviceRepo.Delete(device); + this.SendToServer("DeleteDevice", model); } else if (status == 0x03)//入网 { @@ -1240,18 +1198,12 @@ namespace IoTNode.DeviceServices.FBee { var light = BitConverter.ToInt16(props[0x0000]); var desc = this.GetDescription(Keys.Light, light); - var deviceData = device.CreateData(Keys.Light, light, DeviceDataType.Int, "光照度", "lux", desc, timestamp: timestamp); - device.AddorUpdateData(deviceData); - var dataDto = deviceData.To(); - dataList.Add(dataDto); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Light, light, DeviceDataType.Int, "光照度", "lux", desc, timestamp: timestamp)); } else if (clusterId == ClusterId.alarm) { var state = BitConverter.ToInt16(props[0x0080]); - var data1 = device.CreateData(Keys.Warning, state == 1 ? "警报" : "正常", DeviceDataType.String, "状态", timestamp: timestamp); - var dto1 = data1.To(); - device.AddorUpdateData(data1); - dataList.Add(dto1); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Warning, state == 1 ? "警报" : "正常", DeviceDataType.String, "状态", timestamp: timestamp)); //var data2 = device.CreateData(Keys.UnderVoltage, new BitArray(props[0x0080])[3], DeviceDataType.Int, "低电量"); //device.AddorUpdateData(data2); @@ -1265,43 +1217,25 @@ namespace IoTNode.DeviceServices.FBee var pm1d0 = BitConverter.ToInt16(props[0x0002]); var pm10 = BitConverter.ToInt16(props[0x0001]); - var data1 = device.CreateData(Keys.PM25, pm2d5, DeviceDataType.Int, "PM2.5", "μg/m³", this.GetDescription(Keys.PM25, pm2d5), timestamp: timestamp); - var data2 = device.CreateData(Keys.PM100, pm1d0, DeviceDataType.Int, "PM10", "μg/m³", this.GetDescription(Keys.PM100, pm1d0), timestamp: timestamp); - var data3 = device.CreateData(Keys.PM10, pm10, DeviceDataType.Int, "PM1.0", "μg/m³"); - device.AddorUpdateData(data1); - device.AddorUpdateData(data2); - device.AddorUpdateData(data3); - var dto1 = data1.To(); - var dto2 = data2.To(); - var dto3 = data3.To(); - dataList.Add(dto1); - dataList.Add(dto2); - dataList.Add(dto3); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.PM25, pm2d5, DeviceDataType.Int, "PM2.5", "μg/m³", this.GetDescription(Keys.PM25, pm2d5), timestamp: timestamp)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.PM100, pm1d0, DeviceDataType.Int, "PM10", "μg/m³", this.GetDescription(Keys.PM100, pm1d0), timestamp: timestamp)); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.PM10, pm10, DeviceDataType.Int, "PM1.0", "μg/m³")); } else if (clusterId == ClusterId.temperature) { var temperature = BitConverter.ToInt16(props[0x0000]) / 100f; var desc = this.GetDescription(Keys.Temperature, temperature); - var data1 = device.CreateData(Keys.Temperature, temperature, DeviceDataType.Float, "温度", "℃", desc, timestamp: timestamp); - device.AddorUpdateData(data1); - var dto1 = data1.To(); - dataList.Add(dto1); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Temperature, temperature, DeviceDataType.Float, "温度", "℃", desc, timestamp: timestamp)); } else if (clusterId == ClusterId.humidity) { var humidity = BitConverter.ToInt16(props[0x0000]) / 100f; var desc = this.GetDescription(Keys.Humidity, humidity); - var data1 = device.CreateData(Keys.Humidity, humidity, DeviceDataType.Float, "湿度", "RH%", desc, timestamp: timestamp); - device.AddorUpdateData(data1); - var dto1 = data1.To(); - dataList.Add(dto1); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Humidity, humidity, DeviceDataType.Float, "湿度", "RH%", desc, timestamp: timestamp)); } else if (clusterId == ClusterId.voltage) { - var data1 = device.CreateData(Keys.Voltage, props[0x21][0] / 2f, DeviceDataType.Float, "电量", hidden: true, timestamp: timestamp); - device.AddorUpdateData(data1); - var dto1 = data1.To(); - dataList.Add(dto1); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Voltage, props[0x21][0] / 2f, DeviceDataType.Float, "电量", hidden: true, timestamp: timestamp)); } else if (clusterId == ClusterId.socket) { @@ -1313,10 +1247,7 @@ namespace IoTNode.DeviceServices.FBee tempBytes.Add(0x00); var electricity = BitConverter.ToInt64(tempBytes.ToArray()) / 1000f; - var data1 = device.CreateData(Keys.Electricity, electricity, DeviceDataType.Float, "电量", "kWh", timestamp: timestamp); - device.AddorUpdateData(data1); - var dto1 = data1.To(); - dataList.Add(dto1); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Electricity, electricity, DeviceDataType.Float, "电量", "kWh", timestamp: timestamp)); } } if (deviceId == 0x0163) @@ -1329,10 +1260,7 @@ namespace IoTNode.DeviceServices.FBee var irVersion = BitConverter.ToString((props[0x400a].Skip(3).Take(6).ToArray())).Replace("-", "").ToLower(); if (!string.IsNullOrEmpty(irVersion)) { - var data1 = device.CreateData(Keys.Version, irVersion, DeviceDataType.String, "红外版本", timestamp: timestamp); - device.AddorUpdateData(data1); - var dto1 = data1.To(); - dataList.Add(dto1); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.Version, irVersion, DeviceDataType.String, "红外版本", timestamp: timestamp)); } } else @@ -1344,10 +1272,7 @@ namespace IoTNode.DeviceServices.FBee if (irDeviceType == 0x01) { var keyCode = BitConverter.ToInt16(irdata.Skip(12).Take(2).ToArray()); - var data1 = device.CreateData(Keys.KeyPress, keyCode, DeviceDataType.Int, "按键", timestamp: timestamp); - device.AddorUpdateData(data1); - var dto1 = data1.To(); - dataList.Add(dto1); + this.UpdateData(deviceRepo, device, device.CreateData(Keys.KeyPress, keyCode, DeviceDataType.Int, "按键", timestamp: timestamp)); } } } @@ -1360,11 +1285,6 @@ namespace IoTNode.DeviceServices.FBee this.X8D07020000(sn, device.Number); } } - deviceRepo.SaveChanges(); - foreach (var item in device.Data.Where(o => !o.Hidden)) - { - this.SendDataToServer(item); - } } } } diff --git a/projects/IoTNode/DeviceServices/Onvif/OnvifService.cs b/projects/IoTNode/DeviceServices/Onvif/OnvifService.cs index 1f9cfb7d..f6b0bd61 100644 --- a/projects/IoTNode/DeviceServices/Onvif/OnvifService.cs +++ b/projects/IoTNode/DeviceServices/Onvif/OnvifService.cs @@ -135,20 +135,20 @@ namespace IoTNode.DeviceServices.Onvif ProductId = product.Id, NodeId = node.Id }; + deviceRepo.Add(device); + this.UpdateDevice(deviceRepo, device); var fileName = $"ffmpeg-{Helper.Instance.GetRunTime()}{(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : "")}"; var file = Path.Combine(this._env.WebRootPath, fileName); - device.AddorUpdateData(device.CreateData("Push", "是", DeviceDataType.String, "推流")); - device.AddorUpdateData(device.CreateData("Record", "否", DeviceDataType.String, "录像")); - device.AddorUpdateData(device.CreateData("ffmpeg.file", file, DeviceDataType.String, "ffmpeg路径", hidden: true)); - device.AddorUpdateData(device.CreateData("ffmpeg.args", this._cfg["ffmpeg.args"], DeviceDataType.String, "ffmpeg.args", hidden: true)); - device.AddorUpdateData(device.CreateData("mainrtmp", $"rtmp://{this._cfg["stream.rtmp"]}/live/main{ipCamera.Id}", DeviceDataType.String, "主码流rtmp")); - device.AddorUpdateData(device.CreateData("mainflv", $"http://{this._cfg["stream.flv"]}/live/main{ipCamera.Id}.flv", DeviceDataType.String, "主码流flv")); - device.AddorUpdateData(device.CreateData("mainhls", $"http://{this._cfg["stream.hls"]}/live/main{ipCamera.Id}.m3u8", DeviceDataType.String, "主码流hls")); - device.AddorUpdateData(device.CreateData("subrtmp", $"rtmp://{this._cfg["stream.rtmp"]}/live/sub{ipCamera.Id}", DeviceDataType.String, "子码流rtmp")); - device.AddorUpdateData(device.CreateData("subflv", $"http://{this._cfg["stream.flv"]}/live/sub{ipCamera.Id}.flv", DeviceDataType.String, "子码流flv")); - device.AddorUpdateData(device.CreateData("subhls", $"http://{this._cfg["stream.hls"]}/live/sub{ipCamera.Id}.m3u8", DeviceDataType.String, "子码流hls")); - deviceRepo.Add(device); - deviceRepo.SaveChanges(); + this.UpdateData(deviceRepo, device, device.CreateData("Push", "是", DeviceDataType.String, "推流")); + this.UpdateData(deviceRepo, device, device.CreateData("Record", "否", DeviceDataType.String, "录像")); + this.UpdateData(deviceRepo, device, device.CreateData("ffmpeg.file", file, DeviceDataType.String, "ffmpeg路径", hidden: true)); + this.UpdateData(deviceRepo, device, device.CreateData("ffmpeg.args", this._cfg["ffmpeg.args"], DeviceDataType.String, "ffmpeg.args", hidden: true)); + this.UpdateData(deviceRepo, device, device.CreateData("mainrtmp", $"rtmp://{this._cfg["stream.rtmp"]}/live/main{ipCamera.Id}", DeviceDataType.String, "主码流rtmp")); + this.UpdateData(deviceRepo, device, device.CreateData("mainflv", $"http://{this._cfg["stream.flv"]}/live/main{ipCamera.Id}.flv", DeviceDataType.String, "主码流flv")); + this.UpdateData(deviceRepo, device, device.CreateData("mainhls", $"http://{this._cfg["stream.hls"]}/live/main{ipCamera.Id}.m3u8", DeviceDataType.String, "主码流hls")); + this.UpdateData(deviceRepo, device, device.CreateData("subrtmp", $"rtmp://{this._cfg["stream.rtmp"]}/live/sub{ipCamera.Id}", DeviceDataType.String, "子码流rtmp")); + this.UpdateData(deviceRepo, device, device.CreateData("subflv", $"http://{this._cfg["stream.flv"]}/live/sub{ipCamera.Id}.flv", DeviceDataType.String, "子码流flv")); + this.UpdateData(deviceRepo, device, device.CreateData("subhls", $"http://{this._cfg["stream.hls"]}/live/sub{ipCamera.Id}.m3u8", DeviceDataType.String, "子码流hls")); } var profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl); var needAuth = false; @@ -158,6 +158,7 @@ namespace IoTNode.DeviceServices.Onvif needAuth = true; device.UserName = device.UserName ?? this._cfg["camera.usr"]; device.Password = device.Password ?? this._cfg["camera.pwd"]; + this.UpdateDevice(deviceRepo, device); profiles = this._onvifDeviceManagement.GetProfiles(ipCamera.DeviceUrl, ipCamera.MediaUrl, device.UserName, device.Password); if (profiles == "") { @@ -194,30 +195,30 @@ namespace IoTNode.DeviceServices.Onvif } ipCamera.ParseStreamUri(); ipCamera.ParseSnapshotUri(); - device.AddorUpdateData(device.CreateData("MainToken", ipCamera.Profiles.First().Token, DeviceDataType.String, "主码流Token")); - device.AddorUpdateData(device.CreateData("SubToken", ipCamera.Profiles.Last().Token, DeviceDataType.String, "子码流Token")); - device.AddorUpdateData(device.CreateData("MainStreamUri", ipCamera.MainStreamUri, DeviceDataType.String, "主码流地址")); - device.AddorUpdateData(device.CreateData("MainSnapshotUri", ipCamera.MainSnapshotUri, DeviceDataType.String, "主码流截图地址")); - device.AddorUpdateData(device.CreateData("SubStreamUri", ipCamera.SubStreamUri, DeviceDataType.String, "子码流地址")); - device.AddorUpdateData(device.CreateData("SubSnapshotUri", ipCamera.SubSnapshotUri, DeviceDataType.String, "子码流截图地址")); + this.UpdateData(deviceRepo, device, device.CreateData("MainToken", ipCamera.Profiles.First().Token, DeviceDataType.String, "主码流Token")); + this.UpdateData(deviceRepo, device, device.CreateData("SubToken", ipCamera.Profiles.Last().Token, DeviceDataType.String, "子码流Token")); + this.UpdateData(deviceRepo, device, device.CreateData("MainStreamUri", ipCamera.MainStreamUri, DeviceDataType.String, "主码流地址")); + this.UpdateData(deviceRepo, device, device.CreateData("MainSnapshotUri", ipCamera.MainSnapshotUri, DeviceDataType.String, "主码流截图地址")); + this.UpdateData(deviceRepo, device, device.CreateData("SubStreamUri", ipCamera.SubStreamUri, DeviceDataType.String, "子码流地址")); + this.UpdateData(deviceRepo, device, device.CreateData("SubSnapshotUri", ipCamera.SubSnapshotUri, DeviceDataType.String, "子码流截图地址")); } } catch (Exception ex) { ex.PrintStack(ex.Message); } - device.AddorUpdateData(device.CreateData("NeedAuth", needAuth ? "是" : "否", DeviceDataType.String, "需认证")); - device.AddorUpdateData(device.CreateData("HasAuth", hasAuth ? "是" : "否", DeviceDataType.String, "已认证")); - device.AddorUpdateData(device.CreateData("DeviceUrl", ipCamera.DeviceUrl, DeviceDataType.String, "设备地址")); - device.AddorUpdateData(device.CreateData("PtzAddress", ipCamera.PTZAddress, DeviceDataType.String, "云台地址")); - device.AddorUpdateData(device.CreateData("Ptz3DZoomSupport", ipCamera.Ptz3DZoomSupport ? "是" : "否", DeviceDataType.String, "缩放支持")); - deviceRepo.SaveChanges(); - var deviceDto = device.To(); - this.SendToServer(Methods.EditDevice, deviceDto); - foreach (var item in device.Data.Where(o => !o.Hidden)) - { - this.SendDataToServer(item); - } + this.UpdateData(deviceRepo, device, device.CreateData("NeedAuth", needAuth ? "是" : "否", DeviceDataType.String, "需认证")); + this.UpdateData(deviceRepo, device, device.CreateData("HasAuth", hasAuth ? "是" : "否", DeviceDataType.String, "已认证")); + this.UpdateData(deviceRepo, device, device.CreateData("DeviceUrl", ipCamera.DeviceUrl, DeviceDataType.String, "设备地址")); + this.UpdateData(deviceRepo, device, device.CreateData("PtzAddress", ipCamera.PTZAddress, DeviceDataType.String, "云台地址")); + this.UpdateData(deviceRepo, device, device.CreateData("Ptz3DZoomSupport", ipCamera.Ptz3DZoomSupport ? "是" : "否", DeviceDataType.String, "缩放支持")); + //deviceRepo.SaveChanges(); + //var deviceDto = device.To(); + //this.SendToServer(Methods.EditDevice, deviceDto); + //foreach (var item in device.Data.Where(o => !o.Hidden)) + //{ + // this.SendDataToServer(item); + //} } } catch (Exception ex)