using HandyControl.Controls; using JiangsuEarthquake.Common; using JiangsuEarthquake.DataAccess; using JiangsuEarthquake.ViewModels; using System; 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 dataSend { get; set; } = new List(); //数据部分 private List dataRecv { get; set; } = new List(); //数据部分 private byte[] checkCode { get; set; } = new byte[2]; //从CMD到DATA结束的CRC16校验和 private List checkByte { get; set; } = new List(); //校验码Byte public byte[] CloseByte() { List sendCloseDataSeis = new List(); List checkCloseByte = new List(); 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 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]); if (!Tools.CompareByte(new byte[] { byteList[^2], byteList[^1] }, Tools.ComputeChecksum(checkCode.ToArray()))) { 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) //有空闲连接时应答 { //发送用户认证帧 cmdSend = new byte[] { 0x77, 0x00 }; lengthSend = new byte[] { 0x00, 0x04 }; string User = "Admin"; byte[] userByte = System.Text.Encoding.ASCII.GetBytes(User); byte[] userByteArray = new byte[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 = System.Text.Encoding.ASCII.GetBytes(Password); byte[] passwordByteArray = new byte[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(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) //没有空闲连接 { 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) //认证成功 { //连接成功 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) { 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 { 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) { 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 { 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 stationNameData = new List(); for (int i = 4; i < 36; i++) stationNameData.Add(dataRecv[i]); string stationName = Encoding.UTF8.GetString(stationNameData.ToArray()); //台名缩写 List stationNameAbbData = new List(); 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 enablingDateList = new List(); 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 softVersionList = new List(); 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); 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); } } } } }