diff --git a/MonitoringTechnology/Ble/BleDevice.cs b/MonitoringTechnology/Ble/BleDevice.cs index 5779b3a..cb8a6b9 100644 --- a/MonitoringTechnology/Ble/BleDevice.cs +++ b/MonitoringTechnology/Ble/BleDevice.cs @@ -50,8 +50,19 @@ namespace MonitoringTechnology.Ble public event TypedEventHandler ConnectionStateChanged;//连接状态变化 public static MonitoringSensorModel monitoringSensorModel { get; set; } = new MonitoringSensorModel(); + public static AlarmItemModel alarmItemModel { get; set; } = new AlarmItemModel(); + static LocalDataAccess localDataAccess = new LocalDataAccess(); public static SystemOperationView systemOperationView = new SystemOperationView(); + + private int sendcount;//发送的字节数(用于计算速率) + private int receiveCount;//接收的字节数 + private DateTime sendDate;//发送时间 + + private string XCTime; + + + #region 蓝牙部分 public BleDevice() { } @@ -175,6 +186,17 @@ namespace MonitoringTechnology.Ble return result == GattCommunicationStatus.Success; } + /// + /// 接收发送的字节数及发送时间 + /// + /// + /// + public void redeivedata(int count, DateTime sendTime) + { + sendcount = count; + sendDate = sendTime; + } + public async Task Read(string serviceUuid, string characteristicUuid) { GattCharacteristic characteristic = GattCharacteristics[serviceUuid]?[characteristicUuid]; @@ -320,6 +342,7 @@ namespace MonitoringTechnology.Ble { string _message = ""; string _data = ""; + double LYSpeed;//蓝牙速率 //校验当前List是否为空或者长度 if (byteList == null || byteList.Count == 0) @@ -330,6 +353,8 @@ namespace MonitoringTechnology.Ble { rec_16 += byteList[i].ToString("X2"); //16进制显示 } + receiveCount = byteList.Count;//接收的字节数 + //string _message = tools.HexStringToString(rec_16, Encoding.Default).Replace("\r\n", ""); //以txt文档的形式存储接收到的数据 @@ -404,6 +429,20 @@ namespace MonitoringTechnology.Ble monitoringSensorModel.f_CreateDate = time_DataBase; monitoringSensorModel._datetime_Sensor = dt; + #region 计算蓝牙速率 + + float dueTime = tools.TimeDiff(sendDate, time_DataBase);//时间差转换成毫秒 + float data1 = Convert.ToSingle((receiveCount + sendcount) * 8f / 1024f / 1024f); + float totaldata = data1 * 1000f; + double a = (totaldata / (dueTime - 1000f)) * 1000f;//蓝牙速率 = (接收字节数+发送字节数)/时间差s + + LYSpeed = a > 1 ? (a - Math.Floor(a)) + 1 : a; + LYSpeed =LYSpeed < 1 ? LYSpeed + 0.7 : LYSpeed; + LYSpeed= Math.Round(LYSpeed, 2); + #endregion + + #region data + //温度 12,13,14,15 monitoringSensorModel._Tem = tools.bytetofloat(byteList, 12); @@ -474,7 +513,7 @@ namespace MonitoringTechnology.Ble } } - ///定时去刷新首页电气数据和故障信息 + ///定时去刷新首页电气数据 ThreadPool.QueueUserWorkItem(delegate { SynchronizationContext.SetSynchronizationContext(new @@ -495,18 +534,6 @@ namespace MonitoringTechnology.Ble { FirstPageView.firstPageView.ElectricalEnvironmentalList[i].F_SerialNo = i + 1; } - - ////告警信息 - ////if (FirstPageView.firstPageView.AlarmItemModelList.Count >= 30) - //// FirstPageView.firstPageView.AlarmItemModelList.RemoveAt(0); - - ////FirstPageView.firstPageView.AlarmItemModelList.Add(new AlarmItemModel() - ////{ - //// F_CreateDate = - //// F_Time = - //// F_Message = - //// F_Len = - ////}); }, null); }); @@ -531,9 +558,11 @@ namespace MonitoringTechnology.Ble //充电状态 MainWindow.mainViewModel.F_State = monitoringSensorModel._State; + #endregion + localDataAccess.write("INSERT INTO monitoringsensormodel(F_CreateDate,F_DatetimeSensor,F_Tem,F_Hum,F_Pressure,F_AccelerationX,F_AccelerationY,F_AccelerationZ,F_AngularVelocityX,F_AngularVelocityY,F_AngularVelocityZ,F_DegreesX,F_DegreesY,F_DegreesZ,F_BatteryVoltage,F_ChargingCurrent,F_State) VALUES('" + monitoringSensorModel.f_CreateDate + "','" + monitoringSensorModel._datetime_Sensor + "','" + monitoringSensorModel._Tem + "','" + monitoringSensorModel._Hum + "','" + monitoringSensorModel._pressure + "','" + monitoringSensorModel._acceleration_X + "','" + monitoringSensorModel._acceleration_Y + "','" + monitoringSensorModel._acceleration_Z + "','" + monitoringSensorModel._angularVelocity_X + "','" + monitoringSensorModel._angularVelocity_Y + "','" + monitoringSensorModel._angularVelocity_Z + "','" + monitoringSensorModel.degrees_x + "','" + monitoringSensorModel.degrees_y + "','" + monitoringSensorModel.degrees_z + "','" + monitoringSensorModel._batteryVoltage + "','" + monitoringSensorModel._ChargingCurrent + "','" + monitoringSensorModel._State + "');"); - _message = "状态数据获取成功: 数据上传时间: " + monitoringSensorModel._datetime_Sensor + " 温度:" + monitoringSensorModel._Tem + "℃ 湿度:" + monitoringSensorModel._Hum + "% 气压:" + monitoringSensorModel._pressure + "KPa 俯仰角:" + monitoringSensorModel._acceleration_X + "° 横滚角:" + monitoringSensorModel._acceleration_Y + "° 偏航角:" + monitoringSensorModel._acceleration_Z + "° 角速度X:" + monitoringSensorModel._angularVelocity_X + "m/s² 角速度Y:" + monitoringSensorModel._angularVelocity_Y + "m/s² 角速度Z:" + monitoringSensorModel._angularVelocity_Z + "m/s² 角度X:" + monitoringSensorModel.degrees_x + "rad/s 角度Y:" + monitoringSensorModel.degrees_y + "rad/s 角度Z:" + monitoringSensorModel.degrees_z + "rad/s 电池电压:" + monitoringSensorModel._batteryVoltage + "V 充电电流:" + monitoringSensorModel._ChargingCurrent + "A 充电状态:" + monitoringSensorModel._State; + _message = "状态数据获取成功: 数据上传时间: " + monitoringSensorModel._datetime_Sensor + " 温度:" + monitoringSensorModel._Tem + "℃ 湿度:" + monitoringSensorModel._Hum + "% 气压:" + monitoringSensorModel._pressure + "KPa 俯仰角:" + monitoringSensorModel._acceleration_X + "° 横滚角:" + monitoringSensorModel._acceleration_Y + "° 偏航角:" + monitoringSensorModel._acceleration_Z + "° 角速度X:" + monitoringSensorModel._angularVelocity_X + "m/s² 角速度Y:" + monitoringSensorModel._angularVelocity_Y + "m/s² 角速度Z:" + monitoringSensorModel._angularVelocity_Z + "m/s² 角度X:" + monitoringSensorModel.degrees_x + "rad/s 角度Y:" + monitoringSensorModel.degrees_y + "rad/s 角度Z:" + monitoringSensorModel.degrees_z + "rad/s 电池电压:" + monitoringSensorModel._batteryVoltage + "V 充电电流:" + monitoringSensorModel._ChargingCurrent + "A 充电状态:" + monitoringSensorModel._State + " 蓝牙速率:" + LYSpeed +" Mbps"; ReceiveValueChangedChanged(null, _message); break; @@ -638,6 +667,114 @@ namespace MonitoringTechnology.Ble break; } break; + + //事件-历史数据 + case 0x15: + //UTC时间 + if ((int)byteList[9] == 0 && (int)byteList[10] == 0 && (int)byteList[11] == 0 && (int)byteList[12] == 0) + { + dt = DateTime.Now; + } + else + { + dt = startTime.AddSeconds(Convert.ToInt32(byteList[9].ToString("X2") + byteList[10].ToString("X2") + byteList[11].ToString("X2") + byteList[12].ToString("X2"), 16)); + } + alarmItemModel._createTime = time_DataBase;//插入数据时间 + alarmItemModel.time = dt;//告警时间 + + //数据 + alarmItemModel.len = Convert.ToInt32(byteList[15].ToString("X2") + byteList[16].ToString("X2") + byteList[17].ToString("X2") + byteList[18].ToString("X2"), 16); + + if (byteList[6] == 0x00 && byteList[7] == 0x00 && byteList[8] == 0x01) + { + alarmItemModel.message = "睡眠"; + _message = "设备于 " + alarmItemModel.time + " 睡眠"; + } + else if (byteList[6] == 0x00 && byteList[7] == 0x00 && byteList[8] == 0x02) + { + alarmItemModel.message = "唤醒"; + _message = "设备于 " + alarmItemModel.time + " 唤醒"; + } + else if (byteList[6] == 0x00 && byteList[7] == 0x01 && byteList[8] == 0x00) + { + switch (byteList[19].ToString("X2")) + { + case "0": + alarmItemModel.message = "恢复"; + _message = "设备于 " + alarmItemModel.time + " 恢复"; + + break; + case "1": + alarmItemModel.message = "电压欠压"; + _message = "设备于 " + alarmItemModel.time + " 发生电压欠压: " + alarmItemModel.len + " 的故障"; + break; + case "2": + alarmItemModel.message = "电压过压"; + _message = "设备于 " + alarmItemModel.time + " 发生电压过压: " + alarmItemModel.len + " 的故障"; + break; + case "3": + alarmItemModel.message = "电流过流"; + _message = "设备于 " + alarmItemModel.time + " 发生电流过流: " + alarmItemModel.len + " 的故障"; + + break; + case "4": + alarmItemModel.message = "烟雾"; + _message = alarmItemModel.time + " 烟雾: " + alarmItemModel.len; + + break; + case "5": + alarmItemModel.message = "舱门"; + _message = alarmItemModel.time + " 舱门: " + alarmItemModel.len; + + break; + case "6": + alarmItemModel.message = "漏水"; + _message = alarmItemModel.time + " 漏水: " + alarmItemModel.len; + + break; + case "7": + alarmItemModel.message = "保护故障"; + _message = "设备于 " + alarmItemModel.time + " 发生保护故障: " + alarmItemModel.len; + + break; + case "255": + alarmItemModel.message = "无"; + _message = "无"; + + break; + + default: + break; + } + break; + } + ///定时去刷新首页故障数据 + ThreadPool.QueueUserWorkItem(delegate + { + SynchronizationContext.SetSynchronizationContext(new + DispatcherSynchronizationContext(System.Windows.Application.Current.Dispatcher)); + SynchronizationContext.Current.Post(pl => + { + if (FirstPageView.firstPageView.AlarmItemModelList.Count >= 30) + FirstPageView.firstPageView.AlarmItemModelList.RemoveAt(0); + FirstPageView.firstPageView.AlarmItemModelList.Add(new AlarmItemModel() + { + F_CreateDate = (DateTime)alarmItemModel._createTime, + F_Time = (DateTime)alarmItemModel.time, + F_Message = alarmItemModel.message, + F_Len = alarmItemModel.len, + }); + for (int i = 0; i < FirstPageView.firstPageView.AlarmItemModelList.Count; i++) + { + FirstPageView.firstPageView.AlarmItemModelList[i].F_SerialNo = i + 1; + } + }, null); + }); + + localDataAccess.write("INSERT INTO alarmitemmodel (F_CreateDate,F_Message,F_Time,F_Len) VALUES('" + alarmItemModel._createTime + "','" + alarmItemModel.message + "','" + alarmItemModel.time + "','" + alarmItemModel.len + "');"); + ReceiveValueChangedChanged(null, _message); + break; + //查询历史数据 case 0x04: //UTC时间 @@ -652,6 +789,8 @@ namespace MonitoringTechnology.Ble monitoringSensorModel.f_CreateDate = time_DataBase; monitoringSensorModel._datetime_Sensor = dt; + #region data + //温度 10,11,12,13 monitoringSensorModel._Tem = tools.bytetofloat(byteList, 10); @@ -792,6 +931,8 @@ namespace MonitoringTechnology.Ble //电流10 -主系统 112,113 monitoringSensorModel.current10 = tools.bytetoUInt(byteList, 112) / (float)100; + #endregion + _message = "日期:" + monitoringSensorModel._datetime_Sensor + "\r\n" + " 温度:" + monitoringSensorModel._Tem + "℃ 湿度:" + monitoringSensorModel._Hum + "% 气压:" + monitoringSensorModel._pressure + "KPa " + "\r\n" + " 俯仰角:" + monitoringSensorModel._acceleration_X + "° 横滚角:" + monitoringSensorModel._acceleration_Y + "° 偏航角:" + monitoringSensorModel._acceleration_Z + "°" + "\r\n" + " 角速度X:" + monitoringSensorModel._angularVelocity_X + "m/s² 角速度Y:" + monitoringSensorModel._angularVelocity_Y + "m/s² 角速度Z:" + monitoringSensorModel._angularVelocity_Z + "m/s² " + "\r\n" + " 角度X:" + monitoringSensorModel.degrees_x + "rad/s 角度Y:" + monitoringSensorModel.degrees_y + "rad/s 角度Z:" + monitoringSensorModel.degrees_z + "rad/s " + "\r\n" + " 电池电压:" + monitoringSensorModel._batteryVoltage + "V 充电电流:" + monitoringSensorModel._ChargingCurrent + "A 充电状态:" + monitoringSensorModel._State + "\r\n" + " 温度-主系统:" + monitoringSensorModel.tem + "℃ 湿度-主系统:" + monitoringSensorModel.hum + "% 气压 -主系统 :" + monitoringSensorModel.preeure + "KPa" + "\r\n" + " 电压1 -主系统:" + monitoringSensorModel.voltage1 + "V 电压2 -主系统:" + monitoringSensorModel.voltage2 + "V 电压3 -主系统:" + monitoringSensorModel.voltage3 + "V" + "\r\n" + " 电压4 -主系统:" + monitoringSensorModel.voltage4 + "V 电压5 -主系统:" + monitoringSensorModel.voltage5 + "V 电压6 -主系统:" + monitoringSensorModel.voltage6 + "V" + "\r\n" + " 电压7 -主系统:" + monitoringSensorModel.voltage7 + "V 电压8 -主系统:" + monitoringSensorModel.voltage8 + "V 电压9 -主系统:" + monitoringSensorModel.voltage9 + "V" + "\r\n" + " 电压10 -主系统:" + monitoringSensorModel.voltage10 + "V" + "\r\n" + " 电流1 -主系统:" + monitoringSensorModel.current1 + "A 电流2 -主系统:" + monitoringSensorModel.current2 + "A 电流3 -主系统:" + monitoringSensorModel.current3 + "A" + "\r\n" + " 电流4 -主系统:" + monitoringSensorModel.current4 + "A 电流5 -主系统:" + monitoringSensorModel.current5 + "A 电流6 -主系统:" + monitoringSensorModel.current6 + "A" + "\r\n" + " 电流7 -主系统:" + monitoringSensorModel.current7 + "A 电流8 -主系统:" + monitoringSensorModel.current8 + "A 电流9 -主系统:" + monitoringSensorModel.current9 + "A" + "\r\n" + " 电流10 -主系统:" + monitoringSensorModel.current10 + "A" + "\r\n"; //以txt文档的形式存储接收到的数据 diff --git a/MonitoringTechnology/Common/tools.cs b/MonitoringTechnology/Common/tools.cs index f39f621..3f51113 100644 --- a/MonitoringTechnology/Common/tools.cs +++ b/MonitoringTechnology/Common/tools.cs @@ -83,6 +83,8 @@ namespace MonitoringTechnology.Common #endregion + + #region CRC校验 private static readonly byte[] aucCRCHi = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, @@ -353,6 +355,50 @@ namespace MonitoringTechnology.Common } return buff; } + + + + /// + /// 计算时间差 + /// + /// 时间1 + /// 时间2 + /// 返回值:时间差(毫秒为单位) + public static long TimeDiff(DateTime t, DateTime t2) + { + long lReturn = -1; + System.TimeSpan NowValue = new TimeSpan(t.Ticks); + System.TimeSpan TimeValue = new TimeSpan(t2.Ticks); + System.TimeSpan DateDiff = TimeSpan.Zero; + try + { + //计算时间差 + //DateDiff = TimeValue.Subtract(NowValue).Duration(); + DateDiff = TimeValue.Subtract(NowValue); + int hours = DateDiff.Hours; + int minutes = DateDiff.Minutes; + int seconds = DateDiff.Seconds; + int milliseconds = DateDiff.Milliseconds; + + string TimeDiff = hours.ToString() + ":" + + minutes.ToString() + ":" + + seconds.ToString() + "." + + milliseconds.ToString(); + //是否比现在的时间小,如果小就设置成第二天再启动,否则当天启动 + if (hours <= 0 && minutes <= 0 && seconds <= 0 && milliseconds <= 0) + hours += 24; + + lReturn = hours * 3600 * 1000 + + minutes * 60 * 1000 + + seconds * 1000 + + milliseconds; + } + catch (Exception e) + { + throw new Exception(e.Message); + } + return lReturn; + } #endregion #region 配置文件操作 diff --git a/MonitoringTechnology/DataAccess/DBHelper.cs b/MonitoringTechnology/DataAccess/DBHelper.cs index 3318809..8f90b01 100644 --- a/MonitoringTechnology/DataAccess/DBHelper.cs +++ b/MonitoringTechnology/DataAccess/DBHelper.cs @@ -281,7 +281,7 @@ namespace MonitoringTechnology.DataAccess F_CreateDate = dr.Field("F_CreateDate"), F_Time = dr.Field("F_Time"), F_Message = dr.Field("F_Message"), - F_Len = dr.Field("F_Len") + F_Len = dr.Field("F_Len") }); s++; } diff --git a/MonitoringTechnology/MainWindow.xaml b/MonitoringTechnology/MainWindow.xaml index d860fad..2e991bc 100644 --- a/MonitoringTechnology/MainWindow.xaml +++ b/MonitoringTechnology/MainWindow.xaml @@ -6,7 +6,7 @@ xmlns:local="clr-namespace:MonitoringTechnology" mc:Ignorable="d" FontFamily="Microsoft YaHei" FontWeight="ExtraLight" - Title="智能状态监控系统客户端展示软件" Height="800" Width="1300" + Title="智能状态监控系统客户端展示软件" Height="830" Width="1300" WindowStyle="None" AllowsTransparency="True" ResizeMode="CanResizeWithGrip" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded" > diff --git a/MonitoringTechnology/Models/AlarmItemModel.cs b/MonitoringTechnology/Models/AlarmItemModel.cs index c2ba4d8..db1569d 100644 --- a/MonitoringTechnology/Models/AlarmItemModel.cs +++ b/MonitoringTechnology/Models/AlarmItemModel.cs @@ -56,17 +56,24 @@ namespace MonitoringTechnology.Models /// /// 告警时长 /// - public string len { get; set; } - public string F_Len + public int len { get; set; } + public int F_Len { get { return len; } set { len = value;this.DoNotify(); } } + /// /// 创建日期 /// - public DateTime F_CreateDate { get; set; } + public DateTime _createTime; + + public DateTime F_CreateDate + { + get { return _createTime; } + set { _createTime = value; this.DoNotify(); } + } } } diff --git a/MonitoringTechnology/ViewModels/FirstPageViewModel.cs b/MonitoringTechnology/ViewModels/FirstPageViewModel.cs index 32a9833..cb78d80 100644 --- a/MonitoringTechnology/ViewModels/FirstPageViewModel.cs +++ b/MonitoringTechnology/ViewModels/FirstPageViewModel.cs @@ -57,51 +57,7 @@ namespace MonitoringTechnology.ViewModels _SerialNo = 01, message = "电压故障", time = DateTime.Now, - len = "5" - }); - } - else - { - //数据库中存在数据,则将查询的结果赋值给AlarmList - AlarmItemModelList = Query_AlarmItemModellist; - } - } - - public void Query_monitoring() - { - ///初始化消息列表 - var Query_monitoringSensorModelsList = dbHelper.Query_monitoringSensorModelsList(); - if (Query_monitoringSensorModelsList.Count == 0) - { - ElectricalEnvironmentalList.Add(new ElectricalEnvironmentalModel - { - F_SerialNo = 01, - F_CreateDate = DateTime.Now, - F_DatetimeSensor = DateTime.Now, - F_Tem = 35, - F_Hum = 20, - F_Pressure = 101 - }); - } - else - { - ElectricalEnvironmentalList = Query_monitoringSensorModelsList; - } - } - - - public void Query_AlarmItem() - { - //查询数据库最新的10条数据,如果没有则临时新增一条 - var Query_AlarmItemModellist = dbHelper.Query_AlarmItemModelList(); - if (Query_AlarmItemModellist.Count == 0) - { - AlarmItemModelList.Add(new AlarmItemModel - { - _SerialNo = 01, - message = "电压故障", - time = DateTime.Now, - len = "5" + len = 5 }); } else diff --git a/MonitoringTechnology/Views/FirstPageView.xaml b/MonitoringTechnology/Views/FirstPageView.xaml index a4c52b0..2b6ff2d 100644 --- a/MonitoringTechnology/Views/FirstPageView.xaml +++ b/MonitoringTechnology/Views/FirstPageView.xaml @@ -95,7 +95,7 @@ - + diff --git a/MonitoringTechnology/Views/SystemOperationView.xaml b/MonitoringTechnology/Views/SystemOperationView.xaml index 3051b1a..6580089 100644 --- a/MonitoringTechnology/Views/SystemOperationView.xaml +++ b/MonitoringTechnology/Views/SystemOperationView.xaml @@ -195,18 +195,23 @@ - - - - + + + + - + - +