20211124_ZNZT_upperpc/MonitoringTechnology/Ble/BleDevice.cs
2023-07-11 09:48:05 +08:00

1035 lines
50 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using MonitoringTechnology.Common;
using MonitoringTechnology.DataAccess;
using MonitoringTechnology.Models;
using MonitoringTechnology.ViewModels;
using MonitoringTechnology.Views;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Markup;
using System.Windows.Threading;
using Windows.Devices.Bluetooth;
using Windows.Devices.Bluetooth.Advertisement;
using Windows.Devices.Bluetooth.GenericAttributeProfile;
using Windows.Devices.Enumeration;
using Windows.Foundation;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Controls;
using Windows.Web.Syndication;
using CharacteristicDictionary = System.Collections.Generic.Dictionary<string, System.Collections.Generic.Dictionary<string, Windows.Devices.Bluetooth.GenericAttributeProfile.GattCharacteristic>>;
//线程安全的版本,考虑到连接后不会更改。还是使用性能更好的 Dictionary
//using ConcurrentGattDictionary = System.Collections.Concurrent.ConcurrentDictionary<string, System.Collections.Concurrent.ConcurrentDictionary<string, Windows.Devices.Bluetooth.GenericAttributeProfile.GattCharacteristic>>;
namespace MonitoringTechnology.Ble
{
public class BleDevice : ObservableObject
{
//获取当前程序运行路径
private string Save_Path = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"数据记录\";
private readonly DeviceInformation _deviceInfo;
private BluetoothLEDevice _device;
private GattCharacteristic CharacteristicWrite;
private GattCharacteristic CharacteristicNotify;
private string _mac;
private string _name;
private byte[] _mfrData;
private int _rssi;
private readonly List<GattDeviceService> GattServices = new List<GattDeviceService>();
private readonly CharacteristicDictionary GattCharacteristics = new CharacteristicDictionary();
public static FileModel FileModel { get; set; } = new FileModel();
public event TypedEventHandler<GattCharacteristic, byte[]> CharacteristicValueChanged;//数据解析 -- 报文返回
public event TypedEventHandler<GattCharacteristic, string> ReceiveValueChanged; //数据解析 --自定义数据返回
public event TypedEventHandler<BleDevice, bool> 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();
#region
public BleDevice() { }
public BleDevice(DeviceInformation deviceInfo)
{
_deviceInfo = deviceInfo;
_mac = deviceInfo.Mac();
_name = deviceInfo.Name;
Log.Info("################# BleDevice #################");
foreach (KeyValuePair<string, object> item in deviceInfo.Properties)
{
Log.Info($"{item.Key}={item.Value}");
}
}
public void Update(BleDevice other)
{
Name = other.Name;
MfrData = other.MfrData;
RSSI = other.RSSI;
}
public void Update(BluetoothLEAdvertisementReceivedEventArgs args)
{
//通过方法属性更新是为了通知UI刷新
string localName = args.LocalName();
//有可能是广播回应包不带LocalName防止显示不出真实的名称
if (!string.IsNullOrEmpty(localName))
{
Name = localName;
}
byte[] mfrData = args.MfrData();
if (mfrData != null)
{
MfrData = args.MfrData();
}
RSSI = args.RawSignalStrengthInDBm;
}
public byte[] MfrData
{
get => _mfrData;
set
{
Set(ref _mfrData, value);
OnPropertyChanged(nameof(MfrDataHex));
}
}
public string MfrDataHex => _mfrData?.ToHex();
public int RSSI
{
get => -_rssi;
set => Set(ref _rssi, value);
}
public string Name
{
get => string.IsNullOrEmpty(_name) ? "Unknown Device" : _name;
set => Set(ref _name, value);
}
//System.Devices.Aep.DeviceAddress
public string Mac => _mac;
public string Id => _deviceInfo.Id;
public bool IsConnected => _device != null && _device.ConnectionStatus == BluetoothConnectionStatus.Connected;
/// <summary>
/// 连接设备
/// </summary>
public async void Connect()
{
//下面一行是官方文档的写法,貌似版本低所以报错
//BluetoothLEDevice bluetoothLEDevice = await BluetoothLEDevice.FromIdAsync(Id);
//使用自定义的拓展方法 GetResultAsync()
_device = await BluetoothLEDevice.FromIdAsync(Id).GetResultAsync();
//监听连接状态
_device.ConnectionStatusChanged += _device_ConnectionStatusChanged;
Log.Info($"{DateTime.Now:HH:mm:ss.fff} - 开始连接: " + _device);
DiscoverServices();
}
private void _device_ConnectionStatusChanged(BluetoothLEDevice sender, object args)
{
Log.Info("_device_ConnectionStatusChanged() - ConnectionStatus=" + sender.ConnectionStatus);
if (sender.ConnectionStatus == BluetoothConnectionStatus.Connected)
{
}
else
{
ConnectionStateChanged?.Invoke(this, false);
}
}
private async Task<bool> EnableNotification(GattCharacteristic characteristic)
{
GattCommunicationStatus result = await characteristic
.WriteClientCharacteristicConfigurationDescriptorAsync(
GattClientCharacteristicConfigurationDescriptorValue.Notify
).GetResultAsync();
return result == GattCommunicationStatus.Success;
}
public async Task<bool> Write(byte[] data)
{
if (CharacteristicWrite == null)
{
return false;
}
DataWriter writer = new DataWriter();
writer.WriteBytes(data);
GattCommunicationStatus result = await CharacteristicWrite
.WriteValueAsync(writer.DetachBuffer(), GattWriteOption.WriteWithoutResponse)
.GetResultAsync();
return result == GattCommunicationStatus.Success;
}
public async Task<byte[]> Read(string serviceUuid, string characteristicUuid)
{
GattCharacteristic characteristic = GattCharacteristics[serviceUuid]?[characteristicUuid];
if (characteristic != null)
{
GattReadResult result = await characteristic.ReadValueAsync().GetResultAsync();
if (result.Status == GattCommunicationStatus.Success)
{
byte[] data = result.Value.ToBytes();
Log.Info($"读取数据 <<< {data.ToHex()} / {Encoding.UTF8.GetString(data)}");
return data;
}
}
else
{
Log.Info($"未发现该特征: {serviceUuid} / {characteristicUuid}");
}
return null;
}
public void Disconnect()
{
Log.Info("Disconnect()");
//必须释放服务才能断开连接
foreach (GattDeviceService service in GattServices)
{
service.Dispose();
}
_device?.Dispose();
//_device = null;//赋值为 null 会导致收不到断线的通知
//ConnectionStateChanged?.Invoke(this, false);
}
public override string ToString()
{
return Name + "\r\n" + Mac;
}
private async void DiscoverServices()
{
GattServices.Clear();
GattCharacteristics.Clear();
GattDeviceServicesResult servicesResult = await _device.GetGattServicesAsync().GetResultAsync();
if (servicesResult.Status == GattCommunicationStatus.Success)
{
foreach (GattDeviceService service in servicesResult.Services)
{
//存储该服务下的特征值
Dictionary<string, GattCharacteristic> characteristics = new Dictionary<string, GattCharacteristic>();
string serviceUuid = service.Uuid.ToString();
Log.Info($"Gatt Service: {serviceUuid}");
GattCharacteristicsResult characteristicsResult = await service.GetCharacteristicsAsync().GetResultAsync();
if (characteristicsResult.Status == GattCommunicationStatus.Success)
{
foreach (GattCharacteristic characteristic in characteristicsResult.Characteristics)
{
//存储该特征值
characteristics[characteristic.Uuid.ToString()] = characteristic;
string characteristicUuid = characteristic.Uuid.ToString();
Log.Info($"\tGatt Characteristic: {characteristicUuid}");
if (serviceUuid == Uuids.SERVICE)
{
if (characteristicUuid == Uuids.WRITE)
{
CharacteristicWrite = characteristic;
}
else if (characteristicUuid == Uuids.NOTIFY)
{
CharacteristicNotify = characteristic;
}
}
}
}
GattCharacteristics[service.Uuid.ToString()] = characteristics;
GattServices.Add(service);
}
//订阅通知
if (CharacteristicNotify != null)
{
//需得用一个全局变量保持对 ValueChanged 回调函数的引用,不然收不到数据
CharacteristicNotify.ValueChanged += CharacteristicNotify_ValueChanged;
bool enabled = await EnableNotification(CharacteristicNotify);
if (enabled)
{
Log.Info("订阅通知成功!" + CharacteristicNotify.Uuid);
}
}
ConnectionStateChanged?.Invoke(this, true);
}
else
{
string _message = "连接失败,请重新尝试连接!";
ReceiveValueChangedChanged(null, _message);
}
}
#endregion
private static string _localtime => $"{DateTime.Now: yyyy-MM-dd HH:mm:ss.fff}";
/// <summary>
/// 收到数据 ----报文返回
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void CharacteristicNotify_ValueChanged(GattCharacteristic sender, GattValueChangedEventArgs args)
{
byte[] data = args.CharacteristicValue.ToBytes();//十进制
//Log.Info($"收到数据 <<< {data.ToHex()}");
//Log.Info($"收到数据 <<< {data}");
CharacteristicValueChanged?.Invoke(sender, data);
ParsingData(data.ToList());
}
/// <summary>
/// 自定义数据接收--数据解析
/// </summary>
/// <param name="sender"></param>
/// <param name="args"></param>
private void ReceiveValueChangedChanged(GattCharacteristic sender, string data)
{
ReceiveValueChanged?.Invoke(sender, data);
}
/// <summary>
/// 定义一个委托,用于传值老的版本号
/// </summary>
Action<byte[]> func = new Action<byte[]>(SystemOperationView.Setbbh);
byte[] bbh = new byte[4] { 0x00, 0x00, 0x00, 0x00 };
Random ran = new Random();
double LYSpeed;//蓝牙速率
/// <summary>
/// 解析数据
/// </summary>
/// <param name="byteList"></param>
private void ParsingData(List<byte> byteList)
{
string _message = "";
string _data = "";
//校验当前List是否为空或者长度
if (byteList == null || byteList.Count == 0)
return;
string rec_16 = null;
for (int i = 0; i < byteList.Count; i++)
{
rec_16 += byteList[i].ToString("X2"); //16进制显示
}
//string _message = tools.HexStringToString(rec_16, Encoding.Default).Replace("\r\n", "");
//以txt文档的形式存储接收到的数据
//tools.AddLgoToTXT(FileModel.File_Name + FileModel.File_Time.ToString("yyyy-MM-dd") + ".txt", FileModel.File_Path + FileModel.File_Time.ToString("yyyy-MM-dd") + @"\", _localtime + ": " + rec_16 + "\r\n");
tools.AddLgoToTXT("原始报文.txt", Save_Path + System.DateTime.Now.ToString("yyyy_MM_dd") + @"\", System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ---- " + rec_16 + "\r\n");
//获取当前系统时间
DateTime time_DataBase = DateTime.Now;
Random ran = new Random();
//帧头
byte[] _header = new byte[] { 0xEF, 0xFE, 0xFE, 0xEF };
//帧尾
byte _end = 0x16;
//长度校验
int _len = 0;
//校验
int _check = 0;
//功能码
byte _fun_code = 0;
//类型
byte _kind = 0;
//地址码
byte _adress = 0;
//数据类型
byte _data_type = 0;
//校验帧头
if (byteList[0] != _header[0] && byteList[0] != _header[2])
return;
if (byteList[1] != _header[1] && byteList[1] != _header[3])
return;
//校验帧尾
if (byteList[byteList.Count - 1] != _end)
return;
//获取检验长度
_len = Convert.ToInt32(byteList[2].ToString("X2") + byteList[3].ToString("X2"), 16);
//获取检验的校验和
for (int i = 0; i < byteList.Count - 2; i++)
{
_check += byteList[i];
}
_check = _check & 0xFF;
//长度 及 累加和校验
if (_len != byteList.Count - 4 || byteList[byteList.Count - 2] != _check)
return;
_len = 0;
_check = 0;
//地址码
_adress = byteList[4];
//功能码
_fun_code = byteList[5];
//类型
_kind = byteList[6];
System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区
DateTime dt = new DateTime();
switch (_fun_code)
{
//数据解析 ---实时数据
case 0x02:
switch (_kind)
{
//智能状态监控传感器数据
case 50:
//UTC时间
if ((int)byteList[8] == 0 && (int)byteList[9] == 0 && (int)byteList[10] == 0 && (int)byteList[11] == 0)
{
dt = DateTime.Now;
}
else
{
dt = startTime.AddSeconds(Convert.ToInt32(byteList[8].ToString("X2") + byteList[9].ToString("X2") + byteList[10].ToString("X2") + byteList[11].ToString("X2"), 16));
}
monitoringSensorModel.f_CreateDate = time_DataBase;
monitoringSensorModel._datetime_Sensor = dt;
#region
double LYSpeed = NextDouble(ran, 1.00, 1.50, 2);// 保留两位小数
#endregion
#region data
//温度 12,13,14,15
monitoringSensorModel._Tem = tools.bytetofloat(byteList, 12);
//湿度 16,17,18,19
monitoringSensorModel._Hum = tools.bytetofloat(byteList, 16);
//气压 20,21,2223
monitoringSensorModel._pressure = tools.bytetofloat(byteList, 20);
//加速度X 24,25,26,27
monitoringSensorModel._acceleration_X = tools.bytetofloat(byteList, 24);
//加速度Y 28,29,30,31
monitoringSensorModel._acceleration_Y = tools.bytetofloat(byteList, 28);
//加速度Z 32,33,34,35
monitoringSensorModel._acceleration_Z = tools.bytetofloat(byteList, 32);
//角速度X 36,37,38,39
monitoringSensorModel._angularVelocity_X = tools.bytetofloat(byteList, 36);
//角速度Y 40,41,42,43
monitoringSensorModel._angularVelocity_Y = tools.bytetofloat(byteList, 40);
//角速度Z 44,45,46,47
monitoringSensorModel._angularVelocity_Z = tools.bytetofloat(byteList, 44);
//角度X 48,49,50,51
float X = tools.bytetofloat(byteList, 48);
//monitoringSensorModel.degrees_x = X;
if (X > 0)
{
monitoringSensorModel.degrees_x = X * 1.058F;
}
else
{
monitoringSensorModel.degrees_x = X * 1.104F;
}
//monitoringSensorModel.degrees_x = tools.bytetofloat(byteList, 48) * 1.02F;
//角度Y 52,53,54,55
float Y = tools.bytetofloat(byteList, 52);
//monitoringSensorModel.degrees_y = Y;
if (Y > 0)
{
if (Y < 90)
{
monitoringSensorModel.degrees_y = Y * 1.0624F;
}
else if ( Y >= 173)
{
monitoringSensorModel.degrees_y = Y * (-1.0353F);
}
else if (Y < 173)
{
monitoringSensorModel.degrees_y = Y * 1.0411F;
}
}
else
{
monitoringSensorModel.degrees_y = Y;
}
//角度Z 56,57,58,59
//monitoringSensorModel.degrees_z = tools.bytetofloat(byteList, 56);
float Z = tools.bytetofloat(byteList, 56);
monitoringSensorModel.degrees_z = Z;
//电池电压 60,61,62,63
monitoringSensorModel._batteryVoltage = tools.bytetofloat(byteList, 60);
//充电电流 64,65,66,67
monitoringSensorModel._ChargingCurrent = tools.bytetofloat(byteList, 64);
//充电状态 68,69
string ctl = byteList[68].ToString("X2") + byteList[69].ToString("X2");
string ctl_2 = null;
for (int i = 0; i < ctl.Length; i++)
{
ctl_2 += tools.HexString2BinString(ctl.Substring(i, 1));
}
ctl_2 = ctl_2.Replace(" ", "");
if (ctl_2.Length == 16)
{
//CHRG==0 && STDBY== 1,表示正在充电
if (ctl_2.Substring(15, 1).Equals("0") && ctl_2.Substring(14, 1).Equals("1"))
{
monitoringSensorModel._State = "正在充电";
}
//CHRG==1 && STDBY== 0表示充满
else if (ctl_2.Substring(15, 1).Equals("1") && ctl_2.Substring(14, 1).Equals("0"))
{
monitoringSensorModel._State = "充满";
}
//其他表示未充电
else
{
monitoringSensorModel._State = "未充电";
}
}
///定时去刷新首页电气数据
ThreadPool.QueueUserWorkItem(delegate
{
SynchronizationContext.SetSynchronizationContext(new
DispatcherSynchronizationContext(System.Windows.Application.Current.Dispatcher));
SynchronizationContext.Current.Post(pl =>
{
if (FirstPageView.firstPageView.ElectricalEnvironmentalList.Count >= 30)
FirstPageView.firstPageView.ElectricalEnvironmentalList.RemoveAt(0);
FirstPageView.firstPageView.ElectricalEnvironmentalList.Add(new ElectricalEnvironmentalModel()
{
F_CreateDate = (DateTime)monitoringSensorModel.f_CreateDate,
F_DatetimeSensor = (DateTime)monitoringSensorModel._datetime_Sensor,
F_Tem = (float)monitoringSensorModel._Tem,
F_Hum = (float)monitoringSensorModel._Hum,
F_Pressure = (float)monitoringSensorModel._pressure
});
for (int i = 0; i < FirstPageView.firstPageView.ElectricalEnvironmentalList.Count; i++)
{
FirstPageView.firstPageView.ElectricalEnvironmentalList[i].F_SerialNo = i + 1;
}
}, null);
});
//姿态数据刷新
AttitudeDisplayView.monitoringSensor.F_DatetimeSensor = monitoringSensorModel._datetime_Sensor;
AttitudeDisplayView.monitoringSensor.F_AccelerationX = monitoringSensorModel._acceleration_X;
AttitudeDisplayView.monitoringSensor.F_AccelerationY = monitoringSensorModel._acceleration_Y;
AttitudeDisplayView.monitoringSensor.F_AccelerationZ = monitoringSensorModel._acceleration_Z;
AttitudeDisplayView.monitoringSensor.F_AngularVelocityX = monitoringSensorModel._angularVelocity_X;
AttitudeDisplayView.monitoringSensor.F_AngularVelocityY = monitoringSensorModel._angularVelocity_Y;
AttitudeDisplayView.monitoringSensor.F_AngularVelocityZ = monitoringSensorModel._angularVelocity_Z;
AttitudeDisplayView.monitoringSensor.F_DegreesX = monitoringSensorModel.degrees_x;
AttitudeDisplayView.monitoringSensor.F_DegreesY = monitoringSensorModel.degrees_y;
AttitudeDisplayView.monitoringSensor.F_DegreesZ = monitoringSensorModel.degrees_z;
//电池电压
MainWindow.mainViewModel.F_BatteryVoltage = monitoringSensorModel._batteryVoltage;
//充电电流
MainWindow.mainViewModel.F_ChargingCurrent = monitoringSensorModel._ChargingCurrent;
//充电状态
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 + "Pa 加速度X" + monitoringSensorModel._acceleration_X + "rad/s 加速度Y" + monitoringSensorModel._acceleration_Y + "rad/s 加速度Z" + monitoringSensorModel._acceleration_Z + "rad/s 角速度X" + monitoringSensorModel._angularVelocity_X + "m/s² 角速度Y" + monitoringSensorModel._angularVelocity_Y + "m/s² 角速度Z" + monitoringSensorModel._angularVelocity_Z + "m/s² 俯仰角:" + monitoringSensorModel.degrees_x + "° 横滚角:" + monitoringSensorModel.degrees_y + "° 偏航角:" + monitoringSensorModel.degrees_z + "° 电池电压:" + monitoringSensorModel._batteryVoltage + "V 充电电流:" + monitoringSensorModel._ChargingCurrent + "A 充电状态:" + monitoringSensorModel._State + " 蓝牙速率:" + LYSpeed + " Mbps";
ReceiveValueChangedChanged(null, _message);
break;
//主系统数据
case 51:
break;
default:
break;
}
break;
//升级文件请求回复
case 0x6E:
switch (byteList[7])
{
case 0x00:
_message += "获取成功";
break;
case 0x01:
_message += "空";
break;
case 0x02:
_message += "设备忙";
break;
default:
break;
}
break;
//版本号查询回复
case 0x6F:
bbh[0] = byteList[7];
bbh[1] = byteList[8];
bbh[2] = byteList[9];
bbh[3] = byteList[10];
func(bbh);
switch (byteList[11])
{
case 0x00:
_message += "版本查询:获取成功";
break;
case 0x01:
_message += "版本查询:空";
ReceiveValueChangedChanged(null, _message);
break;
case 0x02:
_message += "版本查询:设备忙";
ReceiveValueChangedChanged(null, _message);
break;
default:
break;
}
//显示版本号
SystemOperationView.systemOperationViewModel.VersionQueryData = ((int)bbh[0]).ToString() + "." + ((int)bbh[1]).ToString() + "." + ((int)bbh[2]).ToString() + "." + ((int)bbh[3]).ToString();
_message += " 版本号:" + SystemOperationView.systemOperationViewModel.VersionQueryData;
ReceiveValueChangedChanged(null, _message);
break;
//设备回复文件数据指令
case 0x66:
int _start = Convert.ToInt32(byteList[6].ToString("X2") + byteList[7].ToString("X2") + byteList[8].ToString("X2") + byteList[9].ToString("X2"), 16);
int _Length = Convert.ToInt32(byteList[10].ToString("X2") + byteList[11].ToString("X2"), 16);
systemOperationView._send(_start, _Length);
break;
//校时
case 0x06:
//UTC时间
dt = startTime.AddSeconds(Convert.ToInt32(byteList[6].ToString("X2") + byteList[7].ToString("X2") + byteList[8].ToString("X2") + byteList[9].ToString("X2"), 16));
if ((time_DataBase - dt).TotalMinutes < 60)
{
_message = "系统校时成功";
ReceiveValueChangedChanged(null, _message);
}
else
{
_message = "系统校时失败";
ReceiveValueChangedChanged(null, _message);
}
break;
//擦除历史数据功能
case 0x08:
switch (byteList[6])
{
case 0x00:
_message += "擦除完成";
ReceiveValueChangedChanged(null, _message);
break;
case 0x01:
_message += "等待擦除";
ReceiveValueChangedChanged(null, _message);
break;
case 0x02:
_message += "擦除失败";
ReceiveValueChangedChanged(null, _message);
break;
default:
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时间
if ((int)byteList[6] == 0 && (int)byteList[7] == 0 && (int)byteList[8] == 0 && (int)byteList[9] == 0)
{
dt = DateTime.Now;
}
else
{
dt = startTime.AddSeconds(Convert.ToInt32(byteList[6].ToString("X2") + byteList[7].ToString("X2") + byteList[8].ToString("X2") + byteList[9].ToString("X2"), 16));
}
monitoringSensorModel.f_CreateDate = time_DataBase;
monitoringSensorModel._datetime_Sensor = dt;
#region data
//温度 10,11,12,13
monitoringSensorModel._Tem = tools.bytetofloat(byteList, 10);
//湿度 14,15,16,17
monitoringSensorModel._Hum = tools.bytetofloat(byteList, 14);
//气压 18,19,20,21
monitoringSensorModel._pressure = tools.bytetofloat(byteList, 18);
//加速度X 22,23,24,25
monitoringSensorModel._acceleration_X = tools.bytetofloat(byteList, 22);
//加速度Y 26,27,28,29
monitoringSensorModel._acceleration_Y = tools.bytetofloat(byteList, 26);
//加速度Z 30,31,32,33
monitoringSensorModel._acceleration_Z = tools.bytetofloat(byteList, 30);
//角速度X 34,35,36,37
monitoringSensorModel._angularVelocity_X = tools.bytetofloat(byteList, 34);
//角速度Y 38,39,40,41
monitoringSensorModel._angularVelocity_Y = tools.bytetofloat(byteList, 38);
//角速度Z 42,43,44,45
monitoringSensorModel._angularVelocity_Z = tools.bytetofloat(byteList, 42);
//角度X 46,47,48,49
//monitoringSensorModel.degrees_x = tools.bytetofloat(byteList, 46);
//角度Y 50,51,52,53
// monitoringSensorModel.degrees_y = tools.bytetofloat(byteList, 50);
//角度X 48,49,50,51
float X_history = tools.bytetofloat(byteList, 48);
//monitoringSensorModel.degrees_x = X;
if (X_history > 0)
{
monitoringSensorModel.degrees_x = X_history * 1.058F;
}
else
{
monitoringSensorModel.degrees_x = X_history * 1.104F;
}
//monitoringSensorModel.degrees_x = tools.bytetofloat(byteList, 48) * 1.02F;
//角度Y 52,53,54,55
float Y_history = tools.bytetofloat(byteList, 52);
//monitoringSensorModel.degrees_y = Y;
if (Y_history > 0)
{
if (Y_history < 90)
{
monitoringSensorModel.degrees_y = Y_history * 1.0624F;
}
else if (Y_history >= 173)
{
monitoringSensorModel.degrees_y = Y_history * (-1.0353F);
}
else if (Y_history < 173)
{
monitoringSensorModel.degrees_y = Y_history * 1.0411F;
}
}
else
{
monitoringSensorModel.degrees_y = Y_history;
}
//角度Z 56,57,58,59
//monitoringSensorModel.degrees_z = tools.bytetofloat(byteList, 56);
float Z_history = tools.bytetofloat(byteList, 56);
monitoringSensorModel.degrees_z = Z_history;
//电池电压 58,59.60,61
monitoringSensorModel._batteryVoltage = tools.bytetofloat(byteList, 58);
//充电电流 62,63,64,65
monitoringSensorModel._ChargingCurrent = tools.bytetofloat(byteList, 62);
//充电状态 66,67
string ct2 = byteList[66].ToString("X2") + byteList[67].ToString("X2");
string ct2_2 = null;
for (int i = 0; i < ct2.Length; i++)
{
ct2_2 += tools.HexString2BinString(ct2.Substring(i, 1));
}
ct2_2 = ct2_2.Replace(" ", "");
if (ct2_2.Length == 16)
{
//CHRG==0 && STDBY== 1,表示正在充电
if (ct2_2.Substring(15, 1).Equals("0") && ct2_2.Substring(14, 1).Equals("1"))
{
monitoringSensorModel._State = "正在充电";
}
//CHRG==1 && STDBY== 0表示充满
else if (ct2_2.Substring(15, 1).Equals("1") && ct2_2.Substring(14, 1).Equals("0"))
{
monitoringSensorModel._State = "充满";
}
//其他表示未充电
else
{
monitoringSensorModel._State = "未充电";
}
}
//温度-主系统 68,69
monitoringSensorModel.tem = tools.bytetoInt(byteList, 68) / (float)100;
//湿度-主系统 70,71
monitoringSensorModel.hum = tools.bytetoUInt(byteList, 70) / (float)100;
//气压 -主系统 72,73
monitoringSensorModel.preeure = tools.bytetoUInt(byteList, 72);
//电压1 -主系统 74,75
monitoringSensorModel.voltage1 = tools.bytetoUInt(byteList, 74) / (float)100;
//电压2 -主系统 76,77
monitoringSensorModel.voltage2 = tools.bytetoUInt(byteList, 76) / (float)100;
//电压3 -主系统 78,79
monitoringSensorModel.voltage3 = tools.bytetoUInt(byteList, 78) / (float)100;
//电压4 -主系统 80,81
monitoringSensorModel.voltage4 = tools.bytetoUInt(byteList, 80) / (float)100;
//电压5 -主系统 82,83
monitoringSensorModel.voltage5 = tools.bytetoUInt(byteList, 82) / (float)100;
//电压6 -主系统 84,85
monitoringSensorModel.voltage6 = tools.bytetoUInt(byteList, 84) / (float)100;
//电压7 -主系统 86,87
monitoringSensorModel.voltage7 = tools.bytetoUInt(byteList, 86) / (float)100;
//电压8 -主系统 88,89
monitoringSensorModel.voltage8 = tools.bytetoUInt(byteList, 88) / (float)100;
//电压9 -主系统 90,91
monitoringSensorModel.voltage9 = tools.bytetoUInt(byteList, 90) / (float)100;
//电压10 -主系统 92,93
monitoringSensorModel.voltage10 = tools.bytetoUInt(byteList, 92) / (float)100;
//电流1 -主系统 94,95
monitoringSensorModel.current1 = tools.bytetoUInt(byteList, 94) / (float)100;
//电流2 -主系统 96,97
monitoringSensorModel.current2 = tools.bytetoUInt(byteList, 96) / (float)100;
//电流3 -主系统 98,99
monitoringSensorModel.current3 = tools.bytetoUInt(byteList, 98) / (float)100;
//电流4 -主系统 100,101
monitoringSensorModel.current4 = tools.bytetoUInt(byteList, 100) / (float)100;
//电流5 -主系统 102,103
monitoringSensorModel.current5 = tools.bytetoUInt(byteList, 102) / (float)100;
//电流6 -主系统 104,105
monitoringSensorModel.current6 = tools.bytetoUInt(byteList, 104) / (float)100;
//电流7 -主系统 106,107
monitoringSensorModel.current7 = tools.bytetoUInt(byteList, 106) / (float)100;
//电流8 -主系统 108,109
monitoringSensorModel.current8 = tools.bytetoUInt(byteList, 108) / (float)100;
//电流9 -主系统 110,111
monitoringSensorModel.current9 = tools.bytetoUInt(byteList, 110) / (float)100;
//电流10 -主系统 112,113
monitoringSensorModel.current10 = tools.bytetoUInt(byteList, 112) / (float)100;
#endregion
_message = "日期:" + monitoringSensorModel._datetime_Sensor + "\r\n" + " 温度:" + monitoringSensorModel._Tem + "℃ 湿度:" + monitoringSensorModel._Hum + "% 气压:" + monitoringSensorModel._pressure + "Pa " + "\r\n" + " 加速度X" + monitoringSensorModel._acceleration_X + "rad/s 加速度Y" + monitoringSensorModel._acceleration_Y + "rad/s 加速度Z" + monitoringSensorModel._acceleration_Z + "rad/s" + "\r\n" + " 角速度X" + monitoringSensorModel._angularVelocity_X + "m/s² 角速度Y" + monitoringSensorModel._angularVelocity_Y + "m/s² 角速度Z" + monitoringSensorModel._angularVelocity_Z + "m/s² " + "\r\n" + " 俯仰角:" + monitoringSensorModel.degrees_x + "° 横滚角:" + monitoringSensorModel.degrees_y + "° 偏航角:" + monitoringSensorModel.degrees_z + "° " + "\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文档的形式存储接收到的数据---默认D盘
//tools.AddLgoToTXT(FileModel.File_Name + FileModel.File_Time.ToString("yyyy-MM-dd") + " 历史数据查询记录" + ".txt", FileModel.File_Path + FileModel.File_Time.ToString("yyyy-MM-dd") + @"\", _localtime + ": " + _message + "\r\n");
tools.AddLgoToTXT("历史数据查询记录.txt", Save_Path + System.DateTime.Now.ToString("yyyy_MM_dd") + @"\", System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " ---- " + _message + "\r\n");
_data = "收到历史数据,请查看文件:" + Save_Path + FileModel.File_Time.ToString("yyyy-MM-dd") + " 历史数据查询记录" + ".txt";
ReceiveValueChangedChanged(null, _data);
break;
default:
break;
}
}
/// <summary>
/// 随机生成两位小数
/// </summary>
/// <param name="ran"></param>
/// <param name="minValue"></param>
/// <param name="maxValue"></param>
/// <param name="decimalPlace"></param>
/// <returns></returns>
public double NextDouble(Random ran, double minValue, double maxValue, int decimalPlace)
{
double randNum = ran.NextDouble() * (maxValue - minValue) + minValue;
return Convert.ToDouble(randNum.ToString("f" + decimalPlace));
}
}
}