using Google.Protobuf.WellKnownTypes; using JiangsuEarthquake.Common; using JiangsuEarthquake.DataAccess; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace JiangsuEarthquake.Models { public class LowerComputerModel { private byte functionCode { get; set; } //功能码 private byte SensorType { get; set; } //功能码 private byte checkCodeCRC { get; set; } //校验码 private List checkByte { get; set; } = new List(); //校验码Byte private int byteLength { get; set; } private DateTime DataTime { get; set; } private float temperature { get; set; } private float humidity { get; set; } private float gestureX { get; set; } private float gestureY { get; set; } private float gestureZ { get; set; } public void ParsingData(List byteList, int id) { if (byteList.Count == 0) return; //原始数据存储 string sql = $"insert into conboxoriginaldata(StationID,RecordTime,OriginalData) values('{id}','{DateTime.Now}','{BitConverter.ToString(byteList.ToArray())}');"; DBHelper.ExecuteNonQuery(sql, 1); //校验和校验 checkByte.Clear(); //CRC校验 for (int i = 0; i < byteList.Count - 2; i++) checkByte.Add(byteList[i]); checkCodeCRC = Tools.CheckSum(checkByte.ToArray()); //CRC校验失败 if (checkCodeCRC != byteList[^1]) { //发送失败信息 if (id == 1) MainWindow.mainViewModel.serverModel1.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); else if (id == 2) MainWindow.mainViewModel.serverModel2.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); return; } functionCode = byteList[5]; //功能码 switch (functionCode) { case 0x02: //浮标端发送数据给服务器 SensorType = byteList[6]; switch (SensorType) { case 0x30: //接驳盒端其他传感器集合 byteLength = BitConverter.ToInt16(new byte[] { byteList[3], byteList[2] }, 0); if(byteLength!=106) //长度校验失败 { //发送失败信息 if (id == 1) MainWindow.mainViewModel.serverModel1.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); else if (id == 2) MainWindow.mainViewModel.serverModel2.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); } if (byteList[7] == 0x00) //数据类型(0-hex格式,1-string) { try { int timeUTC = BitConverter.ToInt32(new byte[4] { byteList[11], byteList[10], byteList[9], byteList[8] }, 0); // Unix时间戳起始时间 DateTime epoch = new DateTime(1970, 1, 1, 8, 0, 0, DateTimeKind.Utc); // 将时间戳转换为UTC时间 DataTime = epoch.AddSeconds(timeUTC); temperature = BitConverter.ToSingle(new byte[4] { byteList[15], byteList[14], byteList[13], byteList[12] }, 0); humidity = BitConverter.ToSingle(new byte[4] { byteList[19], byteList[18], byteList[17], byteList[16] }, 0); gestureX = BitConverter.ToSingle(new byte[4] { byteList[23], byteList[22], byteList[21], byteList[20] }, 0); gestureY = BitConverter.ToSingle(new byte[4] { byteList[27], byteList[26], byteList[25], byteList[24] }, 0); gestureZ = BitConverter.ToSingle(new byte[4] { byteList[31], byteList[30], byteList[29], byteList[28] }, 0); //发送成功信息 if (id == 1) MainWindow.mainViewModel.serverModel1.SendMess(ServerReplyData(byteList[5], byteList[6], 0x01).ToArray()); else if (id == 2) MainWindow.mainViewModel.serverModel2.SendMess(ServerReplyData(byteList[5], byteList[6], 0x01).ToArray()); } catch (Exception ex) { //发送失败信息 if (id == 1) MainWindow.mainViewModel.serverModel1.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); else if (id == 2) MainWindow.mainViewModel.serverModel2.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); } //数据存储 sql = $"insert into conboxenvpara(StationID,RecordTime,DataTime,JBH_Tem,JBH_Hum," + $"JBH_Attitude_x,JBH_Attitude_y,JBH_Attitude_z) values('{id}','{DateTime.Now}','{DataTime}','{temperature}','{humidity}','{gestureX}'," + $"'{gestureY}','{gestureZ}');"; DBHelper.ExecuteNonQuery(sql, 1); } break; case 0x31: //接驳盒中ADCP数据 break; } break; case 0x03: //读取状态 byteLength = BitConverter.ToInt16(new byte[] { byteList[3], byteList[2] }, 0); if (byteLength != 45) //长度校验失败 { //发送失败信息 if (id == 1) MainWindow.mainViewModel.serverModel1.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); else if (id == 2) MainWindow.mainViewModel.serverModel2.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); } try { byte bhb_dlzb = 0; //接驳盒-保护板电力载波-状态反馈 byte bhb_gdjhj = 0; //接驳盒-保护板-光电交换机-状态反馈 byte bhb_dzy1 = 0; //接驳盒-保护板-地震仪1-状态反馈 byte bhb_dzy2 = 0; //接驳盒-保护板-地震仪2-状态反馈 byte bhb_hlj = 0; //接驳盒-保护板-海流计-状态反馈 byte dzy_fkdy = 0; //地震仪-反馈电源状态 byte dzy_fkgd = 0; //地震仪-反馈供电方式 byte jbh_dlzb = 0; //接驳盒-电力载波 byte jbh_gdjhj = 0; //接驳盒-光电交换机 byte jbh_dzy1 = 0; //接驳盒-地震仪1 byte jbh_dzy2 = 0; //接驳盒-地震仪2 byte jbh_hlj = 0; //接驳盒-海流计 byte[] state1 = new byte[] { byteList[7], byteList[8], byteList[9], byteList[10] }; if (Tools.IsBitSet(state1, 32)) bhb_dlzb = 1; if (Tools.IsBitSet(state1, 31)) bhb_gdjhj = 1; if (Tools.IsBitSet(state1, 30)) bhb_dzy1 = 1; if (Tools.IsBitSet(state1, 29)) bhb_dzy2 = 1; if (Tools.IsBitSet(state1, 28)) bhb_hlj = 1; if (Tools.IsBitSet(state1, 27)) dzy_fkdy = 1; if (Tools.IsBitSet(state1, 26)) dzy_fkgd = 1; if (Tools.IsBitSet(state1, 25)) jbh_dlzb = 1; if (Tools.IsBitSet(state1, 24)) jbh_gdjhj = 1; if (Tools.IsBitSet(state1, 23)) jbh_dzy1 = 1; if (Tools.IsBitSet(state1, 22)) jbh_dzy2 = 1; if (Tools.IsBitSet(state1, 21)) jbh_hlj = 1; byte leakage = 0; byte state = 0; byte[] state2 = new byte[] { byteList[11], byteList[12], byteList[13], byteList[14] }; if (Tools.IsBitSet(state2, 32)) leakage = 1; if (Tools.IsBitSet(state2, 31)) state = 1; float voltage; //24V输出电压4-蓄电池电压 float current_dzy1; //地震仪1电流 float current_dzy2; //地震仪2电流 float current_hlj; //海流计-电流 float current_dlzb; //电力载波-电流 float voltage121; //12V输出电压1-预留 float voltage122; //12V输出电压2-预留 voltage = BitConverter.ToSingle(new byte[] { byteList[18], byteList[17], byteList[16], byteList[15] }, 0); current_dzy1 = BitConverter.ToSingle(new byte[] { byteList[22], byteList[21], byteList[20], byteList[19] }, 0); current_dzy2 = BitConverter.ToSingle(new byte[] { byteList[26], byteList[25], byteList[24], byteList[23] }, 0); current_hlj = BitConverter.ToSingle(new byte[] { byteList[30], byteList[29], byteList[28], byteList[27] }, 0); current_dlzb = BitConverter.ToSingle(new byte[] { byteList[18], byteList[17], byteList[16], byteList[15] }, 0); voltage121 = BitConverter.ToSingle(new byte[] { byteList[18], byteList[17], byteList[16], byteList[15] }, 0); voltage122 = BitConverter.ToSingle(new byte[] { byteList[18], byteList[17], byteList[16], byteList[15] }, 0); //发送成功信息 if (id == 1) MainWindow.mainViewModel.serverModel1.SendMess(ServerReplyData(byteList[5], byteList[6], 0x01).ToArray()); else if (id == 2) MainWindow.mainViewModel.serverModel2.SendMess(ServerReplyData(byteList[5], byteList[6], 0x01).ToArray()); } catch(Exception ex) { //发送失败信息 if (id == 1) MainWindow.mainViewModel.serverModel1.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); else if (id == 2) MainWindow.mainViewModel.serverModel2.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); } //数据存储 break; case 0x07: //读取时间 byteLength = BitConverter.ToInt16(new byte[] { byteList[3], byteList[2] }, 0); if (byteLength != 8) //长度校验失败 { //发送失败信息 if (id == 1) MainWindow.mainViewModel.serverModel1.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); else if (id == 2) MainWindow.mainViewModel.serverModel2.SendMess(ServerReplyData(byteList[5], byteList[6], 0x00).ToArray()); } List SendData = new List(); SendData.AddRange(new byte[2] { 0xEF, 0xFE }); //帧头(H=0xEF 0xFE) SendData.AddRange(new byte[2] { 0x00, 0x08 }); //长度(L=6)(MSH MSL)(从地址码到最后) SendData.Add(0x01); //地址码(ADDR=00) SendData.Add(0x07); //功能码(FUNC=02) TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 8, 0, 0, 0); int totalSeconds = (int)ts.TotalSeconds; string hexSeconds = totalSeconds.ToString("X2"); byte[] timeByte = Tools.HexStringToByteArray(hexSeconds); SendData.AddRange(timeByte); //UTC时间 byte checkCode = Tools.CheckSum(SendData.ToArray()); SendData.Add(checkCode); //校验 SendData.Add(0x16); //结束符(0x16) break; } } public List ServerReplyData(byte functionCode, byte sensorType, byte replyState) { List SendData = new List(); SendData.AddRange(new byte[2] { 0xEF, 0xFE }); //帧头(H=0xEF 0xFE) SendData.AddRange(new byte[2] { 0x00, 0x06 }); //长度(L=6)(MSH MSL)(从地址码到最后) SendData.Add(0x00); //地址码(ADDR=00) SendData.Add(functionCode); //功能码(FUNC=02) SendData.Add(sensorType); //类型(KIND ) SendData.Add(replyState); //接收应答(ACK:0-解析失败,1-解析成功) byte checkCode = Tools.CheckSum(SendData.ToArray()); SendData.Add(checkCode); //校验(CS = 帧头 ...+... 应答) SendData.Add(0x16); //结束符(0x16) return SendData; } } }