重构设备接入服务

Former-commit-id: 4b0e517fb33605d82f9ea178daa3bb464bf80618
TangShanKaiPing
wanggang 6 years ago
parent 767d365539
commit 63a0f4e093

@ -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);
}

@ -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<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
});
@ -212,7 +213,7 @@ namespace Infrastructure.Web
{
throw new ArgumentNullException(nameof(app));
}
if(!env.IsDevelopment())
if (!env.IsDevelopment())
{
app.UseResponseCompression();
}

@ -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

@ -180,6 +180,14 @@ namespace IoTCenter.Services
var model = message.FromJson<EditDataModel>();
this._dataService.Edit<Data, EditDataModel>(model);
}
//else if (method == $"Edit{nameof(Data)}List")
//{
// var list = message.FromJson<List<EditDataModel>>();
// foreach (var model in list)
// {
// this._dataService.Edit<Data, EditDataModel>(model);
// }
//}
else if (method == $"Delete{nameof(Data)}")//删除数据返回
{
var model = message.FromJson<EditDataModel>();

@ -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";

@ -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' ||

@ -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);
}
}
}
}

@ -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>(data));
}
public void UpdateDevice(IRepository<Device> repo, Device device)
{
if (repo.SaveChanges() > 0)
{
this.SendToServer(Methods.EditDevice, device.To<EditDeviceModel>());
}
}
public void UpdateData(IRepository<Device> repo, Device device, Data data)
{
var data2 = device.AddorUpdateData(data);
if (repo.SaveChanges() > 0 && !data2.Hidden)
{
this.SendDataToServer(data2);
}
}
//public void SendDataToServer(List<Data> list)
//{
// using var scope = _applicationServices.CreateScope();
// var iotNodeClient = scope.ServiceProvider.GetService<IoTNodeClient>();
// iotNodeClient.ClientToServer($"Edit{typeof(Data).Name}", list, null);
// var eventPubliser = scope.ServiceProvider.GetService<IEventPublisher>();
// foreach (var data in list)
// {
// eventPubliser.Publish(new EntityUpdatedEvent<Data>(data));
// }
//}
public Product UpdateProduct(string productName, string productNumber, string path, string categoryNumber, string productIcon)
{
var scope = _applicationServices.CreateScope();

@ -141,9 +141,7 @@ namespace IoTNode.DeviceServices.FBee
deviceRepo.Add(device);
}
device.Ip = ip;
deviceRepo.SaveChanges();
var deviceDto = device.To<EditDeviceModel>();
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<Data>();
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<EditDeviceModel>();
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<EditDeviceModel>();
//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<EditDataModel>();
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<IRepository<Device>>();
var gateway = gatewayRepo.Table()
var deviceRepo = scope.ServiceProvider.GetService<IRepository<Device>>();
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<EditDataModel>();
var deviceId = Convert.ToInt32(device.GetDataValue(Keys.DeviceId));
var reportCount = ms.ReadByte();
var props = new Dictionary<int, byte[]>();
@ -1230,7 +1186,9 @@ namespace IoTNode.DeviceServices.FBee
var status = props.First().Value[0];
if (status == 0x00)//离网
{
var model = device.To<EditDeviceModel>();
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<EditDataModel>();
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<EditDataModel>();
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<EditDataModel>();
var dto2 = data2.To<EditDataModel>();
var dto3 = data3.To<EditDataModel>();
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<EditDataModel>();
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<EditDataModel>();
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<EditDataModel>();
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<EditDataModel>();
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<EditDataModel>();
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<EditDataModel>();
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);
}
}
}
}

@ -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<EditDeviceModel>();
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<EditDeviceModel>();
//this.SendToServer(Methods.EditDevice, deviceDto);
//foreach (var item in device.Data.Where(o => !o.Hidden))
//{
// this.SendDataToServer(item);
//}
}
}
catch (Exception ex)

Loading…
Cancel
Save