#region << 版 本 注 释 >> /*-------------------------------------------------------------------- * 版权所有 (c) 2025 WenJY 保留所有权利。 * CLR版本:4.0.30319.42000 * 机器名称:Mr.Wen's MacBook Pro * 命名空间:Sln.Rfid.Business * 唯一标识:70110000-AA48-4CDD-B5F9-215E08E2BE8E * * 创建者:WenJY * 电子邮箱: * 创建时间:2025-11-25 14:28:17 * 版本:V1.0.0 * 描述: * *-------------------------------------------------------------------- * 修改人: * 时间: * 修改说明: * * 版本:V1.0.0 *--------------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; using Sln.Rfid.Common; using Sln.Rfid.Model.dao; using Sln.Rfid.Repository.service; using Sln.Rfid.Serilog; using TouchSocket.Core; using TouchSocket.Sockets; namespace Sln.Rfid.Business { public class TagBusiness { private readonly StringChange _stringChange; private readonly SerilogHelper _serilogHelper; private readonly Dictionary _dics; private readonly IRecordTagInfoService _recordTagInfoService; private readonly WebSocketBusiness _webSocket; public TagBusiness(Dictionary dics, StringChange stringChange, SerilogHelper serilogHelper, IRecordTagInfoService recordTagInfoService, WebSocketBusiness webSocket) { _dics = dics; _stringChange = stringChange; _serilogHelper = serilogHelper; _recordTagInfoService = recordTagInfoService; _webSocket = webSocket; } public async void Handle() { if (_dics != null) { foreach (var (item, tcpClient) in _dics) { ReadEpcAsync(item, tcpClient); } } } public async Task ReadEpcAsync(BaseDeviceInfo deviceInfo,TcpClient tcpClient) { tcpClient.Received = (client, e) => { //从服务器收到信息。但是一般byteBlock和requestInfo会根据适配器呈现不同的值。 var byteBlock = e.ByteBlock; int pos = byteBlock.Pos; var bytes = byteBlock.ToArray(); _serilogHelper.Rfid($"收到 {deviceInfo.deviceName} 指令信息:{_stringChange.bytesToHexStr(bytes, bytes.Length)}"); try { if (byteBlock.CanReadLen < 7) { _serilogHelper.Rfid($"{deviceInfo.deviceName} 指令标签长度不足"); this.SaveEpc(deviceInfo, string.Empty, true,"指令标签长度不足"); } else { byteBlock.Read(out byte[] header, 2); byteBlock.Read(out byte[] length, 1); string hexString = BitConverter.ToString(length).Replace("-", ""); int bodyLength = Convert.ToInt32(hexString, 16); byteBlock.Read(out byte[] code, 1); byteBlock.Read(out byte[] status, 1); if (status[0] == 0x40) { _serilogHelper.Rfid($"{deviceInfo.deviceName} 未获取到标签信息"); this.SaveEpc(deviceInfo, string.Empty, true,"未获取到标签信息"); } else { byteBlock.Read(out byte[] count, 1); byteBlock.Read(out byte[] rssi, 1); byteBlock.Read(out byte[] ant, 1); byteBlock.Read(out byte[] pc, 2); byteBlock.Read(out byte[] epc, bodyLength - 5); byteBlock.Read(out byte[] xor, 1); byteBlock.Read(out byte[] end, 1); string epcStr = Encoding.ASCII.GetString(epc).ToUpper(); _serilogHelper.Rfid( $"{deviceInfo.deviceName} EPC指令:{_stringChange.bytesToHexStr(epc, epc.Length)}; EPC信息: {epcStr}"); this.SaveEpc(deviceInfo, epcStr, false,string.Empty); } } } catch (Exception ex) { _serilogHelper.Rfid($"{deviceInfo.deviceName} 指令标签解析失败: " + ex.Message); byteBlock.Pos = pos; this.SaveEpc(deviceInfo, string.Empty, true,"指令标签解析异常"); } return EasyTask.CompletedTask; }; // while (true) // { // using (var receiver = tcpClient.CreateReceiver()) // { // tcpClient.SendAsync(new byte[] // { // 0xAA, 0x55, 0x02, 0x01, 0x00, 0x64, 0x67, 0x0D // }).GetAwaiter(); // // try // { // _serilogHelper.Rfid($"开始读取 {deviceInfo.deviceName} 标签数据"); // using (var cts = new CancellationTokenSource(1000 * 10)) // timeout // { // using (var receiverResult = await receiver.ReadAsync(cts.Token)) // { // // var bytes = receiverResult.Memory.Span.ToArray(); // var byteBlock = receiverResult.ByteBlock; // int pos = byteBlock.Pos; // // var bytes = byteBlock.ToArray(); // // _serilogHelper.Rfid( // $"收到 {deviceInfo.deviceName} 指令信息:{_stringChange.bytesToHexStr(bytes, bytes.Length)}"); // // try // { // if (byteBlock.CanReadLen < 7) // { // _serilogHelper.Rfid($"{deviceInfo.deviceName} 指令标签长度不足"); // // this.SaveEpc(deviceInfo, string.Empty, true,"指令标签长度不足"); // // Thread.Sleep(1000*1); // // continue; // } // // byteBlock.Read(out byte[] header, 2); // byteBlock.Read(out byte[] length, 1); // // string hexString = BitConverter.ToString(length).Replace("-", ""); // int bodyLength = Convert.ToInt32(hexString, 16); // // byteBlock.Read(out byte[] code, 1); // byteBlock.Read(out byte[] status, 1); // // if (status[0] == 0x40) // { // _serilogHelper.Rfid($"{deviceInfo.deviceName} 未获取到标签信息"); // // this.SaveEpc(deviceInfo, string.Empty, true,"未获取到标签信息"); // // Thread.Sleep(1000*1); // // continue; // } // // // byteBlock.Read(out byte[] count, 1); // byteBlock.Read(out byte[] rssi, 1); // byteBlock.Read(out byte[] ant, 1); // byteBlock.Read(out byte[] pc, 2); // byteBlock.Read(out byte[] epc, bodyLength - 5); // byteBlock.Read(out byte[] xor, 1); // byteBlock.Read(out byte[] end, 1); // // string epcStr = Encoding.ASCII.GetString(epc).ToUpper(); // // _serilogHelper.Rfid( // $"{deviceInfo.deviceName} EPC指令:{_stringChange.bytesToHexStr(epc, epc.Length)}; EPC信息: {epcStr}"); // this.SaveEpc(deviceInfo, epcStr, false,string.Empty); // } // catch (Exception e) // { // _serilogHelper.Rfid($"{deviceInfo.deviceName} 指令标签解析失败: " + e.Message); // byteBlock.Pos = pos; // this.SaveEpc(deviceInfo, string.Empty, true,"指令标签解析异常"); // } // } // } // } // catch (Exception e) // { // _serilogHelper.Rfid($"等待 {deviceInfo.deviceName} 指令超时,设备超时未返回"); // } // } // // Thread.Sleep(1000*deviceInfo.readFrequency); // } } /// /// 保存 EPC 条码信息 /// /// /// /// /// public void SaveEpc(BaseDeviceInfo deviceInfo, string epcStr,bool isAlarm,string alarmStr) { try { RecordTagInfo recordTagInfo = new RecordTagInfo(); recordTagInfo.deviceId = deviceInfo.objid; recordTagInfo.readStatus = isAlarm ? '0' : '1'; recordTagInfo.epcStr = epcStr; recordTagInfo.alarmFlag = isAlarm ? '1' : '0'; recordTagInfo.alarmAction = alarmStr; recordTagInfo.recordTime = DateTime.Now; bool isRes = _recordTagInfoService.SplitInsert(new List { recordTagInfo }, out List insertIds); if (isRes) { _serilogHelper.Info( $"{deviceInfo.deviceName} 标签数据保存成功,Id:{JsonConvert.SerializeObject(insertIds)}"); } else { _serilogHelper.Info($"{deviceInfo.deviceName} 标签数据保存失败"); } _webSocket.PushMsg(JsonConvert.SerializeObject(recordTagInfo)); } catch (Exception e) { _serilogHelper.Info($"{deviceInfo.deviceName} 标签数据保存异常:{e.Message}"); } } /// /// 推送设备读取信息 /// /// /// /// /// public void PushEpc(BaseDeviceInfo deviceInfo,bool isSuc, string epcStr,string msg) { } } }