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)