using Dm.filter.log; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; using Serilog; using SlnMesnac.Common; using SlnMesnac.Model.domain; using SlnMesnac.Model.dto; using SlnMesnac.Repository.service; using SlnMesnac.Rfid.Dto; using SlnMesnac.Rfid.Enum; using SlnMesnac.Rfid.NewRFIDConnect; using SlnMesnac.Rfid.NewRFIDConnect.entity; using SlnMesnac.Serilog; using SlnMesnac.TouchSocket; using SqlSugar; using System; using System.Collections; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; using TouchSocket.Core; using TouchSocket.Sockets; #region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2024 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:LAPTOP-E0N2L34V * 命名空间:SlnMesnac.Rfid.Factory * 唯一标识:496f8d2b-70e3-4a05-ae18-a9b0fcd06b82 * * 创建者:WenJY * 电子邮箱:wenjy@mesnac.com * 创建时间:2024-03-27 21:58:35 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> namespace SlnMesnac.Rfid.Factory { public class RflyFactory : RfidAbsractFactory { private SerilogHelper _logger; private readonly TcpClient _tcpClient = new TcpClient(); private readonly StringChange _stringChange; private string m_strIP; private string m_deviceID; private MeshttpClient _meshttpClient; public RflyFactory(SerilogHelper logger, StringChange stringChange, MeshttpClient meshttpClient) { _logger = logger; _stringChange = stringChange; _meshttpClient = meshttpClient; } /// /// 建立连接 /// /// /// /// /// public override bool Connect(string ip, int port) { try { _tcpClient.SetupAsync(new TouchSocketConfig().SetRemoteIPHost($"{ip}:{port}")); _tcpClient.ConnectAsync(); return true; } catch (Exception e) { return false; //throw new InvalidOperationException($"设备连接异常:{e.Message}"); } } /// /// 异步建立连接 /// /// /// /// public override async Task ConnectAsync(string ip, int port, string deviceid) { try { m_deviceID = deviceid; m_strIP = ip; _tcpClient.SetupAsync(new TouchSocketConfig().SetRemoteIPHost($"{ip}:{port}")); await _tcpClient.ConnectAsync(1500); _tcpClient.Received = (client, e) => { //从客户端收到信息 //var mes = Encoding.UTF8.GetString(e.Memory.Span.ToArray(), 0, e.Memory.Span.Length);//注意:数据长度是byteBlock.Len byte[] receivedBuffer = new byte[e.Memory.Span.Length]; Array.Copy(e.Memory.Span.ToArray(), 0, receivedBuffer, 0, e.Memory.Span.Length); if (receivedBuffer.Length > 3) { //心跳 if (e.Memory.Span.ToArray()[3] == 0xBF) { if (GloalVar.HeartBeatRecoard.TryGetValue(deviceid, out var value)) { GloalVar.HeartBeatRecoard[deviceid] = DateTime.Now; } else { GloalVar.HeartBeatRecoard.Add(deviceid, DateTime.Now); } } //连续盘点返回 if (e.Memory.Span.ToArray()[3] == 0x01) { DealMessageData(receivedBuffer); } //按时间段盘点返回 if (e.Memory.Span.ToArray()[3] == 0x02) { //粘包处理 //BBDD01900029B80D BBDD1202000132CD043000333131303432360000000000E90D //BBDD1202000138CF043000333131303035360000000000E20DBBDD01900026B70D if (e.Memory.Span.ToArray()[e.Memory.Span.ToArray().Length - 5] == 0x90) { var messagebuffer = new byte[receivedBuffer.Length - 8]; Array.Copy(receivedBuffer, 0, messagebuffer, 0, receivedBuffer.Length - 8); DealMessageData(messagebuffer); } else { DealMessageData(receivedBuffer); } //Log.Information($"{m_deviceID},IP:{m_strIP}接收自报{_stringChange.bytesToHexStr(receivedBuffer, receivedBuffer.Length)}"); //byte[] resultBuffer = PareReceiveBufferData(receivedBuffer, receivedBuffer.Length); //List tagInfoList = Device_DealTagInfoList(resultBuffer); //string info = ""; //if (tagInfoList != null && tagInfoList.Count > 0) //{ // tagInfoList = tagInfoList.Where((x, i) => tagInfoList.FindIndex(z => z.EPCstring == x.EPCstring) == i).ToList(); // info = string.Join(",", tagInfoList.Select(item => item.EPCstring)); //} //else //{ // info = "Nodata"; //} //_Action?.Invoke(m_deviceID, tagInfoList); } else { //Log.Information($"{m_deviceID},IP:{m_strIP}接收原始报文{_stringChange.bytesToHexStr(receivedBuffer, receivedBuffer.Length)}"); } } else { } return EasyTask.CompletedTask; }; Log.Information($"{m_deviceID},IP:{m_strIP}连接成功"); return true; } catch (Exception e) { Log.Information($"{m_deviceID},IP:{m_strIP}数据接收异常" + e.Message); return false; } } /// /// 真心跳设置 /// /// public override async Task Set_HeartBeat(byte second) { byte[] data = new byte[3]; data[0] = 0x00; data[1] = second; data[2] = 0x01; BaseSendDataEntity entity = new BaseSendDataEntity() { Code = 0xBF, Data = data }; byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity); var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); using (var responsedData = await waitClient.SendThenResponseAsync(result, 2000)) { var reciveBuffer = responsedData.Memory.ToArray(); byte[] resultBuffer = PareReceiveBufferData(reciveBuffer, reciveBuffer.Length); Log.Information($"{m_deviceID}接收读取指令{_stringChange.bytesToHexStr(resultBuffer, resultBuffer.Length)}"); if (resultBuffer[3] == 0xBF || resultBuffer[4] == 0x00) { return true; } else { return false; } } } /// /// 异步按时间段盘点 /// /// /// /// public override async Task> GetRFIDAsync(int timeout = 1500) { List tagInfoList = new List(); byte[] u16byte = new byte[2]; byte[] bCRC = new byte[4]; try { #region 指令封装 MessagePack pMessagePack = new MessagePack(); pMessagePack.m_pData = new byte[8]; pMessagePack.m_pData[0] = 0xAA; pMessagePack.m_pData[1] = 0x55; pMessagePack.m_pData[2] = 0x02; pMessagePack.m_pData[3] = 0x02; //1s pMessagePack.m_pData[4] = 0x03; pMessagePack.m_pData[5] = 0xE8; //2s //pMessagePack.m_pData[4] = 0x07; //pMessagePack.m_pData[5] = 0xD0; //3s //pMessagePack.m_pData[4] = 0x0B; //pMessagePack.m_pData[5] = 0xA0; Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 4); pMessagePack.m_pData[6] = _stringChange.CalculateVerify(bCRC, bCRC.Length); pMessagePack.m_pData[7] = 0x0D; #endregion 指令封装 var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, timeout)) { var reciveBuffer = responsedData.Memory.ToArray(); Log.Information($"{m_deviceID}发送读取指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}"); byte[] resultBuffer = PareReceiveBufferData(reciveBuffer, reciveBuffer.Length); Log.Information($"{m_deviceID}接收读取指令{_stringChange.bytesToHexStr(resultBuffer, resultBuffer.Length)}"); tagInfoList = Device_DealTagInfoList(resultBuffer); return tagInfoList; } } catch (Exception e) { Log.Information($"{m_deviceID}数据接收异常" + e); return tagInfoList; //throw new InvalidOperationException($"{m_strIP}按时间段盘点异常:{e.Message}"); } } /// /// 设置GPIO /// /// /// /// /// public override async Task WriteAlarmLight(int port, UInt16 Timedout) { byte[] u16byte = new byte[2]; byte[] bCRC = new byte[6]; try { #region 指令封装 MessagePack pMessagePack = new MessagePack(); pMessagePack.m_pData = new byte[10]; pMessagePack.m_pData[0] = 0xAA; pMessagePack.m_pData[1] = 0x55; pMessagePack.m_pData[2] = 0x04; pMessagePack.m_pData[3] = 0x51; pMessagePack.m_pData[4] = (byte)port; pMessagePack.m_pData[5] = 0x00; u16byte = BitConverter.GetBytes(Timedout); //超时时间 u16byte = _stringChange.Swap16Bytes(u16byte); //协议里为大端在前 Array.Copy(u16byte, 0, pMessagePack.m_pData, 6, 2); Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 6); pMessagePack.m_pData[8] = _stringChange.CalculateVerify(bCRC, bCRC.Length); pMessagePack.m_pData[9] = 0x0D; #endregion 指令封装 var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000)) { var reciveBuffer = responsedData.Memory.ToArray(); if (reciveBuffer[3] == 0x51) { return true; } } return false; } catch (Exception e) { throw new InvalidOperationException($"{m_strIP}设置GPIO异常:{e.Message}"); } } /// /// 设置功率 /// /// /// public override async Task Set_Rf(int iDbi) { byte[] u16byte = new byte[2]; byte[] bCRC = new byte[22]; try { #region 指令封装 iDbi = iDbi * 100; MessagePack pMessagePack = new MessagePack(); pMessagePack.m_pData = new byte[26]; pMessagePack.m_pData[0] = 0xAA; pMessagePack.m_pData[1] = 0x55; pMessagePack.m_pData[2] = 0x14; pMessagePack.m_pData[3] = 0x42; pMessagePack.m_pData[4] = 0x01; u16byte = BitConverter.GetBytes(iDbi); //功率 u16byte = _stringChange.Swap16Bytes(u16byte); //协议里为大端在前 Array.Copy(u16byte, 0, pMessagePack.m_pData, 5, 2); u16byte = BitConverter.GetBytes(iDbi); //功率 u16byte = _stringChange.Swap16Bytes(u16byte); //协议里为大端在前 Array.Copy(u16byte, 0, pMessagePack.m_pData, 7, 2); pMessagePack.m_pData[9] = 0x02; u16byte = BitConverter.GetBytes(iDbi); //功率 u16byte = _stringChange.Swap16Bytes(u16byte); //协议里为大端在前 Array.Copy(u16byte, 0, pMessagePack.m_pData, 10, 2); u16byte = BitConverter.GetBytes(iDbi); //功率 u16byte = _stringChange.Swap16Bytes(u16byte); //协议里为大端在前 Array.Copy(u16byte, 0, pMessagePack.m_pData, 12, 2); pMessagePack.m_pData[14] = 0x03; u16byte = BitConverter.GetBytes(iDbi); //功率 u16byte = _stringChange.Swap16Bytes(u16byte); //协议里为大端在前 Array.Copy(u16byte, 0, pMessagePack.m_pData, 15, 2); u16byte = BitConverter.GetBytes(iDbi); //功率 u16byte = _stringChange.Swap16Bytes(u16byte); //协议里为大端在前 Array.Copy(u16byte, 0, pMessagePack.m_pData, 17, 2); pMessagePack.m_pData[19] = 0x04; u16byte = BitConverter.GetBytes(iDbi); //功率 u16byte = _stringChange.Swap16Bytes(u16byte); //协议里为大端在前 Array.Copy(u16byte, 0, pMessagePack.m_pData, 20, 2); u16byte = BitConverter.GetBytes(iDbi); //功率 u16byte = _stringChange.Swap16Bytes(u16byte); //协议里为大端在前 Array.Copy(u16byte, 0, pMessagePack.m_pData, 22, 2); Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 22); pMessagePack.m_pData[24] = _stringChange.CalculateVerify(bCRC, bCRC.Length); pMessagePack.m_pData[25] = 0x0D; #endregion 指令封装 var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); Log.Information($"{m_deviceID}发送修改功率指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}"); using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000)) { var reciveBuffer = responsedData.Memory.ToArray(); Log.Information($"{m_deviceID}接收修改功率指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); if (reciveBuffer[3] == 0x42) { return true; } } return false; } catch (Exception e) { return false; //throw new InvalidOperationException($"{m_strIP}设置功率异常:{e.Message}"); } } public override async Task Get_Rf() { int DB = 0; byte[] u16byte = new byte[2]; byte[] bCRC = new byte[2]; try { #region 指令封装 MessagePack pMessagePack = new MessagePack(); pMessagePack.m_pData = new byte[6]; pMessagePack.m_pData[0] = 0xAA; pMessagePack.m_pData[1] = 0x55; pMessagePack.m_pData[2] = 0x00; pMessagePack.m_pData[3] = 0x72; Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 2); pMessagePack.m_pData[4] = _stringChange.CalculateVerify(bCRC, bCRC.Length); pMessagePack.m_pData[5] = 0x0D; #endregion 指令封装 var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000)) { var reciveBuffer = responsedData.Memory.ToArray(); Log.Information($"{m_deviceID}接收修改功率指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); if (reciveBuffer[3] == 0x72) { byte[] bDB = new byte[2]; bDB[0] = reciveBuffer[6]; bDB[1] = reciveBuffer[7]; DB = Convert.ToInt32(_stringChange.bytesToHexStr(bDB, 2), 16) / 100; return DB.ToString(); } } return DB.ToString(); } catch (Exception e) { return DB.ToString(); //throw new InvalidOperationException($"{m_strIP}设置功率异常:{e.Message}"); } } public override bool GetOnlineStatus() { try { return _tcpClient.Online; } catch (Exception e) { return false; } } public override void Close() { try { _tcpClient.CloseAsync(); //_tcpClient.Dispose(); } catch (Exception ex) { Log.Information(ex.Message); } } /// /// 停止连续盘点 /// /// public override async Task Set_StopIdentify() { byte[] bCRC = new byte[4]; try { #region 指令封装 MessagePack pMessagePack = new MessagePack(); pMessagePack.m_pData = new byte[8]; pMessagePack.m_pData[0] = 0xAA; pMessagePack.m_pData[1] = 0x55; pMessagePack.m_pData[2] = 0x02; pMessagePack.m_pData[3] = 0x12; pMessagePack.m_pData[4] = 0x00; pMessagePack.m_pData[5] = 0x00; Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 4); pMessagePack.m_pData[6] = _stringChange.CalculateVerify(bCRC, bCRC.Length); pMessagePack.m_pData[7] = 0x0D; #endregion 指令封装 _tcpClient.SendAsync(pMessagePack.m_pData).GetAwaiter().GetResult(); //var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() //{ // FilterFunc = response => // { // // 检查响应数据是否符合预期 // if (response.Memory.Length > 0) // { // // 可以根据实际情况添加更多的检查逻辑 // return true; // } // return false; // } //}); //Log.Information($"{m_deviceID}发送停止连续盘点指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}"); //using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000)) //{ // var reciveBuffer = responsedData.Memory.ToArray(); // Log.Information($"{m_deviceID}接收停止连续盘点指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); // if (reciveBuffer[3] == 0x12) // { // return true; // } //} //return false; return true; } catch (Exception e) { //throw new InvalidOperationException($"{m_strIP}暂停盘点异常:{e.Message}"); Log.Error($"{m_deviceID},IP:{m_strIP}暂停盘点异常:{e.Message}"); return false; } } /// /// 开始连续盘点 /// /// public override async Task Set_BeginIdentify() { byte[] bCRC = new byte[4]; try { #region 指令封装 MessagePack pMessagePack = new MessagePack(); pMessagePack.m_pData = new byte[8]; pMessagePack.m_pData[0] = 0xAA; pMessagePack.m_pData[1] = 0x55; pMessagePack.m_pData[2] = 0x02; pMessagePack.m_pData[3] = 0x11; pMessagePack.m_pData[4] = 0x00; pMessagePack.m_pData[5] = 0x00; Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 4); pMessagePack.m_pData[6] = _stringChange.CalculateVerify(bCRC, bCRC.Length); pMessagePack.m_pData[7] = 0x0D; #endregion 指令封装 _tcpClient.SendAsync(pMessagePack.m_pData).GetAwaiter().GetResult(); //var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() //{ // FilterFunc = response => // { // // 检查响应数据是否符合预期 // if (response.Memory.Length > 0) // { // // 可以根据实际情况添加更多的检查逻辑 // return true; // } // return false; // } //}); //Log.Information($"{m_deviceID}发送连续盘点指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}"); //using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000)) //{ // var reciveBuffer = responsedData.Memory.ToArray(); // Log.Information($"{m_deviceID}接收连续盘点指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); // if (reciveBuffer[3] == 0x11) // { // return true; // } //} return true; } catch (Exception e) { return false; //throw new InvalidOperationException($"{m_strIP}设置功率异常:{e.Message}"); } } /// /// 写入 /// /// /// /// public override async Task Set_Write(byte[] pSelectData, string pWriteData) { byte[] bWriteData = null; if (Convert.ToByte(pWriteData.Length % 2) != 0) { bWriteData = new byte[pWriteData.Length + 1]; } else { bWriteData = new byte[pWriteData.Length]; } if (pSelectData == null || pSelectData.Count() == 0) { pSelectData = Encoding.ASCII.GetBytes("JG26522604101"); } if (string.IsNullOrEmpty(pWriteData)) { bWriteData = Encoding.ASCII.GetBytes("JG26522604102"); } else { byte[] bytes = Encoding.ASCII.GetBytes(pWriteData); Array.Copy(bytes, 0, bWriteData, 0, bytes.Length); //bWriteData = Encoding.ASCII.GetBytes(pWriteData); } //计算PC并衔接 byte[] finalWriteData = new byte[bWriteData.Length + 2]; byte[] pc = _stringChange.IntToBytes(2, ((bWriteData.Length / 2) * 8)).Reverse().ToArray(); Array.Copy(pc, 0, finalWriteData, 0, 2); Array.Copy(bWriteData, 0, finalWriteData, 2, bWriteData.Length); try { #region 指令封装 //自动根据写入数据封装 Base03HENtity rawData = new Base03HENtity() { TimeOut = _stringChange.IntToBytes(2, 1000), AccessPassword = _stringChange.IntToBytes(4, 0), SelectBank = 01, SelectAddress = _stringChange.IntToBytes(4, 32), SelectLength = (byte)(pSelectData.Count() * 8), SelectData = pSelectData, WriteBank = 01, WriteAddress = _stringChange.IntToBytes(4, 1), WordCount = (byte)((finalWriteData.Count() / 2)), WriteData = finalWriteData }; int selectLength = rawData.SelectLength / 8; int wordCount = rawData.WordCount * 2; byte[] bytes = new byte[2 + 4 + 1 + 4 + 1 + selectLength + 1 + 4 + 1 + wordCount]; int index = 0; Array.Copy(rawData.TimeOut, 0, bytes, index, 2); index += 2; Array.Copy(rawData.AccessPassword, 0, bytes, index, 4); index += 4; bytes[index] = rawData.SelectBank; index++; Array.Copy(rawData.SelectAddress, 0, bytes, index, 4); index += 4; bytes[index] = rawData.SelectLength; index++; Array.Copy(rawData.SelectData, 0, bytes, index, selectLength); index += selectLength; bytes[index] = rawData.WriteBank; index++; Array.Copy(rawData.WriteAddress, 0, bytes, index, 4); index += 4; bytes[index] = rawData.WordCount; index++; Array.Copy(rawData.WriteData, 0, bytes, index, wordCount); index += wordCount; BaseSendDataEntity entity = new BaseSendDataEntity() { Code = 0x03, Data = bytes }; byte[] result = BaseRFIDDataAnalyse.BaseSendDataAnalyse(entity); #endregion 指令封装 var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); Log.Information($"{m_deviceID}发送写入指令{_stringChange.bytesToHexStr(result, result.Length)}"); using (var responsedData = await waitClient.SendThenResponseAsync(result, 2000)) { var reciveBuffer = responsedData.Memory.ToArray(); Log.Information($"{m_deviceID}接收写入指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); if (reciveBuffer[3] == 0x03 && reciveBuffer[4] == 0x00) { Log.Information($"写入成功,写入数值{pWriteData}"); return true; } } return false; } catch (Exception e) { throw new InvalidOperationException($"{m_strIP}写入异常:{e.Message}"); } } #region 标签解析 /// /// 状态机函数 /// /// /// /// /// private byte[] PareReceiveBufferData(byte[] buffer, int iLen) { RecvState enumRecvState = RecvState.WaitingBeginChar1_State; int m_iPosition = 0; UInt16 m_iFullMessageLength = 0; int iBarcodeLength = 0;//条码长度 ArrayList m_FrecvData = new ArrayList(); byte m_iVerify = 0; try { var bufferStr = _stringChange.bytesToHexStr(buffer, iLen); byte[] m_szFullMessage = new byte[iLen]; for (int i = 0; i < iLen; i++) { switch (enumRecvState) { case RecvState.WaitingBeginChar1_State: //开始接受数据帧1 0xBB Array.Clear(m_szFullMessage, 0, iLen);//清空为0 if (buffer[i] == 0xBB) { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; enumRecvState = RecvState.WaitingBeginChar2_State; } else { m_iFullMessageLength = 0; m_iPosition = 0; enumRecvState = RecvState.WaitingBeginChar1_State; } break; case RecvState.WaitingBeginChar2_State: //开始接受数据帧1 0xDD if (buffer[i] == 0xDD) { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; enumRecvState = RecvState.WaitingForBarcodeLength_State; } else { m_iFullMessageLength = 0; m_iPosition = 0; enumRecvState = RecvState.WaitingBeginChar1_State; } break; case RecvState.WaitingForBarcodeLength_State: //开始接受数据长度(TagCount - EPC) m_szFullMessage[m_iPosition] = buffer[i]; iBarcodeLength = buffer[i]; //单组标签:18;两组标签:35 m_iPosition++; enumRecvState = RecvState.WaitingForCode_State; break; case RecvState.WaitingForCode_State: //开始接受指令编号 if (buffer[i] == 0x01) { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; enumRecvState = RecvState.WaitingForStus_State; } else if (buffer[i] == 0x02) { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; enumRecvState = RecvState.WaitingForStus_State; } else if (buffer[i] == 0x42) { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; enumRecvState = RecvState.WaitingForStus_State; } else if (buffer[i] == 0x72) { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; enumRecvState = RecvState.WaitingForStus_State; } else if (buffer[i] == 0x90) // 如果是心跳BB DD 01 90 00 1F 8E 0D { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; enumRecvState = RecvState.WaitingForEndChar_State; } else if (buffer[i] == 0xBF) // 如果是心跳BB DD 04 BF 00 00 00 F9 0B 49 0D { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; enumRecvState = RecvState.WaitingForEndChar_State; } else { m_iFullMessageLength = 0; m_iPosition = 0; enumRecvState = RecvState.WaitingBeginChar1_State; } break; case RecvState.WaitingForStus_State: //开始接受状态码 if (buffer[i] == 0x00) { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; enumRecvState = RecvState.WaitingForTagCount_State; } else if (buffer[i] == 0x40) { m_szFullMessage[m_iPosition] = buffer[i]; //LogService.Instance.Debug("RFU620等待接受WaitingForEndChar_State:Noread"); lock (m_FrecvData) { m_FrecvData.Add(m_szFullMessage); } m_iPosition = 0; i = iLen; enumRecvState = RecvState.WaitingBeginChar1_State; //LogService.Instance.Debug("RFly-I160状态机结束。"); } break; case RecvState.WaitingForTagCount_State: //开始接受标签组数 Array.Copy(buffer, i, m_szFullMessage, m_iPosition, iBarcodeLength);//m_iPosition = 5 byte[] tempData = new byte[iBarcodeLength]; Array.Clear(tempData, 0, iBarcodeLength); Array.Copy(buffer, i, tempData, 0, iBarcodeLength); m_iPosition = m_iPosition + iBarcodeLength; //m_iPosition = 39 i = i + iBarcodeLength - 1; //i = 39 enumRecvState = RecvState.WaitingForXor_State; break; case RecvState.WaitingForXor_State: //开始比对校验位 Rfly160 byte[] m_CRCVerify = new byte[1024]; //此数组用于校验位计算 Array.Clear(m_CRCVerify, 0, m_CRCVerify.Length); Array.Copy(m_szFullMessage, 2, m_CRCVerify, 0, iBarcodeLength + 3); //校验位计算是从Length - EPC 结束 m_szFullMessage[m_iPosition] = buffer[i]; m_iVerify = m_szFullMessage[m_iPosition]; if (m_iVerify == _stringChange.CalculateVerify(m_CRCVerify, m_CRCVerify.Length)) { m_iPosition++; enumRecvState = RecvState.WaitingForEndChar_State; } else //如果校验不成功 { m_iFullMessageLength = 0; m_iPosition = 0; enumRecvState = RecvState.WaitingBeginChar1_State; } break; case RecvState.WaitingForEndChar_State: if (buffer[0] == 0xBB && buffer[1] == 0xDD && buffer[2] == 0x00 && buffer[3] != 0x90) //此处为Noread数据显示 { m_szFullMessage[0] = 0xBB; m_szFullMessage[1] = 0xDD; m_szFullMessage[2] = 0x00; lock (m_FrecvData) { m_FrecvData.Add(m_szFullMessage); } m_iPosition = 0; i = iLen; enumRecvState = RecvState.WaitingBeginChar1_State; } else if (buffer[0] == 0xBB && buffer[1] == 0xDD && buffer[2] == 0x04 && buffer[3] == 0xBF) { Array.Copy(buffer, 0, m_szFullMessage, 0, 11); i = 11; lock (m_FrecvData) { m_FrecvData.Add(m_szFullMessage); } i = iLen; } else if (buffer[i] == 0x00) //获取温度 { Array.Copy(buffer, 0, m_szFullMessage, 0, 8); i = 8; lock (m_FrecvData) { m_FrecvData.Add(m_szFullMessage); } i = iLen; } else if (buffer[i] == 0x11) { Array.Copy(buffer, 0, m_szFullMessage, 0, 7); i = 7; lock (m_FrecvData) { m_FrecvData.Add(m_szFullMessage); } } else if (buffer[i] == 0x01) { Array.Copy(buffer, 0, m_szFullMessage, 0, 8); i = 8; lock (m_FrecvData) { m_FrecvData.Add(m_szFullMessage); } } else { m_szFullMessage[m_iPosition] = buffer[i]; m_iPosition++; if (buffer[i] == 0x0D) { lock (m_FrecvData) { m_FrecvData.Add(m_szFullMessage); } } } m_iPosition = 0; enumRecvState = RecvState.WaitingBeginChar1_State; break; } } return m_szFullMessage; } catch (Exception e) { throw new InvalidOperationException($"状态机逻辑处理异常:{e.Message}"); } } public List Device_LXDealTagInfoList(byte[] AutoDealReportData) { List tagInfoList = new List(); byte[] bResultEPC_Data = new byte[14]; byte[] m_AutoReadEPC = null; int m_readEPCDataLen = 0; try { //mutauto.WaitOne(); int iFirstCountPos = 5; //第一次读取标签次数位置 int iFirstRSSIPos = 6; //第一次读取标签强度位置 int iFirstAnt = 7; int iFirstPC = 8; //第一次读取标签天线位置 int iFirstLeftBarcketPos = 10;//EPC数据起始位置 UInt16 tempDataCount = 0; int tempDataRSSI = 0; UInt16 tempDataANT = 0; int iBarcodeGroupCount = Convert.ToInt32(AutoDealReportData[5].ToString()); //标签组数 int iBarcodeLength = Convert.ToInt32(AutoDealReportData[2].ToString()) - 5; //标签长度 int iCommonSecondFlag = 0; for (int j = 0; j < iBarcodeGroupCount; j++) { TagInfo tag = new TagInfo(); byte[] tempPCByte = new byte[2]; //取出PC Array.Clear(tempPCByte, 0, 2); Array.Copy(AutoDealReportData, iFirstPC, tempPCByte, 0, 2); //int pc = Convert.ToInt32(tempPCByte[0].ToString("X")); //PC转二进制取前五位转十进制 int epcLength = Convert.ToInt32(Convert.ToString(Convert.ToInt64(tempPCByte[0].ToString("X"), 16), 2).PadLeft(8, '0').Substring(0, 5), 2) * 2; //int epcLength = EPCLengthByPC(pc); iBarcodeLength = epcLength; byte[] tempDataByte = new byte[epcLength]; Array.Clear(tempDataByte, 0, iBarcodeLength); Array.Copy(AutoDealReportData, iFirstLeftBarcketPos, tempDataByte, 0, iBarcodeLength); byte[] tempCountByte = new byte[1]; //取出标签次数 Array.Clear(tempCountByte, 0, 1); Array.Copy(AutoDealReportData, iFirstCountPos, tempCountByte, 0, 1); tempDataCount = tempCountByte[0]; byte[] tempRSSIByte = new byte[1]; //取出标签强度 Array.Clear(tempRSSIByte, 0, 1); Array.Copy(AutoDealReportData, iFirstRSSIPos, tempRSSIByte, 0, 1); tempDataRSSI = _stringChange.HexStringToNegative(_stringChange.bytesToHexStr(tempRSSIByte, 1)); #region add by wenjy 20220829 取出天线号 byte[] tempAntByte = new byte[1]; //取出天线号 Array.Clear(tempAntByte, 0, 1); Array.Copy(AutoDealReportData, iFirstAnt, tempAntByte, 0, 1); tempDataANT = tempAntByte[0]; #endregion tag.Count = tempDataCount; tag.RSSI = tempDataRSSI; tag.EPC = tempDataByte; //tag.EPCstring = _stringChange.bytesToHexStr(tempDataByte, tempDataByte.Length).Substring(0, 8); tag.EPCstring = _stringChange.bytesToHexStr(tempDataByte, tempDataByte.Length); tag.PC = tempPCByte; tag.Antana = tempDataANT; tagInfoList.Add(tag); int iBarcodeListLen = tagInfoList.Count; //特别注意,必须这样,要不然会多一条数据 iFirstCountPos = iFirstCountPos + iBarcodeLength + 5; //次数 iFirstRSSIPos = iFirstCountPos + 1; //强度 iFirstAnt = iFirstRSSIPos + 1; //天线 iFirstPC = iFirstAnt + 1; iFirstLeftBarcketPos = iFirstLeftBarcketPos + iBarcodeLength + 5; _RefreshLogMessageAction?.Invoke($"----{m_deviceID}第[" + (iCommonSecondFlag + 1) + "]次数据解析为:" + tag.EPCstring + ",\r\n读取标签次数:[" + tempDataCount + "],标签信号强度:[" + tempDataRSSI + "],天线号:[" + tempDataANT + "]"); Log.Information($"----{m_deviceID}第[" + (iCommonSecondFlag + 1) + "]次数据解析为:" + tag.EPCstring + ",读取标签次数:[" + tempDataCount + "],标签信号强度:[" + tempDataRSSI + "],天线号:[" + tempDataANT + "]"); iCommonSecondFlag++; if (iCommonSecondFlag == iBarcodeGroupCount) { TagInfo bestTag = tagInfoList .OrderByDescending(t => t.Count) // 第一条件:Count从大到小 .ThenByDescending(t => t.RSSI) // 第二条件:RSSI从大到小 .FirstOrDefault(); List bestTagList = new List(); bestTagList.Add(bestTag); //mutauto.ReleaseMutex(); //_logger.LogInformation("《《《返回标签数据!"); return bestTagList; } } return tagInfoList; } catch (Exception ex) { //mutauto.ReleaseMutex(); Log.Information($"{m_deviceID},IP:{m_strIP}Device_AutoDealContent异常" + ex.Message); return tagInfoList; //throw new InvalidOperationException($"Device_AutoDealContent 自动处理函数异常:{ex.Message}"); } } //private Mutex mutauto = new Mutex(); /// /// 解析函数 /// /// /// /// public List Device_DealTagInfoList(byte[] AutoDealReportData) { List tagInfoList = new List(); byte[] bResultEPC_Data = new byte[14]; byte[] m_AutoReadEPC = null; int m_readEPCDataLen = 0; try { //mutauto.WaitOne(); int iFirstCountPos = 6; //第一次读取标签次数位置 int iFirstRSSIPos = 7; //第一次读取标签强度位置 int iFirstAnt = 8; int iFirstPC = 9; //第一次读取标签天线位置 int iFirstLeftBarcketPos = 11;//EPC数据起始位置 UInt16 tempDataCount = 0; int tempDataRSSI = 0; UInt16 tempDataANT = 0; int iBarcodeGroupCount = Convert.ToInt32(AutoDealReportData[5].ToString()); //标签组数 int iBarcodeLength = 12; //标签长度 int iCommonSecondFlag = 0; for (int j = 0; j < iBarcodeGroupCount; j++) { TagInfo tag = new TagInfo(); byte[] tempPCByte = new byte[2]; //取出PC Array.Clear(tempPCByte, 0, 2); Array.Copy(AutoDealReportData, iFirstPC, tempPCByte, 0, 2); //int pc = Convert.ToInt32(tempPCByte[0].ToString("X")); //PC转二进制取前五位转十进制 int epcLength = Convert.ToInt32(Convert.ToString(Convert.ToInt64(tempPCByte[0].ToString("X"), 16), 2).PadLeft(8, '0').Substring(0, 5), 2) * 2; //int epcLength = EPCLengthByPC(pc); iBarcodeLength = epcLength; byte[] tempDataByte = new byte[epcLength]; Array.Clear(tempDataByte, 0, iBarcodeLength); Array.Copy(AutoDealReportData, iFirstLeftBarcketPos, tempDataByte, 0, iBarcodeLength); byte[] tempCountByte = new byte[1]; //取出标签次数 Array.Clear(tempCountByte, 0, 1); Array.Copy(AutoDealReportData, iFirstCountPos, tempCountByte, 0, 1); tempDataCount = tempCountByte[0]; byte[] tempRSSIByte = new byte[1]; //取出标签强度 Array.Clear(tempRSSIByte, 0, 1); Array.Copy(AutoDealReportData, iFirstRSSIPos, tempRSSIByte, 0, 1); tempDataRSSI = _stringChange.HexStringToNegative(_stringChange.bytesToHexStr(tempRSSIByte, 1)); #region add by wenjy 20220829 取出天线号 byte[] tempAntByte = new byte[1]; //取出天线号 Array.Clear(tempAntByte, 0, 1); Array.Copy(AutoDealReportData, iFirstAnt, tempAntByte, 0, 1); tempDataANT = tempAntByte[0]; #endregion tag.Count = tempDataCount; tag.RSSI = tempDataRSSI; tag.EPC = tempDataByte; //tag.EPCstring = _stringChange.bytesToHexStr(tempDataByte, tempDataByte.Length).Substring(0, 8); tag.EPCstring = _stringChange.bytesToHexStr(tempDataByte, tempDataByte.Length); tag.PC = tempPCByte; tag.Antana = tempDataANT; tagInfoList.Add(tag); int iBarcodeListLen = tagInfoList.Count; //特别注意,必须这样,要不然会多一条数据 iFirstCountPos = iFirstCountPos + iBarcodeLength + 5; //次数 iFirstRSSIPos = iFirstCountPos + 1; //强度 iFirstAnt = iFirstRSSIPos + 1; //天线 iFirstPC = iFirstAnt + 1; iFirstLeftBarcketPos = iFirstLeftBarcketPos + iBarcodeLength + 5; _RefreshLogMessageAction?.Invoke($"----{m_deviceID}第[" + (iCommonSecondFlag + 1) + "]次数据解析为:" + tag.EPCstring + ",\r\n读取标签次数:[" + tempDataCount + "],标签信号强度:[" + tempDataRSSI + "],天线号:[" + tempDataANT + "]"); Log.Information($"----{m_deviceID}第[" + (iCommonSecondFlag + 1) + "]次数据解析为:" + tag.EPCstring + ",读取标签次数:[" + tempDataCount + "],标签信号强度:[" + tempDataRSSI + "],天线号:[" + tempDataANT + "]"); iCommonSecondFlag++; if (iCommonSecondFlag == iBarcodeGroupCount) { TagInfo bestTag = tagInfoList .OrderByDescending(t => t.Count) // 第一条件:Count从大到小 .ThenByDescending(t => t.RSSI) // 第二条件:RSSI从大到小 .FirstOrDefault(); List bestTagList = new List(); bestTagList.Add(bestTag); //mutauto.ReleaseMutex(); //_logger.LogInformation("《《《返回标签数据!"); return bestTagList; } } return tagInfoList; } catch (Exception ex) { //mutauto.ReleaseMutex(); Log.Information($"{m_deviceID},IP:{m_strIP}Device_AutoDealContent异常" + ex.Message); return tagInfoList; //throw new InvalidOperationException($"Device_AutoDealContent 自动处理函数异常:{ex.Message}"); } } /// 设置过滤参数 /// /// /// public override async Task Set_FilterData(string Filter) { bool iflag = false; string pre = "filter "; //Filter = "FC 08"; try { if (!string.IsNullOrEmpty(Filter)) { if (Filter != "0") { Filter = pre + Filter.Trim().Replace(" ", "").Length / 2 + " " + Filter; } else { Filter = pre + Filter.Trim(); } var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); //Log.Information($"{m_deviceID}发送修改功率指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}"); Filter = Filter + "\r\n"; //byte[] reciveBuffer = await waitClient.SendThenReturnAsync(Filter + "\r\n", 2000); using (var responsedData = await waitClient.SendThenResponseAsync(Filter, 2000)) { var memory = responsedData.Memory; string result = Encoding.GetEncoding("GBK").GetString(memory.ToArray(), 0, memory.Length); Log.Information($"{m_deviceID}接收设置过滤指令{result}"); return true; } //Log.Information($"{m_deviceID}接收修改功率指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); } return iflag; } catch (Exception ex) { return iflag; } } /// /// 获取过滤参数 /// /// public override async Task Get_FilterData() { string iflag = ""; try { var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); //Log.Information($"{m_deviceID}发送修改功率指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}"); //byte[] reciveBuffer = await waitClient.SendThenReturnAsync("filter?\r\n", 2000); using (var responsedData = await waitClient.SendThenResponseAsync("filter?\r\n", 2000)) { var memory = responsedData.Memory; string result = Encoding.GetEncoding("GBK").GetString(memory.ToArray(), 0, memory.Length); Log.Information($"{m_deviceID}接收设置过滤指令{result}"); return result; } return iflag; } catch (Exception ex) { return iflag; } } /// /// 设置频段 /// /// /// public override async Task Set_Frequencyband(string Frequencyband) { bool iflag = false; byte[] bCRC = new byte[3]; try { if (string.IsNullOrEmpty(Frequencyband)) { return iflag; } Frequencyband = StringChange.GetRegionNumber(Frequencyband); MessagePack pMessagePack = new MessagePack(); pMessagePack.m_pData = new byte[7]; pMessagePack.m_pData[0] = 0xAA; pMessagePack.m_pData[1] = 0x55; pMessagePack.m_pData[2] = 0x01; pMessagePack.m_pData[3] = 0x44; pMessagePack.m_pData[4] = byte.Parse(Frequencyband); Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 3); pMessagePack.m_pData[5] = _stringChange.CalculateVerify(bCRC, bCRC.Length); pMessagePack.m_pData[6] = 0x0D; var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); Log.Information($"{m_deviceID}发送设置频段指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}"); using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000)) { var reciveBuffer = responsedData.Memory.ToArray(); Log.Information($"{m_deviceID}接收设置频段指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); if (reciveBuffer[3] == 0x44) { iflag = true; return iflag; } return iflag; } } catch (Exception ex) { return iflag; } } /// /// 获取频段 /// /// /// public override async Task Get_Frequencyband() { string Frequencyband = ""; byte[] u16byte = new byte[2]; byte[] bCRC = new byte[2]; try { #region 指令封装 MessagePack pMessagePack = new MessagePack(); pMessagePack.m_pData = new byte[6]; pMessagePack.m_pData[0] = 0xAA; pMessagePack.m_pData[1] = 0x55; pMessagePack.m_pData[2] = 0x00; pMessagePack.m_pData[3] = 0x74; Array.Copy(pMessagePack.m_pData, 2, bCRC, 0, 2); pMessagePack.m_pData[4] = _stringChange.CalculateVerify(bCRC, bCRC.Length); pMessagePack.m_pData[5] = 0x0D; #endregion 指令封装 var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); Log.Information($"{m_deviceID}发送获取频段指令{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}"); using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000)) { var reciveBuffer = responsedData.Memory.ToArray(); Log.Information($"{m_deviceID}接收获取频段指令{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); if (reciveBuffer[3] == 0x74) { byte bDB = reciveBuffer[5]; Frequencyband = StringChange.GetRegionByNumber(bDB.ToString()); return Frequencyband; } } return Frequencyband; } catch (Exception e) { return Frequencyband; //throw new InvalidOperationException($"{m_strIP}设置功率异常:{e.Message}"); } } private void DealMessageData(byte[] reciveBuffer) { try { //连续盘点返回 if (reciveBuffer[3] == 0x01) { Log.Information($"{m_deviceID},IP:{m_strIP}接收自报{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); byte[] resultBuffer = PareReceiveBufferData(reciveBuffer, reciveBuffer.Length); List tagInfoList = Device_LXDealTagInfoList(resultBuffer); string info = ""; if (tagInfoList != null && tagInfoList.Count > 0) { tagInfoList = tagInfoList.Where((x, i) => tagInfoList.FindIndex(z => z.EPCstring == x.EPCstring) == i).ToList(); info = string.Join(",", tagInfoList.Select(item => item.EPCstring)); _Action?.Invoke(m_deviceID, tagInfoList); } else { info = "Nodata"; } } //按时间段盘点返回 if (reciveBuffer[3] == 0x02) { Log.Information($"{m_deviceID},IP:{m_strIP}接收自报{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); byte[] resultBuffer = PareReceiveBufferData(reciveBuffer, reciveBuffer.Length); List tagInfoList = Device_DealTagInfoList(resultBuffer); string info = ""; if (tagInfoList != null && tagInfoList.Count > 0) { tagInfoList = tagInfoList.Where((x, i) => tagInfoList.FindIndex(z => z.EPCstring == x.EPCstring) == i).ToList(); info = string.Join(",", tagInfoList.Select(item => item.EPCstring)); } else { info = "Nodata"; } _Action?.Invoke(m_deviceID, tagInfoList); } } catch (Exception ex) { Log.Information($"》》》设备:{m_deviceID},IP:{m_strIP},处理数据异常:{ex}"); } } public override async Task SendHeartPack() { bool iflag = false; byte[] bCRC = new byte[2]; try { MessagePack pMessagePack = new MessagePack(); pMessagePack.m_pData = new byte[6]; //获取温度 pMessagePack.m_pData[0] = 0xAA; pMessagePack.m_pData[1] = 0x55; pMessagePack.m_pData[2] = 0x00; pMessagePack.m_pData[3] = 0x90; pMessagePack.m_pData[4] = 0x90; pMessagePack.m_pData[5] = 0x0D; var waitClient = _tcpClient.CreateWaitingClient(new WaitingOptions() { FilterFunc = response => { // 检查响应数据是否符合预期 if (response.Memory.Length > 0) { // 可以根据实际情况添加更多的检查逻辑 return true; } return false; } }); _logger.Data($"{m_deviceID},IP:{m_strIP}发送心跳包{_stringChange.bytesToHexStr(pMessagePack.m_pData, pMessagePack.m_pData.Length)}"); using (var responsedData = await waitClient.SendThenResponseAsync(pMessagePack.m_pData, 2000)) { var reciveBuffer = responsedData.Memory.ToArray(); if (reciveBuffer[3] == 0x90) { if (reciveBuffer.Length == 8) { _logger.Data($"{m_deviceID},IP:{m_strIP}接收心跳包{_stringChange.bytesToHexStr(reciveBuffer, reciveBuffer.Length)}"); iflag = true; return iflag; } //粘包处理 //BBDD01900029B80D BBDD1202000132CD043000333131303432360000000000E90D //BBDD1202000138CF043000333131303035360000000000E20DBBDD01900026B70D else { var messagebuffer = new byte[reciveBuffer.Length - 8]; Array.Copy(reciveBuffer, 8, messagebuffer, 0, reciveBuffer.Length - 8); DealMessageData(messagebuffer); } } if (reciveBuffer[3] == 0x02) { DealMessageData(reciveBuffer); } return iflag; } } catch (Exception ex) { _logger.Data($"》》》设备:{m_deviceID},IP:{m_strIP},心跳包发送超时:{ex}"); return iflag; } } /// /// 将byte数组转换为十六进制字符串(格式:00 0A 0B) /// public string BytesToHexString(byte[] bytes) { if (bytes == null || bytes.Length == 0) return string.Empty; StringBuilder sb = new StringBuilder(); for (int i = 0; i < bytes.Length; i++) { sb.Append(bytes[i].ToString("X2")); if (i < bytes.Length - 1) sb.Append(" "); } return sb.ToString(); } /// /// 将十六进制字符串转换回byte数组 /// public byte[] HexStringToBytes(string hexString) { if (string.IsNullOrWhiteSpace(hexString)) { Console.WriteLine("传入数据为空"); return new byte[0]; } // 移除所有空格 hexString = hexString.Replace(" ", ""); // 检查长度是否为偶数 if (hexString.Length % 2 != 0) Console.WriteLine("格式不正确16进制字符串必须为偶数"); byte[] bytes = new byte[hexString.Length / 2]; try { for (int i = 0; i < bytes.Length; i++) { bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); } } catch { Console.WriteLine("格式不正确"); } return bytes; } #endregion } }