20240301_JSEQ_upperpc/JiangsuEarthquakeNow/JiangsuEarthquake/Models/SeismographModel.cs
XuMin 3b6c570800 1 经过电控腔测试和升压站测试;
2 解决了后一个通信连接会影响前一个通信连接的问题;
3 测试过程中存在的问题修改;
2024-09-03 16:30:34 +08:00

1046 lines
65 KiB
C#
Raw Permalink 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 HandyControl.Controls;
using JiangsuEarthquake.Common;
using JiangsuEarthquake.DataAccess;
using JiangsuEarthquake.ViewModels;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Media;
using Application = System.Windows.Application;
namespace JiangsuEarthquake.Models
{
public class SeismographModel
{
private byte[] cmdSend { get; set; } = new byte[2]; //帧标志
private byte[] cmdRecv { get; set; } = new byte[2]; //帧标志
private byte[] lengthSend { get; set; } = new byte[2]; //从DATA开始的帧长度单位字节
private List<byte> dataSend { get; set; } = new List<byte>(); //数据部分
private List<byte> dataRecv { get; set; } = new List<byte>(); //数据部分
private byte[] checkCode { get; set; } = new byte[2]; //从CMD到DATA结束的CRC16校验和
private List<byte> checkByte { get; set; } = new List<byte>(); //校验码Byte
public byte[] CloseByte()
{
List<byte> sendCloseDataSeis = new List<byte>();
List<byte> checkCloseByte = new List<byte>();
byte[] checkCloseCode = new byte[2];
//发送断开连接消息
sendCloseDataSeis.Clear();
sendCloseDataSeis.AddRange(new byte[] { 0xBF, 0x13, 0x97, 0x74 }); //SYNC
sendCloseDataSeis.AddRange(new byte[] { 0xA0, 0x50 }); //CMD
sendCloseDataSeis.AddRange(new byte[] { 0x00, 0x04 }); //LENGTH
//消息字
byte[] msg = new byte[2];
msg = BitConverter.GetBytes(500);
msg = Tools.PadArrayWithZeros(msg, 2);
sendCloseDataSeis.AddRange(msg); //DATA
checkCloseByte.Clear();
checkCloseByte.AddRange(new byte[] { 0xA0, 0x50 }); //CMD
checkCloseByte.AddRange(new byte[] { 0x00, 0x04 }); //LENGTH
checkCloseByte.AddRange(msg); //DATA
checkCloseCode = Tools.ComputeChecksum(checkCloseByte.ToArray()); //CHK_SUM
sendCloseDataSeis.AddRange(checkCloseCode);
return sendCloseDataSeis.ToArray();
}
public void ParsingData(List<byte> byteList, int id, bool isMain)
{
if (byteList.Count == 0)
return;
//原始数据存储
string sql = $"insert into seismograph_originaldata(StationID,RecordTime,OriginalData) values('{id}','{DateTime.Now}','{BitConverter.ToString(byteList.ToArray())}');";
DBHelper.ExecuteNonQuery(sql, 1);
//同步字校验
if (byteList[0] != 0xBF || byteList[1] != 0x13 || byteList[2] != 0x97 || byteList[3] != 0x74)
{
string content = "地震仪数据同步字校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
checkByte.Clear();
//CRC16校验和校验
for (int i = 4; i < byteList.Count - 2; i++)
checkByte.Add(byteList[i]);
byte[] sendCheckdata = new byte[] { byteList[^2], byteList[^1] };
byte[] caluCheckdata = Tools.ComputeChecksum(checkByte.ToArray());
if (!Tools.CompareByte(sendCheckdata, caluCheckdata))
{
string content = "地震仪数据CRC16校验和校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
//长度校验
int length = BitConverter.ToInt16(new byte[] { byteList[7], byteList[6] }, 0);
if (length != byteList.Count - 8)
{
string content = "地震仪数据长度校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
cmdRecv = new byte[] { byteList[4], byteList[5] };
dataRecv.Clear();
for (int i = 8; i < byteList.Count - 2; i++)
dataRecv.Add(byteList[i]);
if (Tools.CompareByte(cmdRecv, new byte[] { 0x77, 0x00 })) //用于客户端与状态流服务器建立链接过程中消息交换
{
if (dataRecv.Count != 2)
{
string content = "地震仪链接回复长度校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
int response = BitConverter.ToInt16(new byte[2] { dataRecv[1], dataRecv[0] }, 0);
if (response == 100) //有空闲连接时应答
{
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.MainSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis1ConnectMsg = "存在空闲连接,发送认证!";
MainWindow.mainViewModel.MainSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Green);
});
//发送用户认证帧
cmdSend = new byte[] { 0x77, 0x00 };
lengthSend = new byte[] { 0x00, 0x3A };
string User = "Admin";
byte[] userByte = Encoding.UTF8.GetBytes(User);
byte[] userByteArray = Tools.PadArrayWithZeros(userByte, 16);
//if (userByte.Length != 16)
//{
// for (int i = 0; i < 16; i++)
// userByteArray[i] = 0;
// Array.Copy(userByte, 0, userByteArray, 16, userByte.Length);
//}
//else
//{
// userByteArray = userByte;
//}
string Password = "Admin";
byte[] passwordByte = Encoding.UTF8.GetBytes(Password);
byte[] passwordByteArray = Tools.PadArrayWithZeros(passwordByte, 40);
//if (passwordByte.Length != 40)
//{
// for (int i = 0; i < 40; i++)
// passwordByteArray[i] = 0;
// Array.Copy(passwordByte, 0, passwordByteArray, 40, passwordByte.Length);
//}
//else
//{
// passwordByteArray = passwordByte;
//}
dataSend.Clear();
dataSend.AddRange(new byte[] { 0xBF, 0x13, 0x97, 0x74 }); //SYNC
dataSend.AddRange(cmdSend); //CMD
dataSend.AddRange(lengthSend); //LENGTH
dataSend.AddRange(userByteArray);
dataSend.AddRange(passwordByteArray);
checkByte.Clear();
checkByte.AddRange(cmdSend);
checkByte.AddRange(lengthSend);
checkByte.AddRange(userByteArray);
checkByte.AddRange(passwordByteArray);
checkCode = Tools.ComputeChecksum(checkByte.ToArray());
dataSend.AddRange(checkCode);
if (id == 1)
{
if (isMain)
MainWindow.mainViewModel.clientModelMainSeis1.SendMessage(dataSend.ToArray());
else
MainWindow.mainViewModel.clientModelBackupSeis1.SendMessage(dataSend.ToArray());
}
else
{
if (isMain)
MainWindow.mainViewModel.clientModelMainSeis2.SendMessage(dataSend.ToArray());
else
MainWindow.mainViewModel.clientModelBackupSeis2.SendMessage(dataSend.ToArray());
}
string seisDevice = isMain == true ? "海底地震监测基站-主地震仪" : "海底地震监测基站-备地震仪";
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','{seisDevice}','连接认证','存在空闲连接,并已发送用户认证帧');";
DBHelper.ExecuteNonQuery(sql, 1);
}
else if (response == 405) //没有空闲连接
{
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.MainSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis1ConnectMsg = "无空闲连接,准备重连!";
MainWindow.mainViewModel.MainSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Red);
});
string seisDevice = isMain == true ? "海底地震监测基站-主地震仪" : "海底地震监测基站-备地震仪";
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','{seisDevice}','连接认证','无空闲连接,准备断开重连');";
DBHelper.ExecuteNonQuery(sql, 1);
//重新尝试连接
//先断开连接10s后重新连接
if (id == 1)
{
if (isMain)
{
if (MainWindow.mainViewModel.clientModelMainSeis1.IsConnected)
{
//发送断开连接消息
MainWindow.mainViewModel.clientModelMainSeis1.SendMessage(CloseByte());
Task.Run(new Action(async () =>
{
await Task.Delay(100);
MainWindow.mainViewModel.clientModelMainSeis1.DisConnect();
MainWindow.mainViewModel.IsMainSeis1CertSucs = false;
MainWindow.mainViewModel.MainSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis1ConnectMsg = "连接断开!";
MainWindow.mainViewModel.MainSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Red);
}));
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('1','{DateTime.Now}','海底地震监测基站-主地震仪','通信连接','连接已断开');";
DBHelper.ExecuteNonQuery(sql, 1);
}
Task.Run(new Action(async () =>
{
await Task.Delay(10000);
if (MainWindow.mainViewModel.clientModelMainSeis1.DoConnect(MainViewModel.SocketInfoMainSeis1))
{
MainWindow.mainViewModel.IsMainSeis1CertSucs = false;
MainWindow.mainViewModel.MainSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis1ConnectMsg = "初步连接,等待消息帧!";
MainWindow.mainViewModel.MainSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Green);
string record = "初步连接等待消息帧IP" + MainViewModel.SocketInfoMainSeis1.IP + "Port" + MainViewModel.SocketInfoMainSeis1.Port;
string sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('1','{DateTime.Now}','海底地震监测基站-主地震仪','通信连接','{record}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}));
}
else
{
if (MainWindow.mainViewModel.clientModelBackupSeis1.IsConnected)
{
//发送断开连接消息
MainWindow.mainViewModel.clientModelBackupSeis1.SendMessage(CloseByte());
Task.Run(new Action(async () =>
{
await Task.Delay(100);
MainWindow.mainViewModel.clientModelBackupSeis1.DisConnect();
MainWindow.mainViewModel.IsBackupSeis1CertSucs = false;
MainWindow.mainViewModel.BackupSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis1ConnectMsg = "连接断开!";
MainWindow.mainViewModel.BackupSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Red);
}));
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('1','{DateTime.Now}','海底地震监测基站-备地震仪','通信连接','连接已断开');";
DBHelper.ExecuteNonQuery(sql, 1);
}
Task.Run(new Action(async () =>
{
await Task.Delay(10000);
if (MainWindow.mainViewModel.clientModelBackupSeis1.DoConnect(MainViewModel.SocketInfoBackupSeis1))
{
MainWindow.mainViewModel.IsBackupSeis1CertSucs = false;
MainWindow.mainViewModel.BackupSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis1ConnectMsg = "初步连接,等待消息帧!";
MainWindow.mainViewModel.BackupSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Green);
string record = "初步连接等待消息帧IP" + MainViewModel.SocketInfoBackupSeis1.IP + "Port" + MainViewModel.SocketInfoBackupSeis1.Port;
string sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('1','{DateTime.Now}','海底地震监测基站-备地震仪','通信连接','{record}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}));
}
}
else
{
if (isMain)
{
if (MainWindow.mainViewModel.clientModelMainSeis2.IsConnected)
{
//发送断开连接消息
MainWindow.mainViewModel.clientModelMainSeis2.SendMessage(CloseByte());
Task.Run(new Action(async () =>
{
await Task.Delay(100);
MainWindow.mainViewModel.clientModelMainSeis2.DisConnect();
MainWindow.mainViewModel.IsMainSeis2CertSucs = false;
MainWindow.mainViewModel.MainSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis2ConnectMsg = "连接断开!";
MainWindow.mainViewModel.MainSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Red);
}));
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('2','{DateTime.Now}','海底地震监测基站-主地震仪','通信连接','连接已断开');";
DBHelper.ExecuteNonQuery(sql, 1);
}
Task.Run(new Action(async () =>
{
await Task.Delay(10000);
if (MainWindow.mainViewModel.clientModelMainSeis2.DoConnect(MainViewModel.SocketInfoMainSeis2))
{
MainWindow.mainViewModel.IsMainSeis2CertSucs = false;
MainWindow.mainViewModel.MainSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis2ConnectMsg = "初步连接,等待消息帧!";
MainWindow.mainViewModel.MainSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Green);
string record = "初步连接等待消息帧IP" + MainViewModel.SocketInfoMainSeis2.IP + "Port" + MainViewModel.SocketInfoMainSeis2.Port;
string sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('2','{DateTime.Now}','海底地震监测基站-主地震仪','通信连接','{record}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}));
}
else
{
if (MainWindow.mainViewModel.clientModelBackupSeis2.IsConnected)
{
//发送断开连接消息
MainWindow.mainViewModel.clientModelBackupSeis2.SendMessage(CloseByte());
Task.Run(new Action(async () =>
{
await Task.Delay(100);
MainWindow.mainViewModel.clientModelBackupSeis2.DisConnect();
MainWindow.mainViewModel.IsBackupSeis2CertSucs = false;
MainWindow.mainViewModel.BackupSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis2ConnectMsg = "连接断开!";
MainWindow.mainViewModel.BackupSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Red);
}));
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('2','{DateTime.Now}','海底地震监测基站-备地震仪','通信连接','连接已断开');";
DBHelper.ExecuteNonQuery(sql, 1);
}
Task.Run(new Action(async () =>
{
await Task.Delay(10000);
if (MainWindow.mainViewModel.clientModelBackupSeis2.DoConnect(MainViewModel.SocketInfoBackupSeis2))
{
MainWindow.mainViewModel.IsBackupSeis2CertSucs = false;
MainWindow.mainViewModel.BackupSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis2ConnectMsg = "初步连接,等待消息帧!";
MainWindow.mainViewModel.BackupSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Green);
string record = "初步连接等待消息帧IP" + MainViewModel.SocketInfoBackupSeis2.IP + "Port" + MainViewModel.SocketInfoBackupSeis2.Port;
string sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('2','{DateTime.Now}','海底地震监测基站-备地震仪','通信连接','{record}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}));
}
}
}
else if (response == 200) //认证成功
{
App.Current.Dispatcher.Invoke(() =>
{
//连接成功
if (id == 1)
{
if (isMain)
{
MainWindow.mainViewModel.IsMainSeis1CertSucs = true;
MainWindow.mainViewModel.MainSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis1ConnectMsg = "认证成功!";
MainWindow.mainViewModel.MainSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Green);
}
else
{
MainWindow.mainViewModel.IsBackupSeis1CertSucs = true;
MainWindow.mainViewModel.BackupSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis1ConnectMsg = "认证成功!";
MainWindow.mainViewModel.BackupSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Green);
}
}
else
{
if (isMain)
{
MainWindow.mainViewModel.IsMainSeis2CertSucs = true;
MainWindow.mainViewModel.MainSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis2ConnectMsg = "认证成功!";
MainWindow.mainViewModel.MainSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Green);
}
else
{
MainWindow.mainViewModel.IsBackupSeis2CertSucs = true;
MainWindow.mainViewModel.BackupSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis2ConnectMsg = "认证成功!";
MainWindow.mainViewModel.BackupSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Green);
}
}
});
string seisDevice = isMain == true ? "海底地震监测基站-主地震仪" : "海底地震监测基站-备地震仪";
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','{seisDevice}','连接认证','认证成功');";
DBHelper.ExecuteNonQuery(sql, 1);
}
else if (response == 400) //认证失败
{
string seisDevice = isMain == true ? "海底地震监测基站-主地震仪" : "海底地震监测基站-备地震仪";
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','{seisDevice}','连接认证','认证失败,准备断开重连');";
DBHelper.ExecuteNonQuery(sql, 1);
//重新尝试连接
if (id == 1)
{
if (isMain)
{
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.IsMainSeis1CertSucs = false;
MainWindow.mainViewModel.MainSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis1ConnectMsg = "认证失败!";
MainWindow.mainViewModel.MainSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Red);
});
if (MainWindow.mainViewModel.clientModelMainSeis1.IsConnected)
{
//发送断开连接消息
MainWindow.mainViewModel.clientModelMainSeis1.SendMessage(CloseByte());
Task.Run(new Action(async () =>
{
await Task.Delay(100);
MainWindow.mainViewModel.clientModelMainSeis1.DisConnect();
MainWindow.mainViewModel.IsMainSeis1CertSucs = false;
MainWindow.mainViewModel.MainSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis1ConnectMsg = "连接断开!";
MainWindow.mainViewModel.MainSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Red);
}));
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('1','{DateTime.Now}','海底地震监测基站-主地震仪','通信连接','连接已断开');";
DBHelper.ExecuteNonQuery(sql, 1);
}
Task.Run(new Action(async () =>
{
await Task.Delay(10000);
if (MainWindow.mainViewModel.clientModelMainSeis1.DoConnect(MainViewModel.SocketInfoMainSeis1))
{
MainWindow.mainViewModel.IsMainSeis1CertSucs = false;
MainWindow.mainViewModel.MainSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis1ConnectMsg = "初步连接,等待消息帧!";
MainWindow.mainViewModel.MainSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Green);
string record = "初步连接等待消息帧IP" + MainViewModel.SocketInfoMainSeis1.IP + "Port" + MainViewModel.SocketInfoMainSeis1.Port;
string sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('1','{DateTime.Now}','海底地震监测基站-主地震仪','通信连接','{record}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}));
}
else
{
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.IsBackupSeis1CertSucs = false;
MainWindow.mainViewModel.BackupSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis1ConnectMsg = "认证失败!";
MainWindow.mainViewModel.BackupSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Red);
});
if (MainWindow.mainViewModel.clientModelBackupSeis1.IsConnected)
{
//发送断开连接消息
MainWindow.mainViewModel.clientModelBackupSeis1.SendMessage(CloseByte());
Task.Run(new Action(async () =>
{
await Task.Delay(100);
MainWindow.mainViewModel.clientModelBackupSeis1.DisConnect();
MainWindow.mainViewModel.IsBackupSeis1CertSucs = false;
MainWindow.mainViewModel.BackupSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis1ConnectMsg = "连接断开!";
MainWindow.mainViewModel.BackupSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Red);
}));
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('1','{DateTime.Now}','海底地震监测基站-备地震仪','通信连接','连接已断开');";
DBHelper.ExecuteNonQuery(sql, 1);
}
Task.Run(new Action(async () =>
{
await Task.Delay(10000);
if (MainWindow.mainViewModel.clientModelBackupSeis1.DoConnect(MainViewModel.SocketInfoBackupSeis1))
{
MainWindow.mainViewModel.IsBackupSeis1CertSucs = false;
MainWindow.mainViewModel.BackupSeis1ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis1ConnectMsg = "初步连接,等待消息帧!";
MainWindow.mainViewModel.BackupSeis1ConnectMsgForeground = new SolidColorBrush(Colors.Green);
string record = "初步连接等待消息帧IP" + MainViewModel.SocketInfoBackupSeis1.IP + "Port" + MainViewModel.SocketInfoBackupSeis1.Port;
string sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('1','{DateTime.Now}','海底地震监测基站-备地震仪','通信连接','{record}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}));
}
}
else
{
if (isMain)
{
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.IsMainSeis2CertSucs = false;
MainWindow.mainViewModel.MainSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis2ConnectMsg = "认证失败!";
MainWindow.mainViewModel.MainSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Red);
});
if (MainWindow.mainViewModel.clientModelMainSeis2.IsConnected)
{
//发送断开连接消息
MainWindow.mainViewModel.clientModelMainSeis2.SendMessage(CloseByte());
Task.Run(new Action(async () =>
{
await Task.Delay(100);
MainWindow.mainViewModel.clientModelMainSeis2.DisConnect();
MainWindow.mainViewModel.IsMainSeis2CertSucs = false;
MainWindow.mainViewModel.MainSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis2ConnectMsg = "连接断开!";
MainWindow.mainViewModel.MainSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Red);
}));
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('2','{DateTime.Now}','海底地震监测基站-主地震仪','通信连接','连接已断开');";
DBHelper.ExecuteNonQuery(sql, 1);
}
Task.Run(new Action(async () =>
{
await Task.Delay(10000);
if (MainWindow.mainViewModel.clientModelMainSeis2.DoConnect(MainViewModel.SocketInfoMainSeis2))
{
MainWindow.mainViewModel.IsMainSeis2CertSucs = false;
MainWindow.mainViewModel.MainSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.MainSeis2ConnectMsg = "初步连接,等待消息帧!";
MainWindow.mainViewModel.MainSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Green);
string record = "初步连接等待消息帧IP" + MainViewModel.SocketInfoMainSeis2.IP + "Port" + MainViewModel.SocketInfoMainSeis2.Port;
string sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('2','{DateTime.Now}','海底地震监测基站-主地震仪','通信连接','{record}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}));
}
else
{
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.IsBackupSeis2CertSucs = false;
MainWindow.mainViewModel.BackupSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis2ConnectMsg = "认证失败!";
MainWindow.mainViewModel.BackupSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Red);
});
if (MainWindow.mainViewModel.clientModelBackupSeis2.IsConnected)
{
//发送断开连接消息
MainWindow.mainViewModel.clientModelBackupSeis2.SendMessage(CloseByte());
Task.Run(new Action(async () =>
{
await Task.Delay(100);
MainWindow.mainViewModel.clientModelBackupSeis2.DisConnect();
MainWindow.mainViewModel.IsBackupSeis2CertSucs = false;
MainWindow.mainViewModel.BackupSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis2ConnectMsg = "连接断开!";
MainWindow.mainViewModel.BackupSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Red);
}));
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('2','{DateTime.Now}','海底地震监测基站-备地震仪','通信连接','连接已断开');";
DBHelper.ExecuteNonQuery(sql, 1);
}
Task.Run(new Action(async () =>
{
await Task.Delay(10000);
if (MainWindow.mainViewModel.clientModelBackupSeis2.DoConnect(MainViewModel.SocketInfoBackupSeis2))
{
MainWindow.mainViewModel.IsBackupSeis2CertSucs = false;
MainWindow.mainViewModel.BackupSeis2ConnectMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.BackupSeis2ConnectMsg = "初步连接,等待消息帧!";
MainWindow.mainViewModel.BackupSeis2ConnectMsgForeground = new SolidColorBrush(Colors.Green);
string record = "初步连接等待消息帧IP" + MainViewModel.SocketInfoBackupSeis2.IP + "Port" + MainViewModel.SocketInfoBackupSeis2.Port;
string sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('2','{DateTime.Now}','海底地震监测基站-备地震仪','通信连接','{record}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}));
}
}
}
}
else
{
if (Tools.CompareByte(cmdRecv, new byte[] { 0xC0, 0x00 })) //台站参数
{
if (dataRecv.Count == 128) //查询台站参数应答
{
try
{
//台号
int stationNum = BitConverter.ToInt32(new byte[] { dataRecv[3], dataRecv[2], dataRecv[1], dataRecv[0] }, 0);
//台站名称
List<byte> stationNameData = new List<byte>();
for (int i = 4; i < 36; i++)
stationNameData.Add(dataRecv[i]);
string stationName = Encoding.UTF8.GetString(stationNameData.ToArray());
//台名缩写
List<byte> stationNameAbbData = new List<byte>();
for (int i = 36; i < 44; i++)
stationNameAbbData.Add(dataRecv[i]);
string stationNameAbb = Encoding.UTF8.GetString(stationNameAbbData.ToArray());
//地震计总数
short seisNum = BitConverter.ToInt16(new byte[] { dataRecv[45], dataRecv[44] }, 0);
//总通道数
short passNum = BitConverter.ToInt16(new byte[] { dataRecv[47], dataRecv[46] }, 0);
//纬度
int latitude = BitConverter.ToInt16(new byte[] { dataRecv[51], dataRecv[50], dataRecv[49], dataRecv[48] }, 0);
//经度
int longitude = BitConverter.ToInt16(new byte[] { dataRecv[55], dataRecv[54], dataRecv[53], dataRecv[52] }, 0);
//高程
int elevation = BitConverter.ToInt16(new byte[] { dataRecv[59], dataRecv[58], dataRecv[57], dataRecv[56] }, 0);
//起用日期
List<byte> enablingDateList = new List<byte>();
for (int i = 60; i < 92; i++)
enablingDateList.Add(dataRecv[i]);
string enablingDate = Encoding.UTF8.GetString(enablingDateList.ToArray());
//台网标志
string tetworkLogo = Encoding.UTF8.GetString(new byte[] { dataRecv[95], dataRecv[94], dataRecv[93], dataRecv[92] });
//软件编本
List<byte> softVersionList = new List<byte>();
for (int i = 96; i < 128; i++)
softVersionList.Add(dataRecv[i]);
string softVersion = Encoding.UTF8.GetString(softVersionList.ToArray());
//数据存储
sql = $"insert into seismograph_originaldata(StationID,RecordTime,StationNo,StationName," +
$"StationShortName,EarthQuakeCount,ChannelsNo,WD,JD,GaoCheng,StartTime,Station_Id," +
$"Software_Version) values('{id}','{DateTime.Now}','{stationNum}','{stationName}','{stationNameAbb}','{seisNum}','{passNum}','{latitude}','{longitude}','{elevation}','{enablingDate}','{tetworkLogo}','{softVersion}');";
DBHelper.ExecuteNonQuery(sql, 1);
App.Current.Dispatcher.Invoke(() =>
{
//通知到前端
if (id == 1)
{
if (isMain)
MainViewModel.seismometerParameterViewModel1.BackupSeisIsChecked = false;
else
MainViewModel.seismometerParameterViewModel1.BackupSeisIsChecked = true;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.StationID = stationNum;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.StationName = stationName;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.StationShortName = stationNameAbb;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.EarthQuakeCount = seisNum;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.ChannelsNo = passNum;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.WD = latitude;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.JD = longitude;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.GaoCheng = elevation;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.StartTime = enablingDate;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.Station_Id = tetworkLogo;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSet.Software_Version = softVersion;
}
else
{
if (isMain)
MainViewModel.seismometerParameterViewModel2.BackupSeisIsChecked = false;
else
MainViewModel.seismometerParameterViewModel2.BackupSeisIsChecked = true;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.StationID = stationNum;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.StationName = stationName;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.StationShortName = stationNameAbb;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.EarthQuakeCount = seisNum;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.ChannelsNo = passNum;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.WD = latitude;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.JD = longitude;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.GaoCheng = elevation;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.StartTime = enablingDate;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.Station_Id = tetworkLogo;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSet.Software_Version = softVersion;
}
});
}
catch (Exception ex)
{
string content = "地震仪台站参数解析失败," + ex.Message;
string seisDevice = isMain == true ? "主地震仪台站参数解析" : "备地震仪台站参数解析";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','{seisDevice}','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}
else if (dataRecv.Count == 2) //设置/读取台站参数应答
{
App.Current.Dispatcher.Invoke(() =>
{
string type = "";
string record = "";
if (id == 1)
{
if (MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSetIsSend) //设置
{
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSetIsReceived = true;
MainViewModel.seismometerParameterViewModel1.SeisParaMsg = "设置台站参数成功!";
MainViewModel.seismometerParameterViewModel1.timerEarthQuakeParaSet.Stop();
type = "参数设置";
record = "地震仪台站参数设置成功";
}
else
{
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaReadIsReceived = true;
MainViewModel.seismometerParameterViewModel1.SeisParaMsg = "读取台站参数成功!";
MainViewModel.seismometerParameterViewModel1.timerEarthQuakeParaRead.Stop();
type = "参数读取";
record = "地震仪台站参数读取成功";
}
MainViewModel.seismometerParameterViewModel1.SeisParaMsgVisibility = Visibility.Visible;
MainViewModel.seismometerParameterViewModel1.SeisParaMsgForeground = new SolidColorBrush(Colors.Green);
MainViewModel.seismometerParameterViewModel1.timerSeisParaMsgHidden.Start();
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaSetBtnIsEnabled = true;
MainViewModel.seismometerParameterViewModel1.EarthQuakeParaReadBtnIsEnabled = true;
}
else
{
if (MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSetIsSend) //设置
{
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSetIsReceived = true;
MainViewModel.seismometerParameterViewModel2.SeisParaMsg = "设置台站参数成功!";
MainViewModel.seismometerParameterViewModel2.timerEarthQuakeParaSet.Stop();
type = "参数设置";
record = "地震仪台站参数设置成功";
}
else
{
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaReadIsReceived = true;
MainViewModel.seismometerParameterViewModel2.SeisParaMsg = "读取台站参数成功!";
MainViewModel.seismometerParameterViewModel2.timerEarthQuakeParaRead.Stop();
type = "参数读取";
record = "地震仪台站参数读取成功";
}
MainViewModel.seismometerParameterViewModel2.SeisParaMsgVisibility = Visibility.Visible;
MainViewModel.seismometerParameterViewModel2.SeisParaMsgForeground = new SolidColorBrush(Colors.Green);
MainViewModel.seismometerParameterViewModel2.timerSeisParaMsgHidden.Start();
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaSetBtnIsEnabled = true;
MainViewModel.seismometerParameterViewModel2.EarthQuakeParaReadBtnIsEnabled = true;
}
string seisDevice = isMain == true ? "海底地震监测基站-主地震仪" : "海底地震监测基站-备地震仪";
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','{seisDevice}','{type}','{record}');";
DBHelper.ExecuteNonQuery(sql, 1);
});
}
}
else if (Tools.CompareByte(cmdRecv, new byte[] { 0xC0, 0x50 })) //启动地震计调零
{
if (dataRecv.Count != 2)
{
string content = "地震仪启动调零回复长度校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
int seisNum = BitConverter.ToInt16(new byte[] { dataRecv[1], dataRecv[0] }, 0);
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.SeisZeroSetStartIsReceived = true;
MainWindow.mainViewModel.OpenSetMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.OpenSetMsg = "调零开启成功!";
MainWindow.mainViewModel.timerOpenSetMsgHidden.Start();
MainWindow.mainViewModel.OpenSetMsgForeground = new SolidColorBrush(Colors.Green);
MainWindow.mainViewModel.timerSeisZeroSetStart.Stop();
MainWindow.mainViewModel.ImageSourceSetZero = (ImageSource)Application.Current.FindResource("DeviceOn");
MainWindow.mainViewModel.SeisZeroSetStartButtonIsEnabled = true;
MainWindow.mainViewModel.SeisZeroSetStopButtonIsEnabled = true;
});
string name = "";
if (isMain)
name = "MainSeisSetZero";
else
name = "BackupSeisSetZero";
//存储历史设置
sql = $"insert into switch_info_his(StationID,RecordTime,SwitchName,SwitchState) values('{id}','{DateTime.Now}','{name}','On');";
DBHelper.ExecuteNonQuery(sql, 1);
//存储最新设置
sql = $"update switch_info set SwitchState='On',RecordTime='{DateTime.Now}' where SwitchName='{name}' and StationID={id};";
DBHelper.ExecuteNonQuery(sql, 1);
string seisDevice = isMain == true ? "海底地震监测基站-主地震仪" : "海底地震监测基站-备地震仪";
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','{seisDevice}','系统控制','地震仪调零开启成功');";
DBHelper.ExecuteNonQuery(sql, 1);
}
else if (Tools.CompareByte(cmdRecv, new byte[] { 0xC0, 0x51 })) //停止地震计调零
{
if (dataRecv.Count != 2)
{
string content = "地震仪停止调零回复长度校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
int seisNum = BitConverter.ToInt16(new byte[] { dataRecv[1], dataRecv[0] }, 0);
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.SeisZeroSetStopIsReceived = true;
MainWindow.mainViewModel.CloseSetMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.CloseSetMsg = "调零停止成功!";
MainWindow.mainViewModel.timerCloseSetMsgHidden.Start();
MainWindow.mainViewModel.CloseSetMsgForeground = new SolidColorBrush(Colors.Green);
MainWindow.mainViewModel.timerSeisZeroSetStop.Stop();
MainWindow.mainViewModel.ImageSourceSetZero = (ImageSource)Application.Current.FindResource("DeviceOff");
MainWindow.mainViewModel.SeisZeroSetStopButtonIsEnabled = true;
MainWindow.mainViewModel.SeisZeroSetStartButtonIsEnabled = true;
});
//存储状态
string name = "";
if (isMain)
name = "MainSeisSetZero";
else
name = "BackupSeisSetZero";
//存储历史设置
sql = $"insert into switch_info_his(StationID,RecordTime,SwitchName,SwitchState) values('{id}','{DateTime.Now}','{name}','Off');";
DBHelper.ExecuteNonQuery(sql, 1);
//存储最新设置
sql = $"update switch_info set SwitchState='Off',RecordTime='{DateTime.Now}' where SwitchName='{name}' and StationID={id};";
DBHelper.ExecuteNonQuery(sql, 1);
string seisDevice = isMain == true ? "海底地震监测基站-主地震仪" : "海底地震监测基站-备地震仪";
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','{seisDevice}','系统控制','地震仪调零停止成功');";
DBHelper.ExecuteNonQuery(sql, 1);
}
else if (Tools.CompareByte(cmdRecv, new byte[] { 0xC0, 0x66 })) //运行状态信息
{
if (dataRecv.Count != 56)
{
string content = "地震仪运行状态数据长度校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
try
{
//外部供电电压
float supplyVoltage = BitConverter.ToInt16(new byte[] { dataRecv[1], dataRecv[0] }, 0) * 0.1f;
//后备电池电压
float batteryVoltage = BitConverter.ToInt16(new byte[] { dataRecv[3], dataRecv[2] }, 0) * 0.1f;
//压力
int pressure = BitConverter.ToInt16(new byte[] { dataRecv[5], dataRecv[4] }, 0);
//温度
float temperature = BitConverter.ToInt16(new byte[] { dataRecv[7], dataRecv[6] }, 0) * 0.1f;
//地震计倾斜角度
float tiltAngleSeis = BitConverter.ToInt16(new byte[] { dataRecv[9], dataRecv[8] }, 0) * 0.1f;
//OBS 倾斜角度
float tiltAngleOBS = BitConverter.ToInt16(new byte[] { dataRecv[11], dataRecv[10] }, 0) * 0.1f;
//钟差
int clockDeviation = BitConverter.ToInt16(new byte[] { dataRecv[13], dataRecv[12] }, 0);
//频差
float freDifference = BitConverter.ToInt16(new byte[] { dataRecv[15], dataRecv[14] }, 0) * 0.01f;
//CF 卡总空间
int totalSpaceCF = BitConverter.ToInt16(new byte[] { dataRecv[19], dataRecv[18], dataRecv[17], dataRecv[16] }, 0);
//CF 卡可用空间
int canUseSpaceCF = BitConverter.ToInt16(new byte[] { dataRecv[23], dataRecv[22], dataRecv[21], dataRecv[20] }, 0);
//SD1 卡总空间
int totalSpaceSD1 = BitConverter.ToInt16(new byte[] { dataRecv[27], dataRecv[26], dataRecv[25], dataRecv[24] }, 0);
//SD1 卡可用空间
int canUseSpaceSD1 = BitConverter.ToInt16(new byte[] { dataRecv[31], dataRecv[30], dataRecv[29], dataRecv[28] }, 0);
//SD2 卡总空间
int totalSpaceSD2 = BitConverter.ToInt16(new byte[] { dataRecv[35], dataRecv[34], dataRecv[33], dataRecv[32] }, 0);
//SD2 卡可用空间
int canUseSpaceSD2 = BitConverter.ToInt16(new byte[] { dataRecv[39], dataRecv[38], dataRecv[37], dataRecv[36] }, 0);
//地震计 U 零点
float zeroPointU = BitConverter.ToInt16(new byte[] { dataRecv[43], dataRecv[42], dataRecv[41], dataRecv[40] }, 0) * 0.1f;
//地震计 V 零点
float zeroPointV = BitConverter.ToInt16(new byte[] { dataRecv[47], dataRecv[46], dataRecv[45], dataRecv[44] }, 0) * 0.1f;
//地震计 W 零点
float zeroPointW = BitConverter.ToInt16(new byte[] { dataRecv[51], dataRecv[50], dataRecv[49], dataRecv[48] }, 0) * 0.1f;
//寻北角度
float northSeekingAngle = BitConverter.ToInt16(new byte[] { dataRecv[55], dataRecv[54], dataRecv[53], dataRecv[52] }, 0) * 0.1f;
//数据存储
sql = $"insert into seismograph_state(StationID,RecordTime,Out_Vol,Backup_Vol,Pre,Tem," +
$"Sei_Tilt_Angle,OBS_Tilt_Angle,Species_Dif,Frequency_Dif,CF_Total_Cap," +
$"CF_Usable_Cap,SD_Total_Cap1,SD_Usable_Cap1,SD_Total_Cap2,SD_Usable_Cap2," +
$"Sei_U_Point,Sei_V_Point,Sei_W_Point,North_Angle) values('{id}','{DateTime.Now}','{supplyVoltage}','{batteryVoltage}','{pressure}'," +
$"'{temperature}','{tiltAngleSeis}','{tiltAngleOBS}','{clockDeviation}'," +
$"'{freDifference}','{totalSpaceCF}','{canUseSpaceCF}','{totalSpaceSD1}'," +
$"'{canUseSpaceSD1}','{totalSpaceSD2}','{canUseSpaceSD2}','{zeroPointU}'," +
$"'{zeroPointV}','{zeroPointW}','{northSeekingAngle}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
catch (Exception ex)
{
string content = "地震仪状态数据解析失败," + ex.Message;
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据解析','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}
else if (Tools.CompareByte(cmdRecv, new byte[] { 0xC0, 0x90 })) //启动地震计调平
{
if (dataRecv.Count != 2)
{
string content = "地震仪启动调平回复长度校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
int seisNum = BitConverter.ToInt16(new byte[] { dataRecv[1], dataRecv[0] }, 0);
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.SeisLevelSetStartIsReceived = true;
MainWindow.mainViewModel.OpenSetMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.OpenSetMsg = "调平开启成功!";
MainWindow.mainViewModel.timerOpenSetMsgHidden.Start();
MainWindow.mainViewModel.OpenSetMsgForeground = new SolidColorBrush(Colors.Green);
MainWindow.mainViewModel.timerSeisLevelSetStart.Stop();
MainWindow.mainViewModel.ImageSourceSetLevel = (ImageSource)Application.Current.FindResource("DeviceOn");
MainWindow.mainViewModel.SeisLevelSetStartButtonIsEnabled = true;
MainWindow.mainViewModel.SeisLevelSetStopButtonIsEnabled = true;
});
//存储状态
string name = "";
if (isMain)
name = "MainSeisSetLevel";
else
name = "BackupSeisSetLevel";
//存储历史设置
sql = $"insert into switch_info_his(StationID,RecordTime,SwitchName,SwitchState) values('{id}','{DateTime.Now}','{name}','On');";
DBHelper.ExecuteNonQuery(sql, 1);
//存储最新设置
sql = $"update switch_info set SwitchState='On',RecordTime='{DateTime.Now}' where SwitchName='{name}' and StationID={id};";
DBHelper.ExecuteNonQuery(sql, 1);
string seisDevice = isMain == true ? "海底地震监测基站-主地震仪" : "海底地震监测基站-备地震仪";
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','{seisDevice}','系统控制','地震仪调平开启成功');";
DBHelper.ExecuteNonQuery(sql, 1);
}
else if (Tools.CompareByte(cmdRecv, new byte[] { 0xC0, 0x91 })) //停止地震计调平
{
if (dataRecv.Count != 2)
{
string content = "地震仪停止调平回复长度校验失败";
sql = $"insert into alarm_run_info(StationID,RecordTime,ParaName,ParaContent) values('{id}','{DateTime.Now}','地震仪数据校验','{content}');";
DBHelper.ExecuteNonQuery(sql, 1);
return;
}
int seisNum = BitConverter.ToInt16(new byte[] { dataRecv[1], dataRecv[0] }, 0);
App.Current.Dispatcher.Invoke(() =>
{
MainWindow.mainViewModel.SeisLevelSetStopIsReceived = true;
MainWindow.mainViewModel.CloseSetMsgVisibility = Visibility.Visible;
MainWindow.mainViewModel.CloseSetMsg = "调平停止成功!";
MainWindow.mainViewModel.timerCloseSetMsgHidden.Start();
MainWindow.mainViewModel.CloseSetMsgForeground = new SolidColorBrush(Colors.Green);
MainWindow.mainViewModel.timerSeisLevelSetStop.Stop();
MainWindow.mainViewModel.ImageSourceSetLevel = (ImageSource)Application.Current.FindResource("DeviceOff");
MainWindow.mainViewModel.SeisLevelSetStopButtonIsEnabled = true;
MainWindow.mainViewModel.SeisLevelSetStartButtonIsEnabled = true;
});
//存储状态
string name = "";
if (isMain)
name = "MainSeisSetLevel";
else
name = "BackupSeisSetLevel";
//存储历史设置
sql = $"insert into switch_info_his(StationID,RecordTime,SwitchName,SwitchState) values('{id}','{DateTime.Now}','{name}','Off');";
DBHelper.ExecuteNonQuery(sql, 1);
//存储最新设置
sql = $"update switch_info set SwitchState='Off',RecordTime='{DateTime.Now}' where SwitchName='{name}' and StationID={id};";
DBHelper.ExecuteNonQuery(sql, 1);
string seisDevice = isMain == true ? "海底地震监测基站-主地震仪" : "海底地震监测基站-备地震仪";
sql = $"insert into log_record(StationID,RecordTime,Device_Name,Operation_Type,Record) values('{id}','{DateTime.Now}','{seisDevice}','系统控制','地震仪调平停止成功');";
DBHelper.ExecuteNonQuery(sql, 1);
}
}
}
}
}