using FBoxClientDriver.Contract; using Microsoft.AspNetCore.Cors; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Logging; using NLog; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Serilog; using InitQ.Cache; using Microsoft.Extensions.DependencyInjection; namespace Ropin.Environmentally.WebScada.Hubs { [EnableCors("cors")] public class MyHub : Hub { private readonly ILogger _logger; DeviceValueModel device = new DeviceValueModel(); private readonly IServiceProvider _provider; private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(MyHub)); public MyHub(ILogger logger, IServiceProvider provider) { _logger = logger; _provider = provider; } public Task SendMessage(string devId) { log.Info($"SendMessage接口到的数据【{devId}】"); using (var scope = _provider.GetRequiredService().CreateScope()) { // 获取调用方的ID string clientId = Context.ConnectionId; log.Info($"Context.ConnectionId【{clientId}】"); var _redisService = scope.ServiceProvider.GetService(); var devValues = _redisService.Get("fanyibox_devStore_" + devId); log.Info($"webSocket_devStore_{devId}数据:【{devValues}】"); _redisService.SetAsync($"webSocket_devStore_{devId}", "1"); return Clients.All.SendAsync("webSocket_devStore_" + devId, devValues); //_hubContext.Clients.All.SendAsync("webSocket_devStore_", str); // 向所有客户端广播消息,除了发送者 //Clients.AllExcept(new[] { Context.ConnectionId }).SendAsync("ReceiveMessage", $"{clientId} says: {message}"); // 如果需要向特定的客户端发送消息,可以使用Clients.Client(connectionId) // 例如,向ID为特定connectionId的客户端发送消息 //return Clients.Client(clientId).SendAsync("webSocket_devStore_"+ devId,devValues); } } [EnableCors("cors")] /// /// 这个方法允许客户端调用 /// public Task UpdateDataServer(DataStatus data) { Log.Logger = new LoggerConfiguration() .MinimumLevel.Information() .WriteTo.Console() .WriteTo.File("log/log.txt", rollingInterval: RollingInterval.Day, rollOnFileSizeLimit: true) .CreateLogger(); using (var dmon = new demo()) { dmon._fbox.DataMonitorValueChanged += _fbox_DataMonitorValueChanged; dmon.Start().Wait(); //Thread.Sleep(3000); //调用方法 // dmon.WriteValue(); string ln = "aa"; do { ln = Console.ReadLine(); } while (ln != "quit"); Log.CloseAndFlush(); } // 在里面可以调用客户端的方法 return Clients.All.SendAsync("UpdateData", data); } //public override async Task OnConnectedAsync() //{ // await Clients.All.SendAsync("UpdateData", "上线"); //} private void _fbox_DataMonitorValueChanged(object sender, IList e) { foreach (var dmon in e) { var deviceValue = $"dmv:{dmon.Uid},Value:{dmon.Value},Status:{dmon.Status},BoxNo:{dmon.BoxNo},Name:{dmon.Name},BoxId:{dmon.BoxId},GroupName:{dmon.GroupName},Timestamp:{dmon.Timestamp}"; //Console.WriteLine(deviceValue); //_logger.LogInformation(deviceValue); Log.Information(deviceValue); System.DateTime currentTime = new System.DateTime(); currentTime = System.DateTime.Now; Console.WriteLine(currentTime); //Clients.All.SendAsync("UpdateData", deviceValue); if (dmon.BoxNo.Equals("300220010352")) //shanghai { switch (dmon.Uid) { case 224872264061309166: //自动油雾过滤器电子差压计D0实际值 喷漆房1 device.Value = dmon.Value?.ToString().Split('.')[0]; device.Name = "自动油雾过滤器电子差压计D0实值"; break; case 224872320671830341: //前处理过滤箱电子差压计D2实际值 喷漆房1 device.Value10 = dmon.Value?.ToString().Split('.')[0]; device.Name10 = dmon.Name; break; case 224872358809588078: //前处理过滤箱电子差压计D3实际值 喷漆房1 device.Value11 = dmon.Value?.ToString().Split('.')[0]; device.Name11 = dmon.Name; break; case 224872398136431165: //前处理过滤箱电子差压计D4实际值 喷漆房1 device.Value12 = dmon.Value?.ToString().Split('.')[0]; device.Name12 = dmon.Name; break; case 224870861103322707: //\"数据块_1\".运行时间记录_D 喷漆房1 device.Value13 = dmon.Value?.ToString().Split('.')[0]; device.Name13 = "运行时间"; break; case 224870964895569613: //\"数据块_1\".运行时间记录_H 喷漆房1 device.Value14 = dmon.Value?.ToString().Split('.')[0]; device.Name14 = "运行时间"; break; case 224871047406966583: //\"数据块_1\".运行时间记录_M 喷漆房1 device.Value15 = dmon.Value?.ToString().Split('.')[0]; device.Name15 = "运行时间"; break; case 224870797169546552: //报警1 喷漆房1 device.Value16 = dmon.Value?.ToString().Split('.')[0]; device.Name16 = dmon.Name; break; case 224870694618813617: //主加热器1 喷漆房1 device.Value17 = dmon.Value?.ToString().Split('.')[0]; device.Name17 = "主加热器"; break; case 224870729933804772: //辅助加热器1 喷漆房1 device.Value18 = dmon.Value?.ToString().Split('.')[0]; device.Name18 = "辅助加热器"; break; case 224870650814550567: //主风机1 喷漆房1 device.Value19 = dmon.Value?.ToString(); device.Name19 = dmon.Name; break; //case 224872612786230640: //自动油雾过滤器电子差压计D0实际值 喷漆房2 // device.Value12 = dmon.Value?.ToString().Split('.')[0]; // device.Name12 = dmon.Name; // break; //case 224872713744176788: //前处理过滤箱电子差压计D2实际值 喷漆房2 // device.Value13 = dmon.Value?.ToString().Split('.')[0]; // device.Name13 = dmon.Name; // break; //case 224872753250326203://前处理过滤箱电子差压计D3实际值 喷漆房2 // device.Value14 = dmon.Value?.ToString().Split('.')[0]; // device.Name14 = dmon.Name; // break; //case 224873107568351846: //前处理过滤箱电子差压计D2实际值 喷漆房3 // device.Value15 = dmon.Value?.ToString().Split('.')[0]; // device.Name15 = dmon.Name; // break; //case 224873198976916185: //前处理过滤箱电子差压计D3实际值 喷漆房3 // device.Value16 = dmon.Value?.ToString().Split('.')[0]; // device.Name16 = dmon.Name; // break; //case 224873045402475044://自动油雾过滤器电子差压计D1实际值 喷漆房3 // device.Value17 = dmon.Value?.ToString().Split('.')[0]; // device.Name17 = dmon.Name; // break; default: break; } } if (dmon.BoxNo.Equals("300220010352")) //喷漆房2 { switch (dmon.Uid) { #region 喷漆房2 case 224872612786230640: //自动油雾过滤器电子差压计D0实际值 喷漆房2 device.ValueB = dmon.Value?.ToString().Split('.')[0]; device.NameB = "自动油雾过滤器电子差压计D0实值"; break; case 224872713744176788: //前处理过滤箱电子差压计D2实际值 喷漆房2 device.ValueB10 = dmon.Value?.ToString().Split('.')[0]; device.NameB10 = dmon.Name; break; case 224872753250326203: //前处理过滤箱电子差压计D3实际值 喷漆房2 device.ValueB11 = dmon.Value?.ToString().Split('.')[0]; device.NameB11 = "前处理过滤箱电子差压计D3实际值"; break; case 224872793931929321: //蜂窝沸石转筒电子差压计D4实际值 喷漆房2 device.ValueB12 = dmon.Value?.ToString().Split('.')[0]; device.NameB12 = dmon.Name; break; case 224258613904301846: //\"数据块_1\".运行时间记录_D 喷漆房2 device.ValueB13 = dmon.Value?.ToString().Split('.')[0]; device.NameB13 = "运行时间"; break; case 224258495862952967: //\"数据块_1\".运行时间记录_H 喷漆房2 device.ValueB14 = dmon.Value?.ToString().Split('.')[0]; device.NameB14 = "运行时间"; break; case 224258680408133884: //\"数据块_1\".运行时间记录_M 喷漆房2 device.ValueB15 = dmon.Value?.ToString().Split('.')[0]; device.NameB15 = "运行时间"; break; case 224257908353160069: //报警2 喷漆房2 device.ValueB16 = dmon.Value?.ToString().Split('.')[0]; device.NameB16 = dmon.Name; break; case 224257839222641425: //主加热器2 喷漆房2 device.ValueB17 = dmon.Value?.ToString().Split('.')[0]; device.NameB17 = "主加热器"; break; case 224257877813384018: //辅助加热器2 喷漆房2 device.ValueB18 = dmon.Value?.ToString().Split('.')[0]; device.NameB18 = "辅助加热器"; break; case 224257666812632474: //主风机2 喷漆房2 device.ValueB19 = dmon.Value?.ToString(); device.NameB19 = dmon.Name; break; #endregion default: break; } } if (dmon.BoxNo.Equals("300220010352")) //喷漆房3 { switch (dmon.Uid) { #region 喷漆房3 case 224872971032222163: //自动油雾过滤器电子差压计D0实际值 喷漆房3 device.ValueC = dmon.Value?.ToString().Split('.')[0]; device.NameC = "自动油雾过滤器电子差压计D0实值"; break; case 224873045402475044: //前处理过滤箱电子差压计D2实际值 喷漆房3 device.ValueC10 = dmon.Value?.ToString().Split('.')[0]; device.NameC10 = "自动油雾过滤器电子差压计D1实值"; break; case 224873198976916185: //前处理过滤箱电子差压计D3实际值 喷漆房3 device.ValueC11 = dmon.Value?.ToString().Split('.')[0]; device.NameC11 = dmon.Name; break; case 224873254060711069: //蜂窝沸石转筒电子差压计D4实际值 喷漆房3 device.ValueC12 = dmon.Value?.ToString().Split('.')[0]; device.NameC12 = dmon.Name; break; case 224274954993426315: //\"数据块_1\".运行时间记录_D 喷漆房3 device.ValueC13 = dmon.Value?.ToString().Split('.')[0]; device.NameC13 = "运行时间"; break; case 224274989968678850: //\"数据块_1\".运行时间记录_H 喷漆房3 device.ValueC14 = dmon.Value?.ToString().Split('.')[0]; device.NameC14 = "运行时间"; break; case 224274745723870963: //\"数据块_1\".运行时间记录_M 喷漆房3 device.ValueC15 = dmon.Value?.ToString().Split('.')[0]; device.NameC15 = "运行时间"; break; case 224258807236547733: //报警3 喷漆房3 device.ValueC16 = dmon.Value?.ToString().Split('.')[0]; device.NameC16 = dmon.Name; break; case 224258724932768342: //主加热器3 喷漆房3 device.ValueC17 = dmon.Value?.ToString().Split('.')[0]; device.NameC17 = "主加热器"; break; case 224258769723740974: //辅助加热器3 喷漆房3 device.ValueC18 = dmon.Value?.ToString().Split('.')[0]; device.NameC18 = "辅助加热器"; break; case 224257779157061674: //主风机3 喷漆房3 device.ValueC19 = dmon.Value?.ToString(); device.NameC19 = dmon.Name; break; #endregion default: break; } } if (dmon.BoxNo.Equals("300220010352")) //喷漆房4 { switch (dmon.Uid) { #region 喷漆房4 case 224873538997605040: //自动油雾过滤器电子差压计D0实际值 喷漆房4 device.ValueD = dmon.Value?.ToString().Split('.')[0]; device.NameD = "自动油雾过滤器电子差压计D0实值"; break; case 224873575130485457: //前处理过滤箱电子差压计D2实际值 喷漆房4 device.ValueD10 = dmon.Value?.ToString().Split('.')[0]; device.NameD10 = dmon.Name; break; case 224873679711261516: //前处理过滤箱电子差压计D3实际值 喷漆房4 device.ValueD11 = dmon.Value?.ToString().Split('.')[0]; device.NameD11 = dmon.Name; break; case 224873715894473966: //蜂窝沸石转筒电子差压计D4实际值 喷漆房4 device.ValueD12 = dmon.Value?.ToString().Split('.')[0]; device.NameD12 = dmon.Name; break; case 224275677238940201: //\"数据块_1\".运行时间记录_D 喷漆房4 device.ValueD13 = dmon.Value?.ToString().Split('.')[0]; device.NameD13 = "运行时间"; break; case 224275487304077613: //\"数据块_1\".运行时间记录_H 喷漆房4 device.ValueD14 = dmon.Value?.ToString().Split('.')[0]; device.NameD14 = "运行时间"; break; case 224275633134785002: //\"数据块_1\".运行时间记录_M 喷漆房4 device.ValueD15 = dmon.Value?.ToString().Split('.')[0]; device.NameD15 = "运行时间"; break; case 224275157925384276: //报警4 喷漆房4 device.ValueD16 = dmon.Value?.ToString().Split('.')[0]; device.NameD16 = dmon.Name; break; case 224274232172240099: //主加热器4 喷漆房4 device.ValueD17 = dmon.Value?.ToString().Split('.')[0]; device.NameD17 = "主加热器"; break; case 224274264027979000: //辅助加热器4 喷漆房4 device.ValueD18 = dmon.Value?.ToString().Split('.')[0]; device.NameD18 = "辅助加热器"; break; case 224257795187691889: //主风机4 喷漆房4 device.ValueD19 = dmon.Value?.ToString(); device.NameD19 = dmon.Name; break; #endregion default: break; } } if (dmon.BoxNo.Equals("300221100748")) //大厂 { switch (dmon.Uid) { #region 大厂 case 254066938408343960: //非甲烷总烃 device.ValueE = dmon.Value?.ToString().Split('.')[0]; device.NameE = dmon.Name; break; case 254066938411489690: //废气温度 device.ValueE10 = dmon.Value?.ToString().Split('.')[0]; device.NameE10 = dmon.Name; break; case 254066938413586843: //废气压力 device.ValueE11 = dmon.Value?.ToString().Split('.')[0]; device.NameE11 = dmon.Name; break; case 254066938414635420: //废气流速 device.ValueE12 = dmon.Value?.ToString().Split('.')[0]; device.NameE12 = dmon.Name; break; case 254066938416732573: //废气湿度 device.ValueE13 = dmon.Value?.ToString().Split('.')[0]; device.NameE13 = dmon.Name; break; case 254066938417781150: //废气标态流量 device.ValueE14 = dmon.Value?.ToString().Split('.')[0]; device.NameE14 = dmon.Name; break; case 254066938418829727: //甲烷 device.ValueE15 = dmon.Value?.ToString().Split('.')[0]; device.NameE15 = dmon.Name; break; case 254066938420926880: //总烃 device.ValueE16 = dmon.Value?.ToString().Split('.')[0]; device.NameE16 = dmon.Name; break; case 254066938421975457: //苯 device.ValueE17 = dmon.Value?.ToString().Split('.')[0]; device.NameE17 = dmon.Name; break; case 254066938424072610: //甲苯 device.ValueE18 = dmon.Value?.ToString().Split('.')[0]; device.NameE18 = dmon.Name; break; case 254066938426169763: //二甲苯 device.ValueE19 = dmon.Value?.ToString(); device.NameE19 = dmon.Name; break; #endregion default: break; } } else if(dmon.BoxNo.Equals("300220010335"))//anhui { switch (dmon.Uid) { case 225981570888392599: //调节阀1开度 device.Value20 = dmon.Value?.ToString().Split('.')[0]; device.Name20 = dmon.Name; break; case 225887304201690740: //实际开度1 默认组 device.Value21 = dmon.Value?.ToString().Split('.')[0]; device.Name21 = dmon.Name; break; case 225887469583093963: //实际开度2 默认组 device.Value22 = dmon.Value?.ToString().Split('.')[0]; device.Name22 = dmon.Name; break; case 225981611964260302: //调节阀2开度 默认组 device.Value23 = dmon.Value?.ToString().Split('.')[0]; device.Name23 = dmon.Name; break; case 225887536297694857: //实际开度3 默认组 device.Value24 = dmon.Value?.ToString().Split('.')[0]; device.Name24 = dmon.Name; break; case 225981652471795782: //调节阀3开度 默认组 device.Value25 = dmon.Value?.ToString().Split('.')[0]; device.Name25 = dmon.Name; break; case 225975315764502499: //前轴振动实际值 默认组 device.Value26 = dmon.Value?.ToString().Split('.')[0]; device.Name26 = dmon.Name; break; case 225975390380118077: //后轴振动实际值 默认组 device.Value27 = dmon.Value?.ToString().Split('.')[0]; device.Name27 = dmon.Name; break; case 225975436688380055: //空气压力实际值 默认组 device.Value28 = dmon.Value?.ToString().Split('.')[0]; device.Name28 = dmon.Name; break; case 225982560290101472: //1 - 5仓压差实际值 默认组 device.Value29 = dmon.Value?.ToString().Split('.')[0]; device.Name29 = dmon.Name; break; default: break; } } //Clients.All.SendAsync("UpdateDeviceData", new MsgInfo { MsgContent = dmon.Value.ToString(), Title = dmon.Name } ); //Clients.All.SendAsync("UpdateData", new MsgInfo { Title = dmon.Value.ToString(), MsgContent = dmon.Name }); //Clients.All.SendAsync("ShowMsg", new MsgInfo { Title = "DeviceTitle", MsgContent = deviceValue }); //logger.Info("时间" + currentTime + "Uid" + dmon.Uid + "名称:" + dmon.Name + "值:" + dmon.Value + "状态:" + dmon.Status + "盒子号:" + dmon.BoxNo + "分组名称:" + dmon.GroupName + "时间" + dmon.Timestamp); } Clients.All.SendAsync("UpdateDeviceData", device); //接收数据,先存数据,再把数据显示到页面上 } } public class DeviceValueModel { public string Name { get; set; } public string Value { get; set; } public string Name10 { get; set; } public string Value10 { get; set; } public string Name11 { get; set; } public string Value11 { get; set; } public string Name12 { get; set; } public string Value12 { get; set; } public string Name13 { get; set; } public string Value13 { get; set; } public string Name14 { get; set; } public string Value14 { get; set; } public string Name15 { get; set; } public string Value15 { get; set; } public string Name16 { get; set; } public string Value16 { get; set; } public string Name17 { get; set; } public string Value17 { get; set; } public string Name18 { get; set; } public string Value18 { get; set; } public string Name19 { get; set; } public string Value19 { get; set; } #region 2 public string NameB { get; set; } public string ValueB { get; set; } public string NameB10 { get; set; } public string ValueB10 { get; set; } public string NameB11 { get; set; } public string ValueB11 { get; set; } public string NameB12 { get; set; } public string ValueB12 { get; set; } public string NameB13 { get; set; } public string ValueB13 { get; set; } public string NameB14 { get; set; } public string ValueB14 { get; set; } public string NameB15 { get; set; } public string ValueB15 { get; set; } public string NameB16 { get; set; } public string ValueB16 { get; set; } public string NameB17 { get; set; } public string ValueB17 { get; set; } public string NameB18 { get; set; } public string ValueB18 { get; set; } public string NameB19 { get; set; } public string ValueB19 { get; set; } #endregion #region 2 public string NameC { get; set; } public string ValueC { get; set; } public string NameC10 { get; set; } public string ValueC10 { get; set; } public string NameC11 { get; set; } public string ValueC11 { get; set; } public string NameC12 { get; set; } public string ValueC12 { get; set; } public string NameC13 { get; set; } public string ValueC13 { get; set; } public string NameC14 { get; set; } public string ValueC14 { get; set; } public string NameC15 { get; set; } public string ValueC15 { get; set; } public string NameC16 { get; set; } public string ValueC16 { get; set; } public string NameC17 { get; set; } public string ValueC17 { get; set; } public string NameC18 { get; set; } public string ValueC18 { get; set; } public string NameC19 { get; set; } public string ValueC19 { get; set; } #endregion #region 3 public string NameD { get; set; } public string ValueD { get; set; } public string NameD10 { get; set; } public string ValueD10 { get; set; } public string NameD11 { get; set; } public string ValueD11 { get; set; } public string NameD12 { get; set; } public string ValueD12 { get; set; } public string NameD13 { get; set; } public string ValueD13 { get; set; } public string NameD14 { get; set; } public string ValueD14 { get; set; } public string NameD15 { get; set; } public string ValueD15 { get; set; } public string NameD16 { get; set; } public string ValueD16 { get; set; } public string NameD17 { get; set; } public string ValueD17 { get; set; } public string NameD18 { get; set; } public string ValueD18 { get; set; } public string NameD19 { get; set; } public string ValueD19 { get; set; } #endregion public bool Alarm { get; set; } #region PaintRoom5 public string NameE { get; set; } public string ValueE { get; set; } public string NameE10 { get; set; } public string ValueE10 { get; set; } public string NameE11 { get; set; } public string ValueE11 { get; set; } public string NameE12 { get; set; } public string ValueE12 { get; set; } public string NameE13 { get; set; } public string ValueE13 { get; set; } public string NameE14 { get; set; } public string ValueE14 { get; set; } public string NameE15 { get; set; } public string ValueE15 { get; set; } public string NameE16 { get; set; } public string ValueE16 { get; set; } public string NameE17 { get; set; } public string ValueE17 { get; set; } public string NameE18 { get; set; } public string ValueE18 { get; set; } public string NameE19 { get; set; } public string ValueE19 { get; set; } #endregion //另外一个盒子 public string Name20 { get; set; } public string Value20 { get; set; } public string Name21 { get; set; } public string Value21 { get; set; } public string Name22 { get; set; } public string Value22 { get; set; } public string Name23 { get; set; } public string Value23 { get; set; } public string Name24 { get; set; } public string Value24 { get; set; } public string Name25 { get; set; } public string Value25 { get; set; } public string Name26 { get; set; } public string Value26 { get; set; } public string Name27 { get; set; } public string Value27 { get; set; } public string Name28 { get; set; } public string Value28 { get; set; } public string Name29 { get; set; } public string Value29 { get; set; } } public class DataStatus { public string Status1 { get; set; } public string Status2 { get; set; } } public class MsgInfo { public string Title { get; set; } public string MsgContent { get; set; } } }