diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 74bfd97..8e2a134 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,4 +1,6 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -17,6 +19,12 @@ public void Start(string deviceCode) { + //异步执行听音,不然会卡住界面 + Task.Run(delegate { StartListenAudio(deviceCode); }); + } + + private void StartListenAudio(string deviceCode) + { _waveOut.Init(_lazyWaveProvider.Value); _waveOut.Play(); @@ -56,6 +64,8 @@ _waveFileWriter.Dispose(); _waveFileWriter = null; + + _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 74bfd97..8e2a134 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,4 +1,6 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -17,6 +19,12 @@ public void Start(string deviceCode) { + //异步执行听音,不然会卡住界面 + Task.Run(delegate { StartListenAudio(deviceCode); }); + } + + private void StartListenAudio(string deviceCode) + { _waveOut.Init(_lazyWaveProvider.Value); _waveOut.Play(); @@ -56,6 +64,8 @@ _waveFileWriter.Dispose(); _waveFileWriter = null; + + _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/DataService/IAudioService.cs b/Correlator/DataService/IAudioService.cs index 7ccb4e8..74de79b 100644 --- a/Correlator/DataService/IAudioService.cs +++ b/Correlator/DataService/IAudioService.cs @@ -2,10 +2,21 @@ { public interface IAudioService { + /// + /// 开始听音 + /// + /// void Start(string deviceCode); + /// + /// 缓存听音数据 + /// + /// void Write(byte[] pcm); + /// + /// 结束听音 + /// void Stop(); } } \ No newline at end of file diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 74bfd97..8e2a134 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,4 +1,6 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -17,6 +19,12 @@ public void Start(string deviceCode) { + //异步执行听音,不然会卡住界面 + Task.Run(delegate { StartListenAudio(deviceCode); }); + } + + private void StartListenAudio(string deviceCode) + { _waveOut.Init(_lazyWaveProvider.Value); _waveOut.Play(); @@ -56,6 +64,8 @@ _waveFileWriter.Dispose(); _waveFileWriter = null; + + _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/DataService/IAudioService.cs b/Correlator/DataService/IAudioService.cs index 7ccb4e8..74de79b 100644 --- a/Correlator/DataService/IAudioService.cs +++ b/Correlator/DataService/IAudioService.cs @@ -2,10 +2,21 @@ { public interface IAudioService { + /// + /// 开始听音 + /// + /// void Start(string deviceCode); + /// + /// 缓存听音数据 + /// + /// void Write(byte[] pcm); + /// + /// 结束听音 + /// void Stop(); } } \ No newline at end of file diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index c00ab95..f25f7c5 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -43,11 +43,10 @@ var deviceIdBytes = new byte[6]; Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertBytes2String(); + var deviceId = deviceIdBytes.ConvertToString(); var pduTypeBytes = new byte[2]; Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); - var operateType = pduTypeBytes.GetOpeTypeByPdu(); var tagBytes = new byte[receiveData.Length - 18]; Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); @@ -154,12 +153,12 @@ { var lengthBuffer = new byte[2]; Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertBytes2Int(); + var length = lengthBuffer.ConvertToInt(); if (length < 12) { Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - LogHelper.Info("上传数组长度不够,丢弃数据"); + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); return null; } diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 74bfd97..8e2a134 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,4 +1,6 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -17,6 +19,12 @@ public void Start(string deviceCode) { + //异步执行听音,不然会卡住界面 + Task.Run(delegate { StartListenAudio(deviceCode); }); + } + + private void StartListenAudio(string deviceCode) + { _waveOut.Init(_lazyWaveProvider.Value); _waveOut.Play(); @@ -56,6 +64,8 @@ _waveFileWriter.Dispose(); _waveFileWriter = null; + + _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/DataService/IAudioService.cs b/Correlator/DataService/IAudioService.cs index 7ccb4e8..74de79b 100644 --- a/Correlator/DataService/IAudioService.cs +++ b/Correlator/DataService/IAudioService.cs @@ -2,10 +2,21 @@ { public interface IAudioService { + /// + /// 开始听音 + /// + /// void Start(string deviceCode); + /// + /// 缓存听音数据 + /// + /// void Write(byte[] pcm); + /// + /// 结束听音 + /// void Stop(); } } \ No newline at end of file diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index c00ab95..f25f7c5 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -43,11 +43,10 @@ var deviceIdBytes = new byte[6]; Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertBytes2String(); + var deviceId = deviceIdBytes.ConvertToString(); var pduTypeBytes = new byte[2]; Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); - var operateType = pduTypeBytes.GetOpeTypeByPdu(); var tagBytes = new byte[receiveData.Length - 18]; Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); @@ -154,12 +153,12 @@ { var lengthBuffer = new byte[2]; Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertBytes2Int(); + var length = lengthBuffer.ConvertToInt(); if (length < 12) { Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - LogHelper.Info("上传数组长度不够,丢弃数据"); + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); return null; } diff --git a/Correlator/Util/CodeUtil.cs b/Correlator/Util/CodeUtil.cs deleted file mode 100644 index cea55b7..0000000 --- a/Correlator/Util/CodeUtil.cs +++ /dev/null @@ -1,348 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; - -namespace Correlator.Util -{ - public static class CodeUtil - { - #region shao - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的高位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] HiCrcTable = - { - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 - }; - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的低位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] LoCrcTable = - { - 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, - 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, - 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, - 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, - 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, - 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, - 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, - 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, - 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, - 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, - 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, - 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, - 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, - 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, - 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, - 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 - }; - - - // ***************************************************************************** - // Design Notes: - // ----------------------------------------------------------------------------- - private static ushort QuickCrc16(string source, int startIndex, int lenght) - { - uint i = 0; - - // Initial value for the CRC - byte iHiVal = 0XFF; // high byte of CRC initialized - byte iLoVal = 0XFF; // low byte of CRC initialized - - var dst = source.Substring(startIndex, lenght); - var byteDst = String2ByteArray(dst); - var iSize = byteDst.Length; - while (iSize != 0) - { - iSize--; - // Calculate the CRC - var index = (byte)(iLoVal ^ byteDst[i++]); // will index into CRC lookup table - - iLoVal = (byte)(iHiVal ^ HiCrcTable[index]); - iHiVal = LoCrcTable[index]; - } - - return (ushort)(iHiVal << 8 | iLoVal); - } - - public static float IntStringToFloat(string data) - { - if (data.Length < 8 || data.Length > 8) - { - throw (new ApplicationException("缓存中的数据不完整!")); - } - else - { - var intBuffer = new byte[4]; - //将16进制串按字节逆序化 - for (var i = 0; i < 4; i++) - { - if ((i % 2) == 0) - intBuffer[i + 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - else - intBuffer[i - 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - } - - return BitConverter.ToSingle(intBuffer, 0); - } - } - - #endregion - - public static string CRC16_AD(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{(int)CRC16_AD(byteDst):X}"; - } - - public static uint CRC16_AD(IEnumerable source) - { - uint crc16 = 0xffff; - foreach (var t in source) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - public static string CRC16_Standard(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{CRC16_Standard(byteDst):X}"; - } - - private static int CRC16_Standard(IEnumerable source) - { - var crc16 = 0x0000; - foreach (var t in source) - { - crc16 ^= t; - for (uint j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0x8408; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static int CRC16_Modbus(IEnumerable modbusData) - { - var crc16 = 0xFFFF; - foreach (var t in modbusData) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static byte[] GetCrcByModBusData(IReadOnlyList modbusData) - { - return BitConverter.GetBytes((short)CRC16_Modbus(modbusData)); - } - - public static bool CRC16_validate(byte[] header, byte[] body) - { - var arr = BitConverter.GetBytes((short)body.Length); - var len = new[] { arr[1], arr[0] }; - var btArray = new byte[header.Length + len.Length + body.Length - 2]; - var tail = new byte[2]; - Buffer.BlockCopy(header, 0, btArray, 0, header.Length); - Buffer.BlockCopy(len, 0, btArray, header.Length, 2); - Buffer.BlockCopy(body, 0, btArray, header.Length + len.Length, body.Length - 2); - Buffer.BlockCopy(body, body.Length - 2, tail, 0, 2); - var crc = GetCrcByModBusData(btArray); - if (crc[0] != tail[0]) - { - return false; - } - - return crc[1] == tail[1]; - } - - public static byte[] Time2Bcd(string val) - { - var bt = new byte[val.Length / 2]; - for (var i = 0; i < val.Length / 2; i++) - { - var ret = int.Parse(val.Substring(i * 2, 1)) * 16 + int.Parse(val.Substring(i * 2 + 1, 1)); - bt[i] = (byte)ret; - } - - return bt; - } - - public static byte String2Bcd(string str) - { - return (byte)(int.Parse(str.Substring(0, 1)) * 16 + int.Parse(str.Substring(1, 1))); - } - - private static byte[] String2ByteArray(string str) - { - var ret = new byte[str.Length / 2]; - for (var i = 0; i < str.Length / 2; i++) - { - ret[i] = byte.Parse(str.Substring(i * 2, 2), NumberStyles.HexNumber); - } - - return ret; - } - - public static byte String2Byte(string str) - { - return byte.Parse(str, NumberStyles.HexNumber); - } - - public static DateTime String2DateTime(string str) - { - //20140911130956 - var sb = new StringBuilder(); - sb.Append("20").Append(str.Substring(0, 2)).Append("-").Append(str.Substring(2, 2)).Append("-") - .Append(str.Substring(4, 2)).Append(" ").Append(str.Substring(6, 2)).Append(":") - .Append(str.Substring(8, 2)).Append(":").Append(str.Substring(10, 2)); - return Convert.ToDateTime(sb.ToString()); - } - - //输入为初始的9个字节的头加上指定的一串byte,输出为9个字节的头加上输入的byte数组 - public static byte[] CreateBytes(byte[] header, byte[] data) - { - var setOut = new byte[data.Length + 9]; - - Array.Copy(data, 0, setOut, 9, data.Length); - - setOut[0] = 0XAA; - setOut[1] = 0X1D; - setOut[2] = header[2]; - setOut[3] = header[3]; - setOut[4] = 0X03; - setOut[5] = 0X00; - setOut[6] = BitConverter.GetBytes(data.Length)[0]; - setOut[7] = 0X00; - setOut[8] = 0X00; - - var crcIn = setOut.Aggregate("", (current, t) => current + t.ToString("X2")); - - var crcOut = QuickCrc16(crcIn, 0, crcIn.Length); - var crcOutByte = BitConverter.GetBytes(crcOut); - setOut[7] = crcOutByte[1]; - setOut[8] = crcOutByte[0]; - - return setOut; - } - - #region - - //解码数据后,加入3:4编码 - public static byte[] AdDecode(byte[] data) - { - var srcLen = data.Length; - if (srcLen % 4 != 0) - { - return null; - } - - var destLen = (data.Length / 4) * 3; - var dst = new byte[destLen]; - var j = 0; - for (var i = 0; i < data.Length / 4; i++) - { - dst[j] = (byte)((data[i * 4 + 0] & 0x3f) | (data[i * 4 + 3] << 2 & 0xc0)); - dst[j + 1] = (byte)((data[i * 4 + 1] & 0x3f) | (data[i * 4 + 3] << 4 & 0xc0)); - dst[j + 2] = (byte)((data[i * 4 + 2] & 0x3f) | (data[i * 4 + 3] << 6 & 0xc0)); - j += 3; - } - - var temp = BitConverter.ToString(dst); - var temp0 = temp.Split('-'); - var len = short.Parse((temp0[2] + temp0[3]), NumberStyles.HexNumber) + 6; - - var result = new byte[len + 2]; - for (var i = 0; i < len; i++) - { - result[i] = dst[i]; - } - - result[len] = 0x0D; - result[len + 1] = 0x0A; - return result; - } - - public static byte[] AdEncode(byte[] data) - { - var len = data.Length % 3 != 0 ? ((data.Length / 3) + 1) * 3 : data.Length; - var extentData = new byte[len]; - data.CopyTo(extentData, 0); - var dst = new byte[(len / 3) * 4 + 2]; - var j = 0; - - for (var i = 0; i < len / 3; i++) - { - dst[j + 0] = (byte)(extentData[i * 3 + 0] & 0x3f | 0x40); - dst[j + 1] = (byte)(extentData[i * 3 + 1] & 0x3f | 0x40); - dst[j + 2] = (byte)(extentData[i * 3 + 2] & 0x3f | 0x40); - dst[j + 3] = (byte)(0x40 | ((extentData[i * 3 + 0] >> 2) & 0x30) - | ((extentData[i * 3 + 1] >> 4) & 0x0c) - | ((extentData[i * 3 + 2] >> 6) & 0x03)); - j += 4; - } - - dst[dst.Length - 2] = 0x0D; - dst[dst.Length - 1] = 0x0A; - return dst; - } - - #endregion - } -} \ No newline at end of file diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 74bfd97..8e2a134 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,4 +1,6 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -17,6 +19,12 @@ public void Start(string deviceCode) { + //异步执行听音,不然会卡住界面 + Task.Run(delegate { StartListenAudio(deviceCode); }); + } + + private void StartListenAudio(string deviceCode) + { _waveOut.Init(_lazyWaveProvider.Value); _waveOut.Play(); @@ -56,6 +64,8 @@ _waveFileWriter.Dispose(); _waveFileWriter = null; + + _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/DataService/IAudioService.cs b/Correlator/DataService/IAudioService.cs index 7ccb4e8..74de79b 100644 --- a/Correlator/DataService/IAudioService.cs +++ b/Correlator/DataService/IAudioService.cs @@ -2,10 +2,21 @@ { public interface IAudioService { + /// + /// 开始听音 + /// + /// void Start(string deviceCode); + /// + /// 缓存听音数据 + /// + /// void Write(byte[] pcm); + /// + /// 结束听音 + /// void Stop(); } } \ No newline at end of file diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index c00ab95..f25f7c5 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -43,11 +43,10 @@ var deviceIdBytes = new byte[6]; Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertBytes2String(); + var deviceId = deviceIdBytes.ConvertToString(); var pduTypeBytes = new byte[2]; Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); - var operateType = pduTypeBytes.GetOpeTypeByPdu(); var tagBytes = new byte[receiveData.Length - 18]; Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); @@ -154,12 +153,12 @@ { var lengthBuffer = new byte[2]; Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertBytes2Int(); + var length = lengthBuffer.ConvertToInt(); if (length < 12) { Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - LogHelper.Info("上传数组长度不够,丢弃数据"); + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); return null; } diff --git a/Correlator/Util/CodeUtil.cs b/Correlator/Util/CodeUtil.cs deleted file mode 100644 index cea55b7..0000000 --- a/Correlator/Util/CodeUtil.cs +++ /dev/null @@ -1,348 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; - -namespace Correlator.Util -{ - public static class CodeUtil - { - #region shao - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的高位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] HiCrcTable = - { - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 - }; - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的低位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] LoCrcTable = - { - 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, - 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, - 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, - 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, - 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, - 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, - 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, - 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, - 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, - 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, - 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, - 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, - 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, - 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, - 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, - 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 - }; - - - // ***************************************************************************** - // Design Notes: - // ----------------------------------------------------------------------------- - private static ushort QuickCrc16(string source, int startIndex, int lenght) - { - uint i = 0; - - // Initial value for the CRC - byte iHiVal = 0XFF; // high byte of CRC initialized - byte iLoVal = 0XFF; // low byte of CRC initialized - - var dst = source.Substring(startIndex, lenght); - var byteDst = String2ByteArray(dst); - var iSize = byteDst.Length; - while (iSize != 0) - { - iSize--; - // Calculate the CRC - var index = (byte)(iLoVal ^ byteDst[i++]); // will index into CRC lookup table - - iLoVal = (byte)(iHiVal ^ HiCrcTable[index]); - iHiVal = LoCrcTable[index]; - } - - return (ushort)(iHiVal << 8 | iLoVal); - } - - public static float IntStringToFloat(string data) - { - if (data.Length < 8 || data.Length > 8) - { - throw (new ApplicationException("缓存中的数据不完整!")); - } - else - { - var intBuffer = new byte[4]; - //将16进制串按字节逆序化 - for (var i = 0; i < 4; i++) - { - if ((i % 2) == 0) - intBuffer[i + 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - else - intBuffer[i - 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - } - - return BitConverter.ToSingle(intBuffer, 0); - } - } - - #endregion - - public static string CRC16_AD(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{(int)CRC16_AD(byteDst):X}"; - } - - public static uint CRC16_AD(IEnumerable source) - { - uint crc16 = 0xffff; - foreach (var t in source) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - public static string CRC16_Standard(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{CRC16_Standard(byteDst):X}"; - } - - private static int CRC16_Standard(IEnumerable source) - { - var crc16 = 0x0000; - foreach (var t in source) - { - crc16 ^= t; - for (uint j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0x8408; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static int CRC16_Modbus(IEnumerable modbusData) - { - var crc16 = 0xFFFF; - foreach (var t in modbusData) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static byte[] GetCrcByModBusData(IReadOnlyList modbusData) - { - return BitConverter.GetBytes((short)CRC16_Modbus(modbusData)); - } - - public static bool CRC16_validate(byte[] header, byte[] body) - { - var arr = BitConverter.GetBytes((short)body.Length); - var len = new[] { arr[1], arr[0] }; - var btArray = new byte[header.Length + len.Length + body.Length - 2]; - var tail = new byte[2]; - Buffer.BlockCopy(header, 0, btArray, 0, header.Length); - Buffer.BlockCopy(len, 0, btArray, header.Length, 2); - Buffer.BlockCopy(body, 0, btArray, header.Length + len.Length, body.Length - 2); - Buffer.BlockCopy(body, body.Length - 2, tail, 0, 2); - var crc = GetCrcByModBusData(btArray); - if (crc[0] != tail[0]) - { - return false; - } - - return crc[1] == tail[1]; - } - - public static byte[] Time2Bcd(string val) - { - var bt = new byte[val.Length / 2]; - for (var i = 0; i < val.Length / 2; i++) - { - var ret = int.Parse(val.Substring(i * 2, 1)) * 16 + int.Parse(val.Substring(i * 2 + 1, 1)); - bt[i] = (byte)ret; - } - - return bt; - } - - public static byte String2Bcd(string str) - { - return (byte)(int.Parse(str.Substring(0, 1)) * 16 + int.Parse(str.Substring(1, 1))); - } - - private static byte[] String2ByteArray(string str) - { - var ret = new byte[str.Length / 2]; - for (var i = 0; i < str.Length / 2; i++) - { - ret[i] = byte.Parse(str.Substring(i * 2, 2), NumberStyles.HexNumber); - } - - return ret; - } - - public static byte String2Byte(string str) - { - return byte.Parse(str, NumberStyles.HexNumber); - } - - public static DateTime String2DateTime(string str) - { - //20140911130956 - var sb = new StringBuilder(); - sb.Append("20").Append(str.Substring(0, 2)).Append("-").Append(str.Substring(2, 2)).Append("-") - .Append(str.Substring(4, 2)).Append(" ").Append(str.Substring(6, 2)).Append(":") - .Append(str.Substring(8, 2)).Append(":").Append(str.Substring(10, 2)); - return Convert.ToDateTime(sb.ToString()); - } - - //输入为初始的9个字节的头加上指定的一串byte,输出为9个字节的头加上输入的byte数组 - public static byte[] CreateBytes(byte[] header, byte[] data) - { - var setOut = new byte[data.Length + 9]; - - Array.Copy(data, 0, setOut, 9, data.Length); - - setOut[0] = 0XAA; - setOut[1] = 0X1D; - setOut[2] = header[2]; - setOut[3] = header[3]; - setOut[4] = 0X03; - setOut[5] = 0X00; - setOut[6] = BitConverter.GetBytes(data.Length)[0]; - setOut[7] = 0X00; - setOut[8] = 0X00; - - var crcIn = setOut.Aggregate("", (current, t) => current + t.ToString("X2")); - - var crcOut = QuickCrc16(crcIn, 0, crcIn.Length); - var crcOutByte = BitConverter.GetBytes(crcOut); - setOut[7] = crcOutByte[1]; - setOut[8] = crcOutByte[0]; - - return setOut; - } - - #region - - //解码数据后,加入3:4编码 - public static byte[] AdDecode(byte[] data) - { - var srcLen = data.Length; - if (srcLen % 4 != 0) - { - return null; - } - - var destLen = (data.Length / 4) * 3; - var dst = new byte[destLen]; - var j = 0; - for (var i = 0; i < data.Length / 4; i++) - { - dst[j] = (byte)((data[i * 4 + 0] & 0x3f) | (data[i * 4 + 3] << 2 & 0xc0)); - dst[j + 1] = (byte)((data[i * 4 + 1] & 0x3f) | (data[i * 4 + 3] << 4 & 0xc0)); - dst[j + 2] = (byte)((data[i * 4 + 2] & 0x3f) | (data[i * 4 + 3] << 6 & 0xc0)); - j += 3; - } - - var temp = BitConverter.ToString(dst); - var temp0 = temp.Split('-'); - var len = short.Parse((temp0[2] + temp0[3]), NumberStyles.HexNumber) + 6; - - var result = new byte[len + 2]; - for (var i = 0; i < len; i++) - { - result[i] = dst[i]; - } - - result[len] = 0x0D; - result[len + 1] = 0x0A; - return result; - } - - public static byte[] AdEncode(byte[] data) - { - var len = data.Length % 3 != 0 ? ((data.Length / 3) + 1) * 3 : data.Length; - var extentData = new byte[len]; - data.CopyTo(extentData, 0); - var dst = new byte[(len / 3) * 4 + 2]; - var j = 0; - - for (var i = 0; i < len / 3; i++) - { - dst[j + 0] = (byte)(extentData[i * 3 + 0] & 0x3f | 0x40); - dst[j + 1] = (byte)(extentData[i * 3 + 1] & 0x3f | 0x40); - dst[j + 2] = (byte)(extentData[i * 3 + 2] & 0x3f | 0x40); - dst[j + 3] = (byte)(0x40 | ((extentData[i * 3 + 0] >> 2) & 0x30) - | ((extentData[i * 3 + 1] >> 4) & 0x0c) - | ((extentData[i * 3 + 2] >> 6) & 0x03)); - j += 4; - } - - dst[dst.Length - 2] = 0x0D; - dst[dst.Length - 1] = 0x0A; - return dst; - } - - #endregion - } -} \ No newline at end of file diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index 5efc675..c5dffeb 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -56,11 +56,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -102,9 +102,9 @@ byte[] btDstNode = { 0xFF, 0xFF }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -119,17 +119,18 @@ }; //获取时间(年-月-日-时-分-秒),年号-2000 - RuntimeCache.HydrophoneWakeUpTimeBytes = new[] + RuntimeCache.HydrophoneWakeUpTimestamp = new[] { - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; byte[] timeTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -147,11 +148,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -226,9 +227,9 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -245,11 +246,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -318,11 +319,11 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid - + //wrap the whole data var result = new byte[42]; result[0] = preambleByte; @@ -335,13 +336,13 @@ result[15] = btSeq; oidTag.CopyTo(result, 16); timeTag.CopyTo(result, 30); - + //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -381,9 +382,9 @@ byte[] btDstNode = { 0x22, devId }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -407,11 +408,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -461,9 +462,9 @@ btDstNode[1] = byte.Parse(dstNodeAddr.Substring(2, 2), NumberStyles.HexNumber); const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A82Weakuprequest+z噪声记录仪 + const short pdu = 2688 + operateType; var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -473,10 +474,6 @@ //第一个Tag的Oid为“0x30000001”,第二个Tag为时间戳,Oid为“0x10000051”,内容为“年、月、日、时、分、秒” byte[] oid = { 0x20, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00 }; //Tag1 - /* - byte[] sysTag = { 0x10,0x00,0x00,0x51,0x00,0x06, - CalendarHub.YEAR, CalendarHub.MON, CalendarHub.DAY, CalendarHub.HOR, CalendarHub.MIN, CalendarHub.SEC };//Tag2 - */ byte[] totalLen = { 0x00, 0x13 }; //wrap the whole data @@ -493,11 +490,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -558,7 +555,8 @@ byte[] sysTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; //Tag2 byte[] totalLen = { 0x00, 0x18 }; @@ -577,11 +575,11 @@ sysTag.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -647,11 +645,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 74bfd97..8e2a134 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,4 +1,6 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -17,6 +19,12 @@ public void Start(string deviceCode) { + //异步执行听音,不然会卡住界面 + Task.Run(delegate { StartListenAudio(deviceCode); }); + } + + private void StartListenAudio(string deviceCode) + { _waveOut.Init(_lazyWaveProvider.Value); _waveOut.Play(); @@ -56,6 +64,8 @@ _waveFileWriter.Dispose(); _waveFileWriter = null; + + _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/DataService/IAudioService.cs b/Correlator/DataService/IAudioService.cs index 7ccb4e8..74de79b 100644 --- a/Correlator/DataService/IAudioService.cs +++ b/Correlator/DataService/IAudioService.cs @@ -2,10 +2,21 @@ { public interface IAudioService { + /// + /// 开始听音 + /// + /// void Start(string deviceCode); + /// + /// 缓存听音数据 + /// + /// void Write(byte[] pcm); + /// + /// 结束听音 + /// void Stop(); } } \ No newline at end of file diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index c00ab95..f25f7c5 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -43,11 +43,10 @@ var deviceIdBytes = new byte[6]; Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertBytes2String(); + var deviceId = deviceIdBytes.ConvertToString(); var pduTypeBytes = new byte[2]; Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); - var operateType = pduTypeBytes.GetOpeTypeByPdu(); var tagBytes = new byte[receiveData.Length - 18]; Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); @@ -154,12 +153,12 @@ { var lengthBuffer = new byte[2]; Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertBytes2Int(); + var length = lengthBuffer.ConvertToInt(); if (length < 12) { Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - LogHelper.Info("上传数组长度不够,丢弃数据"); + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); return null; } diff --git a/Correlator/Util/CodeUtil.cs b/Correlator/Util/CodeUtil.cs deleted file mode 100644 index cea55b7..0000000 --- a/Correlator/Util/CodeUtil.cs +++ /dev/null @@ -1,348 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; - -namespace Correlator.Util -{ - public static class CodeUtil - { - #region shao - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的高位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] HiCrcTable = - { - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 - }; - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的低位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] LoCrcTable = - { - 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, - 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, - 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, - 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, - 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, - 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, - 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, - 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, - 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, - 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, - 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, - 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, - 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, - 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, - 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, - 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 - }; - - - // ***************************************************************************** - // Design Notes: - // ----------------------------------------------------------------------------- - private static ushort QuickCrc16(string source, int startIndex, int lenght) - { - uint i = 0; - - // Initial value for the CRC - byte iHiVal = 0XFF; // high byte of CRC initialized - byte iLoVal = 0XFF; // low byte of CRC initialized - - var dst = source.Substring(startIndex, lenght); - var byteDst = String2ByteArray(dst); - var iSize = byteDst.Length; - while (iSize != 0) - { - iSize--; - // Calculate the CRC - var index = (byte)(iLoVal ^ byteDst[i++]); // will index into CRC lookup table - - iLoVal = (byte)(iHiVal ^ HiCrcTable[index]); - iHiVal = LoCrcTable[index]; - } - - return (ushort)(iHiVal << 8 | iLoVal); - } - - public static float IntStringToFloat(string data) - { - if (data.Length < 8 || data.Length > 8) - { - throw (new ApplicationException("缓存中的数据不完整!")); - } - else - { - var intBuffer = new byte[4]; - //将16进制串按字节逆序化 - for (var i = 0; i < 4; i++) - { - if ((i % 2) == 0) - intBuffer[i + 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - else - intBuffer[i - 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - } - - return BitConverter.ToSingle(intBuffer, 0); - } - } - - #endregion - - public static string CRC16_AD(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{(int)CRC16_AD(byteDst):X}"; - } - - public static uint CRC16_AD(IEnumerable source) - { - uint crc16 = 0xffff; - foreach (var t in source) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - public static string CRC16_Standard(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{CRC16_Standard(byteDst):X}"; - } - - private static int CRC16_Standard(IEnumerable source) - { - var crc16 = 0x0000; - foreach (var t in source) - { - crc16 ^= t; - for (uint j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0x8408; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static int CRC16_Modbus(IEnumerable modbusData) - { - var crc16 = 0xFFFF; - foreach (var t in modbusData) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static byte[] GetCrcByModBusData(IReadOnlyList modbusData) - { - return BitConverter.GetBytes((short)CRC16_Modbus(modbusData)); - } - - public static bool CRC16_validate(byte[] header, byte[] body) - { - var arr = BitConverter.GetBytes((short)body.Length); - var len = new[] { arr[1], arr[0] }; - var btArray = new byte[header.Length + len.Length + body.Length - 2]; - var tail = new byte[2]; - Buffer.BlockCopy(header, 0, btArray, 0, header.Length); - Buffer.BlockCopy(len, 0, btArray, header.Length, 2); - Buffer.BlockCopy(body, 0, btArray, header.Length + len.Length, body.Length - 2); - Buffer.BlockCopy(body, body.Length - 2, tail, 0, 2); - var crc = GetCrcByModBusData(btArray); - if (crc[0] != tail[0]) - { - return false; - } - - return crc[1] == tail[1]; - } - - public static byte[] Time2Bcd(string val) - { - var bt = new byte[val.Length / 2]; - for (var i = 0; i < val.Length / 2; i++) - { - var ret = int.Parse(val.Substring(i * 2, 1)) * 16 + int.Parse(val.Substring(i * 2 + 1, 1)); - bt[i] = (byte)ret; - } - - return bt; - } - - public static byte String2Bcd(string str) - { - return (byte)(int.Parse(str.Substring(0, 1)) * 16 + int.Parse(str.Substring(1, 1))); - } - - private static byte[] String2ByteArray(string str) - { - var ret = new byte[str.Length / 2]; - for (var i = 0; i < str.Length / 2; i++) - { - ret[i] = byte.Parse(str.Substring(i * 2, 2), NumberStyles.HexNumber); - } - - return ret; - } - - public static byte String2Byte(string str) - { - return byte.Parse(str, NumberStyles.HexNumber); - } - - public static DateTime String2DateTime(string str) - { - //20140911130956 - var sb = new StringBuilder(); - sb.Append("20").Append(str.Substring(0, 2)).Append("-").Append(str.Substring(2, 2)).Append("-") - .Append(str.Substring(4, 2)).Append(" ").Append(str.Substring(6, 2)).Append(":") - .Append(str.Substring(8, 2)).Append(":").Append(str.Substring(10, 2)); - return Convert.ToDateTime(sb.ToString()); - } - - //输入为初始的9个字节的头加上指定的一串byte,输出为9个字节的头加上输入的byte数组 - public static byte[] CreateBytes(byte[] header, byte[] data) - { - var setOut = new byte[data.Length + 9]; - - Array.Copy(data, 0, setOut, 9, data.Length); - - setOut[0] = 0XAA; - setOut[1] = 0X1D; - setOut[2] = header[2]; - setOut[3] = header[3]; - setOut[4] = 0X03; - setOut[5] = 0X00; - setOut[6] = BitConverter.GetBytes(data.Length)[0]; - setOut[7] = 0X00; - setOut[8] = 0X00; - - var crcIn = setOut.Aggregate("", (current, t) => current + t.ToString("X2")); - - var crcOut = QuickCrc16(crcIn, 0, crcIn.Length); - var crcOutByte = BitConverter.GetBytes(crcOut); - setOut[7] = crcOutByte[1]; - setOut[8] = crcOutByte[0]; - - return setOut; - } - - #region - - //解码数据后,加入3:4编码 - public static byte[] AdDecode(byte[] data) - { - var srcLen = data.Length; - if (srcLen % 4 != 0) - { - return null; - } - - var destLen = (data.Length / 4) * 3; - var dst = new byte[destLen]; - var j = 0; - for (var i = 0; i < data.Length / 4; i++) - { - dst[j] = (byte)((data[i * 4 + 0] & 0x3f) | (data[i * 4 + 3] << 2 & 0xc0)); - dst[j + 1] = (byte)((data[i * 4 + 1] & 0x3f) | (data[i * 4 + 3] << 4 & 0xc0)); - dst[j + 2] = (byte)((data[i * 4 + 2] & 0x3f) | (data[i * 4 + 3] << 6 & 0xc0)); - j += 3; - } - - var temp = BitConverter.ToString(dst); - var temp0 = temp.Split('-'); - var len = short.Parse((temp0[2] + temp0[3]), NumberStyles.HexNumber) + 6; - - var result = new byte[len + 2]; - for (var i = 0; i < len; i++) - { - result[i] = dst[i]; - } - - result[len] = 0x0D; - result[len + 1] = 0x0A; - return result; - } - - public static byte[] AdEncode(byte[] data) - { - var len = data.Length % 3 != 0 ? ((data.Length / 3) + 1) * 3 : data.Length; - var extentData = new byte[len]; - data.CopyTo(extentData, 0); - var dst = new byte[(len / 3) * 4 + 2]; - var j = 0; - - for (var i = 0; i < len / 3; i++) - { - dst[j + 0] = (byte)(extentData[i * 3 + 0] & 0x3f | 0x40); - dst[j + 1] = (byte)(extentData[i * 3 + 1] & 0x3f | 0x40); - dst[j + 2] = (byte)(extentData[i * 3 + 2] & 0x3f | 0x40); - dst[j + 3] = (byte)(0x40 | ((extentData[i * 3 + 0] >> 2) & 0x30) - | ((extentData[i * 3 + 1] >> 4) & 0x0c) - | ((extentData[i * 3 + 2] >> 6) & 0x03)); - j += 4; - } - - dst[dst.Length - 2] = 0x0D; - dst[dst.Length - 1] = 0x0A; - return dst; - } - - #endregion - } -} \ No newline at end of file diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index 5efc675..c5dffeb 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -56,11 +56,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -102,9 +102,9 @@ byte[] btDstNode = { 0xFF, 0xFF }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -119,17 +119,18 @@ }; //获取时间(年-月-日-时-分-秒),年号-2000 - RuntimeCache.HydrophoneWakeUpTimeBytes = new[] + RuntimeCache.HydrophoneWakeUpTimestamp = new[] { - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; byte[] timeTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -147,11 +148,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -226,9 +227,9 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -245,11 +246,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -318,11 +319,11 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid - + //wrap the whole data var result = new byte[42]; result[0] = preambleByte; @@ -335,13 +336,13 @@ result[15] = btSeq; oidTag.CopyTo(result, 16); timeTag.CopyTo(result, 30); - + //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -381,9 +382,9 @@ byte[] btDstNode = { 0x22, devId }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -407,11 +408,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -461,9 +462,9 @@ btDstNode[1] = byte.Parse(dstNodeAddr.Substring(2, 2), NumberStyles.HexNumber); const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A82Weakuprequest+z噪声记录仪 + const short pdu = 2688 + operateType; var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -473,10 +474,6 @@ //第一个Tag的Oid为“0x30000001”,第二个Tag为时间戳,Oid为“0x10000051”,内容为“年、月、日、时、分、秒” byte[] oid = { 0x20, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00 }; //Tag1 - /* - byte[] sysTag = { 0x10,0x00,0x00,0x51,0x00,0x06, - CalendarHub.YEAR, CalendarHub.MON, CalendarHub.DAY, CalendarHub.HOR, CalendarHub.MIN, CalendarHub.SEC };//Tag2 - */ byte[] totalLen = { 0x00, 0x13 }; //wrap the whole data @@ -493,11 +490,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -558,7 +555,8 @@ byte[] sysTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; //Tag2 byte[] totalLen = { 0x00, 0x18 }; @@ -577,11 +575,11 @@ sysTag.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -647,11 +645,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; diff --git a/Correlator/Util/CrcCodeHub.cs b/Correlator/Util/CrcCodeHub.cs new file mode 100644 index 0000000..c3933df --- /dev/null +++ b/Correlator/Util/CrcCodeHub.cs @@ -0,0 +1,75 @@ +namespace Correlator.Util +{ + public static class CrcCodeHub + { + #region CRC-16校验的高位字节表 + + private static readonly byte[] HiCrcTable = + { + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 + }; + + #endregion + + #region CRC-16校验的低位字节表 + + private static readonly byte[] LoCrcTable = + { + 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, + 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, + 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, + 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, + 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, + 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, + 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, + 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, + 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, + 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, + 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, + 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, + 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, + 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, + 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, + 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 + }; + + #endregion + + public static uint GenerateCrc16Code(byte[] source) + { + uint crc16 = 0xFFFF; + foreach (var t in source) + { + crc16 ^= t; + for (var j = 0; j < 8; j++) + { + if ((crc16 & 0x01) == 1) + { + crc16 = (crc16 >> 1) ^ 0xA001; + } + else + { + crc16 >>= 1; + } + } + } + + return crc16; + } + } +} \ No newline at end of file diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 74bfd97..8e2a134 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,4 +1,6 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -17,6 +19,12 @@ public void Start(string deviceCode) { + //异步执行听音,不然会卡住界面 + Task.Run(delegate { StartListenAudio(deviceCode); }); + } + + private void StartListenAudio(string deviceCode) + { _waveOut.Init(_lazyWaveProvider.Value); _waveOut.Play(); @@ -56,6 +64,8 @@ _waveFileWriter.Dispose(); _waveFileWriter = null; + + _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/DataService/IAudioService.cs b/Correlator/DataService/IAudioService.cs index 7ccb4e8..74de79b 100644 --- a/Correlator/DataService/IAudioService.cs +++ b/Correlator/DataService/IAudioService.cs @@ -2,10 +2,21 @@ { public interface IAudioService { + /// + /// 开始听音 + /// + /// void Start(string deviceCode); + /// + /// 缓存听音数据 + /// + /// void Write(byte[] pcm); + /// + /// 结束听音 + /// void Stop(); } } \ No newline at end of file diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index c00ab95..f25f7c5 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -43,11 +43,10 @@ var deviceIdBytes = new byte[6]; Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertBytes2String(); + var deviceId = deviceIdBytes.ConvertToString(); var pduTypeBytes = new byte[2]; Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); - var operateType = pduTypeBytes.GetOpeTypeByPdu(); var tagBytes = new byte[receiveData.Length - 18]; Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); @@ -154,12 +153,12 @@ { var lengthBuffer = new byte[2]; Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertBytes2Int(); + var length = lengthBuffer.ConvertToInt(); if (length < 12) { Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - LogHelper.Info("上传数组长度不够,丢弃数据"); + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); return null; } diff --git a/Correlator/Util/CodeUtil.cs b/Correlator/Util/CodeUtil.cs deleted file mode 100644 index cea55b7..0000000 --- a/Correlator/Util/CodeUtil.cs +++ /dev/null @@ -1,348 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; - -namespace Correlator.Util -{ - public static class CodeUtil - { - #region shao - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的高位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] HiCrcTable = - { - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 - }; - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的低位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] LoCrcTable = - { - 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, - 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, - 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, - 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, - 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, - 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, - 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, - 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, - 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, - 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, - 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, - 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, - 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, - 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, - 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, - 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 - }; - - - // ***************************************************************************** - // Design Notes: - // ----------------------------------------------------------------------------- - private static ushort QuickCrc16(string source, int startIndex, int lenght) - { - uint i = 0; - - // Initial value for the CRC - byte iHiVal = 0XFF; // high byte of CRC initialized - byte iLoVal = 0XFF; // low byte of CRC initialized - - var dst = source.Substring(startIndex, lenght); - var byteDst = String2ByteArray(dst); - var iSize = byteDst.Length; - while (iSize != 0) - { - iSize--; - // Calculate the CRC - var index = (byte)(iLoVal ^ byteDst[i++]); // will index into CRC lookup table - - iLoVal = (byte)(iHiVal ^ HiCrcTable[index]); - iHiVal = LoCrcTable[index]; - } - - return (ushort)(iHiVal << 8 | iLoVal); - } - - public static float IntStringToFloat(string data) - { - if (data.Length < 8 || data.Length > 8) - { - throw (new ApplicationException("缓存中的数据不完整!")); - } - else - { - var intBuffer = new byte[4]; - //将16进制串按字节逆序化 - for (var i = 0; i < 4; i++) - { - if ((i % 2) == 0) - intBuffer[i + 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - else - intBuffer[i - 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - } - - return BitConverter.ToSingle(intBuffer, 0); - } - } - - #endregion - - public static string CRC16_AD(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{(int)CRC16_AD(byteDst):X}"; - } - - public static uint CRC16_AD(IEnumerable source) - { - uint crc16 = 0xffff; - foreach (var t in source) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - public static string CRC16_Standard(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{CRC16_Standard(byteDst):X}"; - } - - private static int CRC16_Standard(IEnumerable source) - { - var crc16 = 0x0000; - foreach (var t in source) - { - crc16 ^= t; - for (uint j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0x8408; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static int CRC16_Modbus(IEnumerable modbusData) - { - var crc16 = 0xFFFF; - foreach (var t in modbusData) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static byte[] GetCrcByModBusData(IReadOnlyList modbusData) - { - return BitConverter.GetBytes((short)CRC16_Modbus(modbusData)); - } - - public static bool CRC16_validate(byte[] header, byte[] body) - { - var arr = BitConverter.GetBytes((short)body.Length); - var len = new[] { arr[1], arr[0] }; - var btArray = new byte[header.Length + len.Length + body.Length - 2]; - var tail = new byte[2]; - Buffer.BlockCopy(header, 0, btArray, 0, header.Length); - Buffer.BlockCopy(len, 0, btArray, header.Length, 2); - Buffer.BlockCopy(body, 0, btArray, header.Length + len.Length, body.Length - 2); - Buffer.BlockCopy(body, body.Length - 2, tail, 0, 2); - var crc = GetCrcByModBusData(btArray); - if (crc[0] != tail[0]) - { - return false; - } - - return crc[1] == tail[1]; - } - - public static byte[] Time2Bcd(string val) - { - var bt = new byte[val.Length / 2]; - for (var i = 0; i < val.Length / 2; i++) - { - var ret = int.Parse(val.Substring(i * 2, 1)) * 16 + int.Parse(val.Substring(i * 2 + 1, 1)); - bt[i] = (byte)ret; - } - - return bt; - } - - public static byte String2Bcd(string str) - { - return (byte)(int.Parse(str.Substring(0, 1)) * 16 + int.Parse(str.Substring(1, 1))); - } - - private static byte[] String2ByteArray(string str) - { - var ret = new byte[str.Length / 2]; - for (var i = 0; i < str.Length / 2; i++) - { - ret[i] = byte.Parse(str.Substring(i * 2, 2), NumberStyles.HexNumber); - } - - return ret; - } - - public static byte String2Byte(string str) - { - return byte.Parse(str, NumberStyles.HexNumber); - } - - public static DateTime String2DateTime(string str) - { - //20140911130956 - var sb = new StringBuilder(); - sb.Append("20").Append(str.Substring(0, 2)).Append("-").Append(str.Substring(2, 2)).Append("-") - .Append(str.Substring(4, 2)).Append(" ").Append(str.Substring(6, 2)).Append(":") - .Append(str.Substring(8, 2)).Append(":").Append(str.Substring(10, 2)); - return Convert.ToDateTime(sb.ToString()); - } - - //输入为初始的9个字节的头加上指定的一串byte,输出为9个字节的头加上输入的byte数组 - public static byte[] CreateBytes(byte[] header, byte[] data) - { - var setOut = new byte[data.Length + 9]; - - Array.Copy(data, 0, setOut, 9, data.Length); - - setOut[0] = 0XAA; - setOut[1] = 0X1D; - setOut[2] = header[2]; - setOut[3] = header[3]; - setOut[4] = 0X03; - setOut[5] = 0X00; - setOut[6] = BitConverter.GetBytes(data.Length)[0]; - setOut[7] = 0X00; - setOut[8] = 0X00; - - var crcIn = setOut.Aggregate("", (current, t) => current + t.ToString("X2")); - - var crcOut = QuickCrc16(crcIn, 0, crcIn.Length); - var crcOutByte = BitConverter.GetBytes(crcOut); - setOut[7] = crcOutByte[1]; - setOut[8] = crcOutByte[0]; - - return setOut; - } - - #region - - //解码数据后,加入3:4编码 - public static byte[] AdDecode(byte[] data) - { - var srcLen = data.Length; - if (srcLen % 4 != 0) - { - return null; - } - - var destLen = (data.Length / 4) * 3; - var dst = new byte[destLen]; - var j = 0; - for (var i = 0; i < data.Length / 4; i++) - { - dst[j] = (byte)((data[i * 4 + 0] & 0x3f) | (data[i * 4 + 3] << 2 & 0xc0)); - dst[j + 1] = (byte)((data[i * 4 + 1] & 0x3f) | (data[i * 4 + 3] << 4 & 0xc0)); - dst[j + 2] = (byte)((data[i * 4 + 2] & 0x3f) | (data[i * 4 + 3] << 6 & 0xc0)); - j += 3; - } - - var temp = BitConverter.ToString(dst); - var temp0 = temp.Split('-'); - var len = short.Parse((temp0[2] + temp0[3]), NumberStyles.HexNumber) + 6; - - var result = new byte[len + 2]; - for (var i = 0; i < len; i++) - { - result[i] = dst[i]; - } - - result[len] = 0x0D; - result[len + 1] = 0x0A; - return result; - } - - public static byte[] AdEncode(byte[] data) - { - var len = data.Length % 3 != 0 ? ((data.Length / 3) + 1) * 3 : data.Length; - var extentData = new byte[len]; - data.CopyTo(extentData, 0); - var dst = new byte[(len / 3) * 4 + 2]; - var j = 0; - - for (var i = 0; i < len / 3; i++) - { - dst[j + 0] = (byte)(extentData[i * 3 + 0] & 0x3f | 0x40); - dst[j + 1] = (byte)(extentData[i * 3 + 1] & 0x3f | 0x40); - dst[j + 2] = (byte)(extentData[i * 3 + 2] & 0x3f | 0x40); - dst[j + 3] = (byte)(0x40 | ((extentData[i * 3 + 0] >> 2) & 0x30) - | ((extentData[i * 3 + 1] >> 4) & 0x0c) - | ((extentData[i * 3 + 2] >> 6) & 0x03)); - j += 4; - } - - dst[dst.Length - 2] = 0x0D; - dst[dst.Length - 1] = 0x0A; - return dst; - } - - #endregion - } -} \ No newline at end of file diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index 5efc675..c5dffeb 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -56,11 +56,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -102,9 +102,9 @@ byte[] btDstNode = { 0xFF, 0xFF }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -119,17 +119,18 @@ }; //获取时间(年-月-日-时-分-秒),年号-2000 - RuntimeCache.HydrophoneWakeUpTimeBytes = new[] + RuntimeCache.HydrophoneWakeUpTimestamp = new[] { - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; byte[] timeTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -147,11 +148,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -226,9 +227,9 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -245,11 +246,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -318,11 +319,11 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid - + //wrap the whole data var result = new byte[42]; result[0] = preambleByte; @@ -335,13 +336,13 @@ result[15] = btSeq; oidTag.CopyTo(result, 16); timeTag.CopyTo(result, 30); - + //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -381,9 +382,9 @@ byte[] btDstNode = { 0x22, devId }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -407,11 +408,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -461,9 +462,9 @@ btDstNode[1] = byte.Parse(dstNodeAddr.Substring(2, 2), NumberStyles.HexNumber); const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A82Weakuprequest+z噪声记录仪 + const short pdu = 2688 + operateType; var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -473,10 +474,6 @@ //第一个Tag的Oid为“0x30000001”,第二个Tag为时间戳,Oid为“0x10000051”,内容为“年、月、日、时、分、秒” byte[] oid = { 0x20, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00 }; //Tag1 - /* - byte[] sysTag = { 0x10,0x00,0x00,0x51,0x00,0x06, - CalendarHub.YEAR, CalendarHub.MON, CalendarHub.DAY, CalendarHub.HOR, CalendarHub.MIN, CalendarHub.SEC };//Tag2 - */ byte[] totalLen = { 0x00, 0x13 }; //wrap the whole data @@ -493,11 +490,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -558,7 +555,8 @@ byte[] sysTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; //Tag2 byte[] totalLen = { 0x00, 0x18 }; @@ -577,11 +575,11 @@ sysTag.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -647,11 +645,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; diff --git a/Correlator/Util/CrcCodeHub.cs b/Correlator/Util/CrcCodeHub.cs new file mode 100644 index 0000000..c3933df --- /dev/null +++ b/Correlator/Util/CrcCodeHub.cs @@ -0,0 +1,75 @@ +namespace Correlator.Util +{ + public static class CrcCodeHub + { + #region CRC-16校验的高位字节表 + + private static readonly byte[] HiCrcTable = + { + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 + }; + + #endregion + + #region CRC-16校验的低位字节表 + + private static readonly byte[] LoCrcTable = + { + 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, + 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, + 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, + 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, + 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, + 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, + 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, + 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, + 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, + 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, + 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, + 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, + 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, + 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, + 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, + 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 + }; + + #endregion + + public static uint GenerateCrc16Code(byte[] source) + { + uint crc16 = 0xFFFF; + foreach (var t in source) + { + crc16 ^= t; + for (var j = 0; j < 8; j++) + { + if ((crc16 & 0x01) == 1) + { + crc16 = (crc16 >> 1) ^ 0xA001; + } + else + { + crc16 >>= 1; + } + } + } + + return crc16; + } + } +} \ No newline at end of file diff --git a/Correlator/Util/LogWithConsole.cs b/Correlator/Util/LogWithConsole.cs deleted file mode 100644 index bc42276..0000000 --- a/Correlator/Util/LogWithConsole.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace Correlator.Util -{ - public static class LogWithConsole - { - /// - /// Log本地化,并输出在Console,便于Debug - /// - /// - /// - public static void WriteLog(this string className, string log) - { - LogHelper.Info(log); - Console.WriteLine($@"{className} => {log}"); - } - } -} \ No newline at end of file diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 74bfd97..8e2a134 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,4 +1,6 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -17,6 +19,12 @@ public void Start(string deviceCode) { + //异步执行听音,不然会卡住界面 + Task.Run(delegate { StartListenAudio(deviceCode); }); + } + + private void StartListenAudio(string deviceCode) + { _waveOut.Init(_lazyWaveProvider.Value); _waveOut.Play(); @@ -56,6 +64,8 @@ _waveFileWriter.Dispose(); _waveFileWriter = null; + + _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/DataService/IAudioService.cs b/Correlator/DataService/IAudioService.cs index 7ccb4e8..74de79b 100644 --- a/Correlator/DataService/IAudioService.cs +++ b/Correlator/DataService/IAudioService.cs @@ -2,10 +2,21 @@ { public interface IAudioService { + /// + /// 开始听音 + /// + /// void Start(string deviceCode); + /// + /// 缓存听音数据 + /// + /// void Write(byte[] pcm); + /// + /// 结束听音 + /// void Stop(); } } \ No newline at end of file diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index c00ab95..f25f7c5 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -43,11 +43,10 @@ var deviceIdBytes = new byte[6]; Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertBytes2String(); + var deviceId = deviceIdBytes.ConvertToString(); var pduTypeBytes = new byte[2]; Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); - var operateType = pduTypeBytes.GetOpeTypeByPdu(); var tagBytes = new byte[receiveData.Length - 18]; Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); @@ -154,12 +153,12 @@ { var lengthBuffer = new byte[2]; Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertBytes2Int(); + var length = lengthBuffer.ConvertToInt(); if (length < 12) { Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - LogHelper.Info("上传数组长度不够,丢弃数据"); + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); return null; } diff --git a/Correlator/Util/CodeUtil.cs b/Correlator/Util/CodeUtil.cs deleted file mode 100644 index cea55b7..0000000 --- a/Correlator/Util/CodeUtil.cs +++ /dev/null @@ -1,348 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; - -namespace Correlator.Util -{ - public static class CodeUtil - { - #region shao - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的高位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] HiCrcTable = - { - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 - }; - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的低位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] LoCrcTable = - { - 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, - 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, - 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, - 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, - 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, - 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, - 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, - 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, - 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, - 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, - 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, - 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, - 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, - 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, - 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, - 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 - }; - - - // ***************************************************************************** - // Design Notes: - // ----------------------------------------------------------------------------- - private static ushort QuickCrc16(string source, int startIndex, int lenght) - { - uint i = 0; - - // Initial value for the CRC - byte iHiVal = 0XFF; // high byte of CRC initialized - byte iLoVal = 0XFF; // low byte of CRC initialized - - var dst = source.Substring(startIndex, lenght); - var byteDst = String2ByteArray(dst); - var iSize = byteDst.Length; - while (iSize != 0) - { - iSize--; - // Calculate the CRC - var index = (byte)(iLoVal ^ byteDst[i++]); // will index into CRC lookup table - - iLoVal = (byte)(iHiVal ^ HiCrcTable[index]); - iHiVal = LoCrcTable[index]; - } - - return (ushort)(iHiVal << 8 | iLoVal); - } - - public static float IntStringToFloat(string data) - { - if (data.Length < 8 || data.Length > 8) - { - throw (new ApplicationException("缓存中的数据不完整!")); - } - else - { - var intBuffer = new byte[4]; - //将16进制串按字节逆序化 - for (var i = 0; i < 4; i++) - { - if ((i % 2) == 0) - intBuffer[i + 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - else - intBuffer[i - 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - } - - return BitConverter.ToSingle(intBuffer, 0); - } - } - - #endregion - - public static string CRC16_AD(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{(int)CRC16_AD(byteDst):X}"; - } - - public static uint CRC16_AD(IEnumerable source) - { - uint crc16 = 0xffff; - foreach (var t in source) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - public static string CRC16_Standard(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{CRC16_Standard(byteDst):X}"; - } - - private static int CRC16_Standard(IEnumerable source) - { - var crc16 = 0x0000; - foreach (var t in source) - { - crc16 ^= t; - for (uint j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0x8408; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static int CRC16_Modbus(IEnumerable modbusData) - { - var crc16 = 0xFFFF; - foreach (var t in modbusData) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static byte[] GetCrcByModBusData(IReadOnlyList modbusData) - { - return BitConverter.GetBytes((short)CRC16_Modbus(modbusData)); - } - - public static bool CRC16_validate(byte[] header, byte[] body) - { - var arr = BitConverter.GetBytes((short)body.Length); - var len = new[] { arr[1], arr[0] }; - var btArray = new byte[header.Length + len.Length + body.Length - 2]; - var tail = new byte[2]; - Buffer.BlockCopy(header, 0, btArray, 0, header.Length); - Buffer.BlockCopy(len, 0, btArray, header.Length, 2); - Buffer.BlockCopy(body, 0, btArray, header.Length + len.Length, body.Length - 2); - Buffer.BlockCopy(body, body.Length - 2, tail, 0, 2); - var crc = GetCrcByModBusData(btArray); - if (crc[0] != tail[0]) - { - return false; - } - - return crc[1] == tail[1]; - } - - public static byte[] Time2Bcd(string val) - { - var bt = new byte[val.Length / 2]; - for (var i = 0; i < val.Length / 2; i++) - { - var ret = int.Parse(val.Substring(i * 2, 1)) * 16 + int.Parse(val.Substring(i * 2 + 1, 1)); - bt[i] = (byte)ret; - } - - return bt; - } - - public static byte String2Bcd(string str) - { - return (byte)(int.Parse(str.Substring(0, 1)) * 16 + int.Parse(str.Substring(1, 1))); - } - - private static byte[] String2ByteArray(string str) - { - var ret = new byte[str.Length / 2]; - for (var i = 0; i < str.Length / 2; i++) - { - ret[i] = byte.Parse(str.Substring(i * 2, 2), NumberStyles.HexNumber); - } - - return ret; - } - - public static byte String2Byte(string str) - { - return byte.Parse(str, NumberStyles.HexNumber); - } - - public static DateTime String2DateTime(string str) - { - //20140911130956 - var sb = new StringBuilder(); - sb.Append("20").Append(str.Substring(0, 2)).Append("-").Append(str.Substring(2, 2)).Append("-") - .Append(str.Substring(4, 2)).Append(" ").Append(str.Substring(6, 2)).Append(":") - .Append(str.Substring(8, 2)).Append(":").Append(str.Substring(10, 2)); - return Convert.ToDateTime(sb.ToString()); - } - - //输入为初始的9个字节的头加上指定的一串byte,输出为9个字节的头加上输入的byte数组 - public static byte[] CreateBytes(byte[] header, byte[] data) - { - var setOut = new byte[data.Length + 9]; - - Array.Copy(data, 0, setOut, 9, data.Length); - - setOut[0] = 0XAA; - setOut[1] = 0X1D; - setOut[2] = header[2]; - setOut[3] = header[3]; - setOut[4] = 0X03; - setOut[5] = 0X00; - setOut[6] = BitConverter.GetBytes(data.Length)[0]; - setOut[7] = 0X00; - setOut[8] = 0X00; - - var crcIn = setOut.Aggregate("", (current, t) => current + t.ToString("X2")); - - var crcOut = QuickCrc16(crcIn, 0, crcIn.Length); - var crcOutByte = BitConverter.GetBytes(crcOut); - setOut[7] = crcOutByte[1]; - setOut[8] = crcOutByte[0]; - - return setOut; - } - - #region - - //解码数据后,加入3:4编码 - public static byte[] AdDecode(byte[] data) - { - var srcLen = data.Length; - if (srcLen % 4 != 0) - { - return null; - } - - var destLen = (data.Length / 4) * 3; - var dst = new byte[destLen]; - var j = 0; - for (var i = 0; i < data.Length / 4; i++) - { - dst[j] = (byte)((data[i * 4 + 0] & 0x3f) | (data[i * 4 + 3] << 2 & 0xc0)); - dst[j + 1] = (byte)((data[i * 4 + 1] & 0x3f) | (data[i * 4 + 3] << 4 & 0xc0)); - dst[j + 2] = (byte)((data[i * 4 + 2] & 0x3f) | (data[i * 4 + 3] << 6 & 0xc0)); - j += 3; - } - - var temp = BitConverter.ToString(dst); - var temp0 = temp.Split('-'); - var len = short.Parse((temp0[2] + temp0[3]), NumberStyles.HexNumber) + 6; - - var result = new byte[len + 2]; - for (var i = 0; i < len; i++) - { - result[i] = dst[i]; - } - - result[len] = 0x0D; - result[len + 1] = 0x0A; - return result; - } - - public static byte[] AdEncode(byte[] data) - { - var len = data.Length % 3 != 0 ? ((data.Length / 3) + 1) * 3 : data.Length; - var extentData = new byte[len]; - data.CopyTo(extentData, 0); - var dst = new byte[(len / 3) * 4 + 2]; - var j = 0; - - for (var i = 0; i < len / 3; i++) - { - dst[j + 0] = (byte)(extentData[i * 3 + 0] & 0x3f | 0x40); - dst[j + 1] = (byte)(extentData[i * 3 + 1] & 0x3f | 0x40); - dst[j + 2] = (byte)(extentData[i * 3 + 2] & 0x3f | 0x40); - dst[j + 3] = (byte)(0x40 | ((extentData[i * 3 + 0] >> 2) & 0x30) - | ((extentData[i * 3 + 1] >> 4) & 0x0c) - | ((extentData[i * 3 + 2] >> 6) & 0x03)); - j += 4; - } - - dst[dst.Length - 2] = 0x0D; - dst[dst.Length - 1] = 0x0A; - return dst; - } - - #endregion - } -} \ No newline at end of file diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index 5efc675..c5dffeb 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -56,11 +56,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -102,9 +102,9 @@ byte[] btDstNode = { 0xFF, 0xFF }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -119,17 +119,18 @@ }; //获取时间(年-月-日-时-分-秒),年号-2000 - RuntimeCache.HydrophoneWakeUpTimeBytes = new[] + RuntimeCache.HydrophoneWakeUpTimestamp = new[] { - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; byte[] timeTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -147,11 +148,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -226,9 +227,9 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -245,11 +246,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -318,11 +319,11 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid - + //wrap the whole data var result = new byte[42]; result[0] = preambleByte; @@ -335,13 +336,13 @@ result[15] = btSeq; oidTag.CopyTo(result, 16); timeTag.CopyTo(result, 30); - + //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -381,9 +382,9 @@ byte[] btDstNode = { 0x22, devId }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -407,11 +408,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -461,9 +462,9 @@ btDstNode[1] = byte.Parse(dstNodeAddr.Substring(2, 2), NumberStyles.HexNumber); const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A82Weakuprequest+z噪声记录仪 + const short pdu = 2688 + operateType; var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -473,10 +474,6 @@ //第一个Tag的Oid为“0x30000001”,第二个Tag为时间戳,Oid为“0x10000051”,内容为“年、月、日、时、分、秒” byte[] oid = { 0x20, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00 }; //Tag1 - /* - byte[] sysTag = { 0x10,0x00,0x00,0x51,0x00,0x06, - CalendarHub.YEAR, CalendarHub.MON, CalendarHub.DAY, CalendarHub.HOR, CalendarHub.MIN, CalendarHub.SEC };//Tag2 - */ byte[] totalLen = { 0x00, 0x13 }; //wrap the whole data @@ -493,11 +490,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -558,7 +555,8 @@ byte[] sysTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; //Tag2 byte[] totalLen = { 0x00, 0x18 }; @@ -577,11 +575,11 @@ sysTag.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -647,11 +645,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; diff --git a/Correlator/Util/CrcCodeHub.cs b/Correlator/Util/CrcCodeHub.cs new file mode 100644 index 0000000..c3933df --- /dev/null +++ b/Correlator/Util/CrcCodeHub.cs @@ -0,0 +1,75 @@ +namespace Correlator.Util +{ + public static class CrcCodeHub + { + #region CRC-16校验的高位字节表 + + private static readonly byte[] HiCrcTable = + { + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 + }; + + #endregion + + #region CRC-16校验的低位字节表 + + private static readonly byte[] LoCrcTable = + { + 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, + 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, + 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, + 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, + 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, + 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, + 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, + 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, + 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, + 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, + 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, + 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, + 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, + 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, + 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, + 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 + }; + + #endregion + + public static uint GenerateCrc16Code(byte[] source) + { + uint crc16 = 0xFFFF; + foreach (var t in source) + { + crc16 ^= t; + for (var j = 0; j < 8; j++) + { + if ((crc16 & 0x01) == 1) + { + crc16 = (crc16 >> 1) ^ 0xA001; + } + else + { + crc16 >>= 1; + } + } + } + + return crc16; + } + } +} \ No newline at end of file diff --git a/Correlator/Util/LogWithConsole.cs b/Correlator/Util/LogWithConsole.cs deleted file mode 100644 index bc42276..0000000 --- a/Correlator/Util/LogWithConsole.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace Correlator.Util -{ - public static class LogWithConsole - { - /// - /// Log本地化,并输出在Console,便于Debug - /// - /// - /// - public static void WriteLog(this string className, string log) - { - LogHelper.Info(log); - Console.WriteLine($@"{className} => {log}"); - } - } -} \ No newline at end of file diff --git a/Correlator/Util/MethodExtensions.cs b/Correlator/Util/MethodExtensions.cs index 48f9791..fbeaae6 100644 --- a/Correlator/Util/MethodExtensions.cs +++ b/Correlator/Util/MethodExtensions.cs @@ -56,7 +56,7 @@ } catch (Exception e) { - LogHelper.Info(e.ToString()); + "MethodExtensions".WriteLog(e.Message); } } @@ -128,11 +128,22 @@ } catch (Exception ex) { - LogHelper.Info(ex.ToString()); + "MethodExtensions".WriteLog(ex.Message); } } /// + /// Log本地化,并输出在Console,便于Debug + /// + /// + /// + public static void WriteLog(this string className, string log) + { + Console.WriteLine($@"{className} => {log}"); + LogHelper.Info(log); + } + + /// /// 计算文件占用空间大小 /// /// @@ -164,25 +175,60 @@ return fileSize; } - public static int ConvertBytes2Int(this IEnumerable bytes) + /// + /// 字节数组转Int + /// + /// + /// + public static int ConvertToInt(this byte[] bytes) { return bytes.Aggregate(0, (current, b) => 16 * 16 * current + b); } - public static string ConvertBytes2String(this IEnumerable bytes) + /// + /// 字节数组转String + /// + /// + /// + public static string ConvertToString(this byte[] bytes) { return bytes.Aggregate("", (current, t) => current + t.ToString("X2")); } /// - /// 数据补零,保持长度一致 + /// 字符串转byte /// - /// + /// /// - public static string AppendEndZero(this double d) + public static byte ConvertToByte(this string str) { - //数据固定长度16 - return ((decimal)d).ToString("G").PadRight(16, '0'); + return byte.Parse(str, NumberStyles.HexNumber); + } + + /// + /// 字符串转BCD码 + /// + /// + /// + public static byte ConvertToBcdCode(this string str) + { + return (byte)(int.Parse(str.Substring(0, 1)) * 16 + int.Parse(str.Substring(1, 1))); + } + + /// + /// 字符串转byte[] + /// + /// + /// + private static byte[] ConvertToByteArray(string str) + { + var ret = new byte[str.Length / 2]; + for (var i = 0; i < str.Length / 2; i++) + { + ret[i] = byte.Parse(str.Substring(i * 2, 2), NumberStyles.HexNumber); + } + + return ret; } public static string AppendLeftZero(this int i) @@ -191,7 +237,12 @@ return i.ToString("G").PadLeft(2, '0'); } - public static string To16HexString(this string src) + /// + /// 转16进制字符串 + /// + /// + /// + public static string ConvertToHexString(this string src) { if (src.Length == 4) { @@ -230,36 +281,8 @@ Growl.Success("快照已保存"); } - public static int ToIntensity(this int value) - { - if (value >= -56) - { - return 5; - } - else if (value >= -72) - { - return 4; - } - else if (value >= -88) - { - return 3; - } - else if (value >= -104) - { - return 2; - } - else if (value >= -120) - { - return 1; - } - else - { - return 0; - } - } - /// - /// byte[]转数据Tag + /// 字节数组转数据Tag集合 /// /// /// @@ -278,7 +301,7 @@ Array.Reverse(len); int iLen = BitConverter.ToInt16(len, 0); - var strOid = oid.ConvertBytes2String(); + var strOid = oid.ConvertToString(); var value = new byte[iLen]; Array.Copy(strTags, i + 6, value, 0, iLen); @@ -290,24 +313,24 @@ } catch (Exception e) { - LogHelper.Info("设备上传协议出错:" + e.Message); + "MethodExtensions".WriteLog($"设备上传协议出错:{e.Message}"); } return tags; } /// - /// 电量 + /// 通过Linq查找电量Tag /// /// /// - public static CellTag GetCellTag(this IEnumerable tags) + public static CellTag GetCellTag(this List tags) { return tags.Where(tag => tag is CellTag).Cast().FirstOrDefault(); } /// - /// 状态 + /// 通过Linq查找状态Tag /// /// /// @@ -342,7 +365,7 @@ } /// - /// 上报的噪声 + /// 通过Linq查找噪声Tag /// /// /// @@ -452,77 +475,6 @@ } /// - /// 本地数据转 CorrelatorDataModel - /// - /// - /// - public static CorrelatorDataModel LocalDataToDataModel(this List strResponses) - { - var dataModel = new CorrelatorDataModel(); - var index = strResponses.IndexOf("==============="); - - var leftCacheData = new double[7500 * 60]; - for (var i = 1; i < index; i++) - { - try - { - leftCacheData[i - 1] = Convert.ToDouble(strResponses[i]); - } - catch (FormatException e) - { - Console.WriteLine(e); - Console.WriteLine($@"MethodExtensions => {strResponses[i]}"); - throw; - } - } - - dataModel.DevCode = DevCode.Dev1; - dataModel.LeftReceiveDataTime = DateTime.Now; - dataModel.LeftDeviceDataArray = leftCacheData; - - var rightCacheData = new double[7500 * 60]; - //450001 - 900000 - for (var i = index + 1; i < strResponses.Count; i++) - { - try - { - rightCacheData[i - 450002] = Convert.ToDouble(strResponses[i]); - } - catch (FormatException e) - { - Console.WriteLine(e); - Console.WriteLine($@"MethodExtensions => {strResponses[i]}"); - throw; - } - } - - dataModel.DevCode = DevCode.Dev2; - dataModel.RightReceiveDataTime = DateTime.Now; - dataModel.RightDeviceDataArray = rightCacheData; - return dataModel; - } - - /// - /// 清空文件夹 - /// - /// - public static void ClearDirFiles(this string rootDir) - { - if (Directory.GetDirectories(rootDir).Length > 0 || Directory.GetFiles(rootDir).Length > 0) - { - //防止数据混乱,存数据之前先将之前发的数据清空 - var dir = new DirectoryInfo(rootDir); - if (dir.Exists) - { - foreach (var fileInfo in dir.GetFiles()) - { - fileInfo.Delete(); - } - } - } - } - - /// /// 保存传感器上传的原始数据 /// /// @@ -596,7 +548,7 @@ manager.Insert(configModel); } } - + /// /// 保存定位数据 /// @@ -629,93 +581,6 @@ } /// - /// 根据PduType获取设备类型 - /// - /// - /// - public static string GetDeviceTypeByPdu(this string type) - { - var pduType = short.Parse(type, NumberStyles.HexNumber); - var deviceType = pduType & 0x7F; - string devType; - switch (deviceType) - { - case 0: - devType = "未知设备"; - break; - case 2: - devType = "相关仪"; - break; - default: - devType = "undefined"; - break; - } - - return devType; - } - - /// - /// 解析PduType - /// - /// - /// - public static string GetOpeTypeByPdu(this byte[] pduTypeBytes) - { - pduTypeBytes = pduTypeBytes.Reverse().ToArray(); - var pduType = BitConverter.ToInt16(pduTypeBytes, 0); - - var operaType = (pduType >> 8) & 0xFF; - string result; - switch (operaType) - { - case 1: - result = "GetRequest"; - break; - case 2: - result = "GetResponse"; - break; - case 3: - result = "SetRequest"; - break; - case 4: - result = "TrapRequest"; - break; - case 5: - result = "TrapResponse"; - break; - case 6: - result = "OnlineRequest"; - break; - case 7: - result = "OnlineResponse"; - break; - case 8: - result = "StartupRequest"; - break; - case 9: - result = "StartupResponse"; - break; - case 10: - result = "WakeupRequest"; - break; - case 11: - result = "WakeupResponse"; - break; - case 13: - result = "ClientRequest"; - break; - case 12: - result = "SetResponse"; - break; - default: - result = "undefined"; - break; - } - - return result; - } - - /// /// 本地数据读取 /// /// diff --git a/Correlator/Correlator.csproj b/Correlator/Correlator.csproj index d1be0c8..1dc857e 100644 --- a/Correlator/Correlator.csproj +++ b/Correlator/Correlator.csproj @@ -17,7 +17,7 @@ - x64 + AnyCPU true full false @@ -245,7 +245,7 @@ - + @@ -261,9 +261,8 @@ - + - diff --git a/Correlator/DataService/AudioServiceImpl.cs b/Correlator/DataService/AudioServiceImpl.cs index 74bfd97..8e2a134 100644 --- a/Correlator/DataService/AudioServiceImpl.cs +++ b/Correlator/DataService/AudioServiceImpl.cs @@ -1,4 +1,6 @@ using System; +using System.Threading; +using System.Threading.Tasks; using Correlator.SensorHubTag; using Correlator.Util; using NAudio.Wave; @@ -17,6 +19,12 @@ public void Start(string deviceCode) { + //异步执行听音,不然会卡住界面 + Task.Run(delegate { StartListenAudio(deviceCode); }); + } + + private void StartListenAudio(string deviceCode) + { _waveOut.Init(_lazyWaveProvider.Value); _waveOut.Play(); @@ -56,6 +64,8 @@ _waveFileWriter.Dispose(); _waveFileWriter = null; + + _lazyWaveProvider.Value.ClearBuffer(); } } } \ No newline at end of file diff --git a/Correlator/DataService/IAudioService.cs b/Correlator/DataService/IAudioService.cs index 7ccb4e8..74de79b 100644 --- a/Correlator/DataService/IAudioService.cs +++ b/Correlator/DataService/IAudioService.cs @@ -2,10 +2,21 @@ { public interface IAudioService { + /// + /// 开始听音 + /// + /// void Start(string deviceCode); + /// + /// 缓存听音数据 + /// + /// void Write(byte[] pcm); + /// + /// 结束听音 + /// void Stop(); } } \ No newline at end of file diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index c00ab95..f25f7c5 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -43,11 +43,10 @@ var deviceIdBytes = new byte[6]; Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertBytes2String(); + var deviceId = deviceIdBytes.ConvertToString(); var pduTypeBytes = new byte[2]; Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); - var operateType = pduTypeBytes.GetOpeTypeByPdu(); var tagBytes = new byte[receiveData.Length - 18]; Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); @@ -154,12 +153,12 @@ { var lengthBuffer = new byte[2]; Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertBytes2Int(); + var length = lengthBuffer.ConvertToInt(); if (length < 12) { Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - LogHelper.Info("上传数组长度不够,丢弃数据"); + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); return null; } diff --git a/Correlator/Util/CodeUtil.cs b/Correlator/Util/CodeUtil.cs deleted file mode 100644 index cea55b7..0000000 --- a/Correlator/Util/CodeUtil.cs +++ /dev/null @@ -1,348 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; - -namespace Correlator.Util -{ - public static class CodeUtil - { - #region shao - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的高位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] HiCrcTable = - { - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, - 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 - }; - - // ----------------------------------------------------------------------------- - // DESCRIPTION: CRC-16校验的低位字节表 - // ----------------------------------------------------------------------------- - private static readonly byte[] LoCrcTable = - { - 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, - 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, - 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, - 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, - 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, - 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, - 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, - 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, - 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, - 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, - 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, - 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, - 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, - 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, - 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, - 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 - }; - - - // ***************************************************************************** - // Design Notes: - // ----------------------------------------------------------------------------- - private static ushort QuickCrc16(string source, int startIndex, int lenght) - { - uint i = 0; - - // Initial value for the CRC - byte iHiVal = 0XFF; // high byte of CRC initialized - byte iLoVal = 0XFF; // low byte of CRC initialized - - var dst = source.Substring(startIndex, lenght); - var byteDst = String2ByteArray(dst); - var iSize = byteDst.Length; - while (iSize != 0) - { - iSize--; - // Calculate the CRC - var index = (byte)(iLoVal ^ byteDst[i++]); // will index into CRC lookup table - - iLoVal = (byte)(iHiVal ^ HiCrcTable[index]); - iHiVal = LoCrcTable[index]; - } - - return (ushort)(iHiVal << 8 | iLoVal); - } - - public static float IntStringToFloat(string data) - { - if (data.Length < 8 || data.Length > 8) - { - throw (new ApplicationException("缓存中的数据不完整!")); - } - else - { - var intBuffer = new byte[4]; - //将16进制串按字节逆序化 - for (var i = 0; i < 4; i++) - { - if ((i % 2) == 0) - intBuffer[i + 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - else - intBuffer[i - 1] = Convert.ToByte(data.Substring(i * 2, 2), 16); - } - - return BitConverter.ToSingle(intBuffer, 0); - } - } - - #endregion - - public static string CRC16_AD(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{(int)CRC16_AD(byteDst):X}"; - } - - public static uint CRC16_AD(IEnumerable source) - { - uint crc16 = 0xffff; - foreach (var t in source) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - public static string CRC16_Standard(string source, int index, int lenght) - { - var dst = source.Substring(index, lenght); - var byteDst = String2ByteArray(dst); - return $"{CRC16_Standard(byteDst):X}"; - } - - private static int CRC16_Standard(IEnumerable source) - { - var crc16 = 0x0000; - foreach (var t in source) - { - crc16 ^= t; - for (uint j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0x8408; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static int CRC16_Modbus(IEnumerable modbusData) - { - var crc16 = 0xFFFF; - foreach (var t in modbusData) - { - crc16 ^= t; - for (var j = 0; j < 8; j++) - { - if ((crc16 & 0x01) == 1) - { - crc16 = (crc16 >> 1) ^ 0xA001; - } - else - { - crc16 >>= 1; - } - } - } - - return crc16; - } - - private static byte[] GetCrcByModBusData(IReadOnlyList modbusData) - { - return BitConverter.GetBytes((short)CRC16_Modbus(modbusData)); - } - - public static bool CRC16_validate(byte[] header, byte[] body) - { - var arr = BitConverter.GetBytes((short)body.Length); - var len = new[] { arr[1], arr[0] }; - var btArray = new byte[header.Length + len.Length + body.Length - 2]; - var tail = new byte[2]; - Buffer.BlockCopy(header, 0, btArray, 0, header.Length); - Buffer.BlockCopy(len, 0, btArray, header.Length, 2); - Buffer.BlockCopy(body, 0, btArray, header.Length + len.Length, body.Length - 2); - Buffer.BlockCopy(body, body.Length - 2, tail, 0, 2); - var crc = GetCrcByModBusData(btArray); - if (crc[0] != tail[0]) - { - return false; - } - - return crc[1] == tail[1]; - } - - public static byte[] Time2Bcd(string val) - { - var bt = new byte[val.Length / 2]; - for (var i = 0; i < val.Length / 2; i++) - { - var ret = int.Parse(val.Substring(i * 2, 1)) * 16 + int.Parse(val.Substring(i * 2 + 1, 1)); - bt[i] = (byte)ret; - } - - return bt; - } - - public static byte String2Bcd(string str) - { - return (byte)(int.Parse(str.Substring(0, 1)) * 16 + int.Parse(str.Substring(1, 1))); - } - - private static byte[] String2ByteArray(string str) - { - var ret = new byte[str.Length / 2]; - for (var i = 0; i < str.Length / 2; i++) - { - ret[i] = byte.Parse(str.Substring(i * 2, 2), NumberStyles.HexNumber); - } - - return ret; - } - - public static byte String2Byte(string str) - { - return byte.Parse(str, NumberStyles.HexNumber); - } - - public static DateTime String2DateTime(string str) - { - //20140911130956 - var sb = new StringBuilder(); - sb.Append("20").Append(str.Substring(0, 2)).Append("-").Append(str.Substring(2, 2)).Append("-") - .Append(str.Substring(4, 2)).Append(" ").Append(str.Substring(6, 2)).Append(":") - .Append(str.Substring(8, 2)).Append(":").Append(str.Substring(10, 2)); - return Convert.ToDateTime(sb.ToString()); - } - - //输入为初始的9个字节的头加上指定的一串byte,输出为9个字节的头加上输入的byte数组 - public static byte[] CreateBytes(byte[] header, byte[] data) - { - var setOut = new byte[data.Length + 9]; - - Array.Copy(data, 0, setOut, 9, data.Length); - - setOut[0] = 0XAA; - setOut[1] = 0X1D; - setOut[2] = header[2]; - setOut[3] = header[3]; - setOut[4] = 0X03; - setOut[5] = 0X00; - setOut[6] = BitConverter.GetBytes(data.Length)[0]; - setOut[7] = 0X00; - setOut[8] = 0X00; - - var crcIn = setOut.Aggregate("", (current, t) => current + t.ToString("X2")); - - var crcOut = QuickCrc16(crcIn, 0, crcIn.Length); - var crcOutByte = BitConverter.GetBytes(crcOut); - setOut[7] = crcOutByte[1]; - setOut[8] = crcOutByte[0]; - - return setOut; - } - - #region - - //解码数据后,加入3:4编码 - public static byte[] AdDecode(byte[] data) - { - var srcLen = data.Length; - if (srcLen % 4 != 0) - { - return null; - } - - var destLen = (data.Length / 4) * 3; - var dst = new byte[destLen]; - var j = 0; - for (var i = 0; i < data.Length / 4; i++) - { - dst[j] = (byte)((data[i * 4 + 0] & 0x3f) | (data[i * 4 + 3] << 2 & 0xc0)); - dst[j + 1] = (byte)((data[i * 4 + 1] & 0x3f) | (data[i * 4 + 3] << 4 & 0xc0)); - dst[j + 2] = (byte)((data[i * 4 + 2] & 0x3f) | (data[i * 4 + 3] << 6 & 0xc0)); - j += 3; - } - - var temp = BitConverter.ToString(dst); - var temp0 = temp.Split('-'); - var len = short.Parse((temp0[2] + temp0[3]), NumberStyles.HexNumber) + 6; - - var result = new byte[len + 2]; - for (var i = 0; i < len; i++) - { - result[i] = dst[i]; - } - - result[len] = 0x0D; - result[len + 1] = 0x0A; - return result; - } - - public static byte[] AdEncode(byte[] data) - { - var len = data.Length % 3 != 0 ? ((data.Length / 3) + 1) * 3 : data.Length; - var extentData = new byte[len]; - data.CopyTo(extentData, 0); - var dst = new byte[(len / 3) * 4 + 2]; - var j = 0; - - for (var i = 0; i < len / 3; i++) - { - dst[j + 0] = (byte)(extentData[i * 3 + 0] & 0x3f | 0x40); - dst[j + 1] = (byte)(extentData[i * 3 + 1] & 0x3f | 0x40); - dst[j + 2] = (byte)(extentData[i * 3 + 2] & 0x3f | 0x40); - dst[j + 3] = (byte)(0x40 | ((extentData[i * 3 + 0] >> 2) & 0x30) - | ((extentData[i * 3 + 1] >> 4) & 0x0c) - | ((extentData[i * 3 + 2] >> 6) & 0x03)); - j += 4; - } - - dst[dst.Length - 2] = 0x0D; - dst[dst.Length - 1] = 0x0A; - return dst; - } - - #endregion - } -} \ No newline at end of file diff --git a/Correlator/Util/CommandSender.cs b/Correlator/Util/CommandSender.cs index 5efc675..c5dffeb 100644 --- a/Correlator/Util/CommandSender.cs +++ b/Correlator/Util/CommandSender.cs @@ -56,11 +56,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -102,9 +102,9 @@ byte[] btDstNode = { 0xFF, 0xFF }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -119,17 +119,18 @@ }; //获取时间(年-月-日-时-分-秒),年号-2000 - RuntimeCache.HydrophoneWakeUpTimeBytes = new[] + RuntimeCache.HydrophoneWakeUpTimestamp = new[] { - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; byte[] timeTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -147,11 +148,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -226,9 +227,9 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid //wrap the whole data @@ -245,11 +246,11 @@ timeTag.CopyTo(result, 23); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -318,11 +319,11 @@ { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - RuntimeCache.HydrophoneWakeUpTimeBytes[0], RuntimeCache.HydrophoneWakeUpTimeBytes[1], - RuntimeCache.HydrophoneWakeUpTimeBytes[2], RuntimeCache.HydrophoneWakeUpTimeBytes[3], - RuntimeCache.HydrophoneWakeUpTimeBytes[4], RuntimeCache.HydrophoneWakeUpTimeBytes[5] + RuntimeCache.HydrophoneWakeUpTimestamp[0], RuntimeCache.HydrophoneWakeUpTimestamp[1], + RuntimeCache.HydrophoneWakeUpTimestamp[2], RuntimeCache.HydrophoneWakeUpTimestamp[3], + RuntimeCache.HydrophoneWakeUpTimestamp[4], RuntimeCache.HydrophoneWakeUpTimestamp[5] }; //时间oid - + //wrap the whole data var result = new byte[42]; result[0] = preambleByte; @@ -335,13 +336,13 @@ result[15] = btSeq; oidTag.CopyTo(result, 16); timeTag.CopyTo(result, 30); - + //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -381,9 +382,9 @@ byte[] btDstNode = { 0x22, devId }; const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A80 + const short pdu = 2688 + operateType; //0X0A80 var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -407,11 +408,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -461,9 +462,9 @@ btDstNode[1] = byte.Parse(dstNodeAddr.Substring(2, 2), NumberStyles.HexNumber); const short pduTypeByte = 2; - var operateType = (short)(pduTypeByte & 0x7F); + const short operateType = pduTypeByte & 0x7F; - var pdu = (short)(2688 + operateType); //0X0A82Weakuprequest+z噪声记录仪 + const short pdu = 2688 + operateType; var btPdu0 = BitConverter.GetBytes(pdu); byte[] btPdu = { btPdu0[1], btPdu0[0] }; @@ -473,10 +474,6 @@ //第一个Tag的Oid为“0x30000001”,第二个Tag为时间戳,Oid为“0x10000051”,内容为“年、月、日、时、分、秒” byte[] oid = { 0x20, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00 }; //Tag1 - /* - byte[] sysTag = { 0x10,0x00,0x00,0x51,0x00,0x06, - CalendarHub.YEAR, CalendarHub.MON, CalendarHub.DAY, CalendarHub.HOR, CalendarHub.MIN, CalendarHub.SEC };//Tag2 - */ byte[] totalLen = { 0x00, 0x13 }; //wrap the whole data @@ -493,11 +490,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -558,7 +555,8 @@ byte[] sysTag = { 0x10, 0x00, 0x00, 0x51, 0x00, 0x06, - CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, CalendarHub.Sec + CalendarHub.Year, CalendarHub.Mon, CalendarHub.Day, CalendarHub.Hor, CalendarHub.Min, + CalendarHub.Sec }; //Tag2 byte[] totalLen = { 0x00, 0x18 }; @@ -577,11 +575,11 @@ sysTag.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; @@ -647,11 +645,11 @@ oid.CopyTo(result, 16); //增加CRC校验 - var strCrc = $"{(int)CodeUtil.CRC16_AD(result):X}".To16HexString(); + var strCrc = $"{(int)CrcCodeHub.GenerateCrc16Code(result):X}".ConvertToHexString(); byte[] crcByte = { - CodeUtil.String2Byte(strCrc.Substring(0, 2)), - CodeUtil.String2Byte(strCrc.Substring(2, 2)) + strCrc.Substring(0, 2).ConvertToByte(), + strCrc.Substring(2, 2).ConvertToByte() }; var afCrc = new byte[result.Length + 2]; diff --git a/Correlator/Util/CrcCodeHub.cs b/Correlator/Util/CrcCodeHub.cs new file mode 100644 index 0000000..c3933df --- /dev/null +++ b/Correlator/Util/CrcCodeHub.cs @@ -0,0 +1,75 @@ +namespace Correlator.Util +{ + public static class CrcCodeHub + { + #region CRC-16校验的高位字节表 + + private static readonly byte[] HiCrcTable = + { + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40, 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, + 0X00, 0XC1, 0X81, 0X40, 0X01, 0XC0, 0X80, 0X41, 0X01, 0XC0, 0X80, 0X41, 0X00, 0XC1, 0X81, 0X40 + }; + + #endregion + + #region CRC-16校验的低位字节表 + + private static readonly byte[] LoCrcTable = + { + 0X00, 0XC0, 0XC1, 0X01, 0XC3, 0X03, 0X02, 0XC2, 0XC6, 0X06, 0X07, 0XC7, 0X05, 0XC5, 0XC4, 0X04, + 0XCC, 0X0C, 0X0D, 0XCD, 0X0F, 0XCF, 0XCE, 0X0E, 0X0A, 0XCA, 0XCB, 0X0B, 0XC9, 0X09, 0X08, 0XC8, + 0XD8, 0X18, 0X19, 0XD9, 0X1B, 0XDB, 0XDA, 0X1A, 0X1E, 0XDE, 0XDF, 0X1F, 0XDD, 0X1D, 0X1C, 0XDC, + 0X14, 0XD4, 0XD5, 0X15, 0XD7, 0X17, 0X16, 0XD6, 0XD2, 0X12, 0X13, 0XD3, 0X11, 0XD1, 0XD0, 0X10, + 0XF0, 0X30, 0X31, 0XF1, 0X33, 0XF3, 0XF2, 0X32, 0X36, 0XF6, 0XF7, 0X37, 0XF5, 0X35, 0X34, 0XF4, + 0X3C, 0XFC, 0XFD, 0X3D, 0XFF, 0X3F, 0X3E, 0XFE, 0XFA, 0X3A, 0X3B, 0XFB, 0X39, 0XF9, 0XF8, 0X38, + 0X28, 0XE8, 0XE9, 0X29, 0XEB, 0X2B, 0X2A, 0XEA, 0XEE, 0X2E, 0X2F, 0XEF, 0X2D, 0XED, 0XEC, 0X2C, + 0XE4, 0X24, 0X25, 0XE5, 0X27, 0XE7, 0XE6, 0X26, 0X22, 0XE2, 0XE3, 0X23, 0XE1, 0X21, 0X20, 0XE0, + 0XA0, 0X60, 0X61, 0XA1, 0X63, 0XA3, 0XA2, 0X62, 0X66, 0XA6, 0XA7, 0X67, 0XA5, 0X65, 0X64, 0XA4, + 0X6C, 0XAC, 0XAD, 0X6D, 0XAF, 0X6F, 0X6E, 0XAE, 0XAA, 0X6A, 0X6B, 0XAB, 0X69, 0XA9, 0XA8, 0X68, + 0X78, 0XB8, 0XB9, 0X79, 0XBB, 0X7B, 0X7A, 0XBA, 0XBE, 0X7E, 0X7F, 0XBF, 0X7D, 0XBD, 0XBC, 0X7C, + 0XB4, 0X74, 0X75, 0XB5, 0X77, 0XB7, 0XB6, 0X76, 0X72, 0XB2, 0XB3, 0X73, 0XB1, 0X71, 0X70, 0XB0, + 0X50, 0X90, 0X91, 0X51, 0X93, 0X53, 0X52, 0X92, 0X96, 0X56, 0X57, 0X97, 0X55, 0X95, 0X94, 0X54, + 0X9C, 0X5C, 0X5D, 0X9D, 0X5F, 0X9F, 0X9E, 0X5E, 0X5A, 0X9A, 0X9B, 0X5B, 0X99, 0X59, 0X58, 0X98, + 0X88, 0X48, 0X49, 0X89, 0X4B, 0X8B, 0X8A, 0X4A, 0X4E, 0X8E, 0X8F, 0X4F, 0X8D, 0X4D, 0X4C, 0X8C, + 0X44, 0X84, 0X85, 0X45, 0X87, 0X47, 0X46, 0X86, 0X82, 0X42, 0X43, 0X83, 0X41, 0X81, 0X80, 0X40 + }; + + #endregion + + public static uint GenerateCrc16Code(byte[] source) + { + uint crc16 = 0xFFFF; + foreach (var t in source) + { + crc16 ^= t; + for (var j = 0; j < 8; j++) + { + if ((crc16 & 0x01) == 1) + { + crc16 = (crc16 >> 1) ^ 0xA001; + } + else + { + crc16 >>= 1; + } + } + } + + return crc16; + } + } +} \ No newline at end of file diff --git a/Correlator/Util/LogWithConsole.cs b/Correlator/Util/LogWithConsole.cs deleted file mode 100644 index bc42276..0000000 --- a/Correlator/Util/LogWithConsole.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace Correlator.Util -{ - public static class LogWithConsole - { - /// - /// Log本地化,并输出在Console,便于Debug - /// - /// - /// - public static void WriteLog(this string className, string log) - { - LogHelper.Info(log); - Console.WriteLine($@"{className} => {log}"); - } - } -} \ No newline at end of file diff --git a/Correlator/Util/MethodExtensions.cs b/Correlator/Util/MethodExtensions.cs index 48f9791..fbeaae6 100644 --- a/Correlator/Util/MethodExtensions.cs +++ b/Correlator/Util/MethodExtensions.cs @@ -56,7 +56,7 @@ } catch (Exception e) { - LogHelper.Info(e.ToString()); + "MethodExtensions".WriteLog(e.Message); } } @@ -128,11 +128,22 @@ } catch (Exception ex) { - LogHelper.Info(ex.ToString()); + "MethodExtensions".WriteLog(ex.Message); } } /// + /// Log本地化,并输出在Console,便于Debug + /// + /// + /// + public static void WriteLog(this string className, string log) + { + Console.WriteLine($@"{className} => {log}"); + LogHelper.Info(log); + } + + /// /// 计算文件占用空间大小 /// /// @@ -164,25 +175,60 @@ return fileSize; } - public static int ConvertBytes2Int(this IEnumerable bytes) + /// + /// 字节数组转Int + /// + /// + /// + public static int ConvertToInt(this byte[] bytes) { return bytes.Aggregate(0, (current, b) => 16 * 16 * current + b); } - public static string ConvertBytes2String(this IEnumerable bytes) + /// + /// 字节数组转String + /// + /// + /// + public static string ConvertToString(this byte[] bytes) { return bytes.Aggregate("", (current, t) => current + t.ToString("X2")); } /// - /// 数据补零,保持长度一致 + /// 字符串转byte /// - /// + /// /// - public static string AppendEndZero(this double d) + public static byte ConvertToByte(this string str) { - //数据固定长度16 - return ((decimal)d).ToString("G").PadRight(16, '0'); + return byte.Parse(str, NumberStyles.HexNumber); + } + + /// + /// 字符串转BCD码 + /// + /// + /// + public static byte ConvertToBcdCode(this string str) + { + return (byte)(int.Parse(str.Substring(0, 1)) * 16 + int.Parse(str.Substring(1, 1))); + } + + /// + /// 字符串转byte[] + /// + /// + /// + private static byte[] ConvertToByteArray(string str) + { + var ret = new byte[str.Length / 2]; + for (var i = 0; i < str.Length / 2; i++) + { + ret[i] = byte.Parse(str.Substring(i * 2, 2), NumberStyles.HexNumber); + } + + return ret; } public static string AppendLeftZero(this int i) @@ -191,7 +237,12 @@ return i.ToString("G").PadLeft(2, '0'); } - public static string To16HexString(this string src) + /// + /// 转16进制字符串 + /// + /// + /// + public static string ConvertToHexString(this string src) { if (src.Length == 4) { @@ -230,36 +281,8 @@ Growl.Success("快照已保存"); } - public static int ToIntensity(this int value) - { - if (value >= -56) - { - return 5; - } - else if (value >= -72) - { - return 4; - } - else if (value >= -88) - { - return 3; - } - else if (value >= -104) - { - return 2; - } - else if (value >= -120) - { - return 1; - } - else - { - return 0; - } - } - /// - /// byte[]转数据Tag + /// 字节数组转数据Tag集合 /// /// /// @@ -278,7 +301,7 @@ Array.Reverse(len); int iLen = BitConverter.ToInt16(len, 0); - var strOid = oid.ConvertBytes2String(); + var strOid = oid.ConvertToString(); var value = new byte[iLen]; Array.Copy(strTags, i + 6, value, 0, iLen); @@ -290,24 +313,24 @@ } catch (Exception e) { - LogHelper.Info("设备上传协议出错:" + e.Message); + "MethodExtensions".WriteLog($"设备上传协议出错:{e.Message}"); } return tags; } /// - /// 电量 + /// 通过Linq查找电量Tag /// /// /// - public static CellTag GetCellTag(this IEnumerable tags) + public static CellTag GetCellTag(this List tags) { return tags.Where(tag => tag is CellTag).Cast().FirstOrDefault(); } /// - /// 状态 + /// 通过Linq查找状态Tag /// /// /// @@ -342,7 +365,7 @@ } /// - /// 上报的噪声 + /// 通过Linq查找噪声Tag /// /// /// @@ -452,77 +475,6 @@ } /// - /// 本地数据转 CorrelatorDataModel - /// - /// - /// - public static CorrelatorDataModel LocalDataToDataModel(this List strResponses) - { - var dataModel = new CorrelatorDataModel(); - var index = strResponses.IndexOf("==============="); - - var leftCacheData = new double[7500 * 60]; - for (var i = 1; i < index; i++) - { - try - { - leftCacheData[i - 1] = Convert.ToDouble(strResponses[i]); - } - catch (FormatException e) - { - Console.WriteLine(e); - Console.WriteLine($@"MethodExtensions => {strResponses[i]}"); - throw; - } - } - - dataModel.DevCode = DevCode.Dev1; - dataModel.LeftReceiveDataTime = DateTime.Now; - dataModel.LeftDeviceDataArray = leftCacheData; - - var rightCacheData = new double[7500 * 60]; - //450001 - 900000 - for (var i = index + 1; i < strResponses.Count; i++) - { - try - { - rightCacheData[i - 450002] = Convert.ToDouble(strResponses[i]); - } - catch (FormatException e) - { - Console.WriteLine(e); - Console.WriteLine($@"MethodExtensions => {strResponses[i]}"); - throw; - } - } - - dataModel.DevCode = DevCode.Dev2; - dataModel.RightReceiveDataTime = DateTime.Now; - dataModel.RightDeviceDataArray = rightCacheData; - return dataModel; - } - - /// - /// 清空文件夹 - /// - /// - public static void ClearDirFiles(this string rootDir) - { - if (Directory.GetDirectories(rootDir).Length > 0 || Directory.GetFiles(rootDir).Length > 0) - { - //防止数据混乱,存数据之前先将之前发的数据清空 - var dir = new DirectoryInfo(rootDir); - if (dir.Exists) - { - foreach (var fileInfo in dir.GetFiles()) - { - fileInfo.Delete(); - } - } - } - } - - /// /// 保存传感器上传的原始数据 /// /// @@ -596,7 +548,7 @@ manager.Insert(configModel); } } - + /// /// 保存定位数据 /// @@ -629,93 +581,6 @@ } /// - /// 根据PduType获取设备类型 - /// - /// - /// - public static string GetDeviceTypeByPdu(this string type) - { - var pduType = short.Parse(type, NumberStyles.HexNumber); - var deviceType = pduType & 0x7F; - string devType; - switch (deviceType) - { - case 0: - devType = "未知设备"; - break; - case 2: - devType = "相关仪"; - break; - default: - devType = "undefined"; - break; - } - - return devType; - } - - /// - /// 解析PduType - /// - /// - /// - public static string GetOpeTypeByPdu(this byte[] pduTypeBytes) - { - pduTypeBytes = pduTypeBytes.Reverse().ToArray(); - var pduType = BitConverter.ToInt16(pduTypeBytes, 0); - - var operaType = (pduType >> 8) & 0xFF; - string result; - switch (operaType) - { - case 1: - result = "GetRequest"; - break; - case 2: - result = "GetResponse"; - break; - case 3: - result = "SetRequest"; - break; - case 4: - result = "TrapRequest"; - break; - case 5: - result = "TrapResponse"; - break; - case 6: - result = "OnlineRequest"; - break; - case 7: - result = "OnlineResponse"; - break; - case 8: - result = "StartupRequest"; - break; - case 9: - result = "StartupResponse"; - break; - case 10: - result = "WakeupRequest"; - break; - case 11: - result = "WakeupResponse"; - break; - case 13: - result = "ClientRequest"; - break; - case 12: - result = "SetResponse"; - break; - default: - result = "undefined"; - break; - } - - return result; - } - - /// /// 本地数据读取 /// /// diff --git a/Correlator/ViewModels/SimplyAuditionDialogViewModel.cs b/Correlator/ViewModels/SimplyAuditionDialogViewModel.cs index 1b2d14a..65ba7d2 100644 --- a/Correlator/ViewModels/SimplyAuditionDialogViewModel.cs +++ b/Correlator/ViewModels/SimplyAuditionDialogViewModel.cs @@ -66,8 +66,6 @@ #endregion - private readonly ISerialPortService _serialPortService; - #region 静音 //函数名不能改,否则会报找不到函数错误,dll里面定好了的 @@ -91,10 +89,18 @@ public SimplyAuditionDialogViewModel(ISerialPortService serialPortService, IAudioService audioService, IDialogService dialogService) { - _serialPortService = serialPortService; - GoBackCommand = new DelegateCommand(delegate { + if (_isRedRecording) + { + CommandSender.SendSoundStopCmd(serialPortService.Sp, DevCode.Dev1); + } + + if (_isBlueRecording) + { + CommandSender.SendSoundStopCmd(serialPortService.Sp, DevCode.Dev2); + } + RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); }); @@ -112,13 +118,14 @@ }, delegate { } ); + // MessageBox.Show("请先停止蓝色传感器听音", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); return; } if (_isRedRecording) { - CommandSender.SendSoundStopCmd(_serialPortService.Sp, DevCode.Dev1); + CommandSender.SendSoundStopCmd(serialPortService.Sp, DevCode.Dev1); audioService.Stop(); IsRedRecording = false; RuntimeCache.RedSoundCaches.SaveSoundData(); @@ -126,7 +133,7 @@ } else { - CommandSender.SendSoundCollectCmd(_serialPortService.Sp, DevCode.Dev1); + CommandSender.SendSoundCollectCmd(serialPortService.Sp, DevCode.Dev1); audioService.Start(DevCode.Dev1); IsRedRecording = true; } @@ -164,13 +171,14 @@ }, delegate { } ); + // MessageBox.Show("请先停止红色传感器听音", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); return; } if (_isBlueRecording) { - CommandSender.SendSoundStopCmd(_serialPortService.Sp, DevCode.Dev2); + CommandSender.SendSoundStopCmd(serialPortService.Sp, DevCode.Dev2); audioService.Stop(); IsBlueRecording = false; RuntimeCache.BlueSoundCaches.SaveSoundData(); @@ -178,7 +186,7 @@ } else { - CommandSender.SendSoundCollectCmd(_serialPortService.Sp, DevCode.Dev2); + CommandSender.SendSoundCollectCmd(serialPortService.Sp, DevCode.Dev2); audioService.Start(DevCode.Dev2); IsBlueRecording = true; } @@ -192,15 +200,6 @@ public void OnDialogClosed() { - if (_isRedRecording) - { - CommandSender.SendSoundStopCmd(_serialPortService.Sp, DevCode.Dev1); - } - - if (_isBlueRecording) - { - CommandSender.SendSoundStopCmd(_serialPortService.Sp, DevCode.Dev2); - } } public void OnDialogOpened(IDialogParameters parameters)