From 10ca37e4e4772896d170e61593a3f8ee387535e0 Mon Sep 17 00:00:00 2001 From: rszn <645583145@qq.com> Date: Mon, 3 Jun 2024 13:24:05 +0800 Subject: [PATCH] =?UTF-8?q?rfid=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HybirdFrameworkDriver/TcpServer/TcpServer.cs | 11 +- Rfid/App.config | 26 ++ Rfid/Program.cs | 22 + Rfid/Properties/AssemblyInfo.cs | 35 ++ Rfid/Rfid.csproj | 162 +++++++ Rfid/Rfid/HttpHandler.cs | 92 ++++ Rfid/Rfid/RfidMgr.cs | 65 +++ Rfid/Rfid/RfidReadModel.cs | 25 ++ Rfid/Rfid/RfidReadWriteTool.cs | 421 +++++++++++++++++++ Rfid/Rfid/RfidServer.cs | 71 ++++ Rfid/Rfid/ViewEventArgs.cs | 25 ++ Rfid/lib/SRGReaderAPI.dll | Bin 0 -> 47104 bytes Rfid/log4net.config | 32 ++ Rfid/packages.config | 30 ++ Service/Service.csproj | 6 + WinFormStarter/Program.cs | 2 +- hnBackVehicle.sln | 7 + 17 files changed, 1026 insertions(+), 6 deletions(-) create mode 100644 Rfid/App.config create mode 100644 Rfid/Program.cs create mode 100644 Rfid/Properties/AssemblyInfo.cs create mode 100644 Rfid/Rfid.csproj create mode 100644 Rfid/Rfid/HttpHandler.cs create mode 100644 Rfid/Rfid/RfidMgr.cs create mode 100644 Rfid/Rfid/RfidReadModel.cs create mode 100644 Rfid/Rfid/RfidReadWriteTool.cs create mode 100644 Rfid/Rfid/RfidServer.cs create mode 100644 Rfid/Rfid/ViewEventArgs.cs create mode 100644 Rfid/lib/SRGReaderAPI.dll create mode 100644 Rfid/log4net.config create mode 100644 Rfid/packages.config diff --git a/HybirdFrameworkDriver/TcpServer/TcpServer.cs b/HybirdFrameworkDriver/TcpServer/TcpServer.cs index 1da7a28..1625c69 100644 --- a/HybirdFrameworkDriver/TcpServer/TcpServer.cs +++ b/HybirdFrameworkDriver/TcpServer/TcpServer.cs @@ -30,14 +30,14 @@ public class TcpServer : IDisposable where TH : IChannelHandler private static ServerBootstrap? bootstrap; private int _port = 9000; - + public LogLevel? LogLevel { get; set; } - + public Action? ChannelInActiveAction { get; set; } public void InitBootstrap() { - + if (LogLevel != null) { InternalLoggerFactory.DefaultFactory.AddProvider(new Log4NetProvider()); @@ -75,7 +75,8 @@ public class TcpServer : IDisposable where TH : IChannelHandler public void Dispose() { Log.Info(this + " Dispose"); - bossGroup?.ShutdownGracefullyAsync(); + bossGroup?.ShutdownGracefullyAsync().Wait(); + workerGroup?.ShutdownGracefullyAsync().Wait(); } private void ResolveEncode(IChannelPipeline pipeline) @@ -135,4 +136,4 @@ public class TcpServer : IDisposable where TH : IChannelHandler Task? channel = bootstrap?.BindAsync(_port); Log.Info($"netty success listen {_port}"); } -} \ No newline at end of file +} diff --git a/Rfid/App.config b/Rfid/App.config new file mode 100644 index 0000000..d9dbf31 --- /dev/null +++ b/Rfid/App.config @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Rfid/Program.cs b/Rfid/Program.cs new file mode 100644 index 0000000..fafcf28 --- /dev/null +++ b/Rfid/Program.cs @@ -0,0 +1,22 @@ +using System; +using System.IO; +using DotNetty.Handlers.Logging; +using log4net.Config; + +namespace Rfid +{ + internal class Program + { + public static void Main(string[] args) + { + XmlConfigurator.ConfigureAndWatch(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + @"\log4net.xml")); + + RfidServer rfidServer = new RfidServer() + { + LogLevel = LogLevel.TRACE + }; + rfidServer.Start(); + Console.In.ReadLine(); + } + } +} diff --git a/Rfid/Properties/AssemblyInfo.cs b/Rfid/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..095f14d --- /dev/null +++ b/Rfid/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Rfid")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Rfid")] +[assembly: AssemblyCopyright("Copyright © 2024")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("053079C7-C9EE-49F4-B9CB-F06D14AEB027")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/Rfid/Rfid.csproj b/Rfid/Rfid.csproj new file mode 100644 index 0000000..71ff1f2 --- /dev/null +++ b/Rfid/Rfid.csproj @@ -0,0 +1,162 @@ + + + + + Debug + AnyCPU + {053079C7-C9EE-49F4-B9CB-F06D14AEB027} + Exe + Properties + Rfid + Rfid + v4.8 + 512 + true + 10 + enable + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\DotNetty.Buffers.0.7.5\lib\net472\DotNetty.Buffers.dll + + + ..\packages\DotNetty.Codecs.0.7.5\lib\net472\DotNetty.Codecs.dll + + + ..\packages\DotNetty.Codecs.Http.0.7.5\lib\net472\DotNetty.Codecs.Http.dll + + + ..\packages\DotNetty.Common.0.7.5\lib\net472\DotNetty.Common.dll + + + ..\packages\DotNetty.Handlers.0.7.5\lib\net472\DotNetty.Handlers.dll + + + ..\packages\DotNetty.Transport.0.7.5\lib\net472\DotNetty.Transport.dll + + + ..\packages\log4net.2.0.15\lib\net45\log4net.dll + + + ..\packages\Microsoft.Bcl.AsyncInterfaces.5.0.0\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll + + + ..\packages\Microsoft.Extensions.Configuration.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Configuration.dll + + + ..\packages\Microsoft.Extensions.Configuration.Abstractions.2.2.0\lib\netstandard2.0\Microsoft.Extensions.Configuration.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Configuration.Binder.2.2.4\lib\netstandard2.0\Microsoft.Extensions.Configuration.Binder.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.5.0.0\lib\net461\Microsoft.Extensions.DependencyInjection.dll + + + ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.5.0.0\lib\net461\Microsoft.Extensions.DependencyInjection.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Logging.5.0.0\lib\net461\Microsoft.Extensions.Logging.dll + + + ..\packages\Microsoft.Extensions.Logging.Abstractions.5.0.0\lib\net461\Microsoft.Extensions.Logging.Abstractions.dll + + + ..\packages\Microsoft.Extensions.Logging.Log4Net.AspNetCore.8.0.0\lib\netstandard2.0\Microsoft.Extensions.Logging.Log4Net.AspNetCore.dll + + + ..\packages\Microsoft.Extensions.Options.5.0.0\lib\net461\Microsoft.Extensions.Options.dll + + + ..\packages\Microsoft.Extensions.Primitives.5.0.0\lib\net461\Microsoft.Extensions.Primitives.dll + + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + + lib\SRGReaderAPI.dll + + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + ..\packages\System.Collections.Immutable.1.5.0\lib\netstandard2.0\System.Collections.Immutable.dll + + + + + + ..\packages\System.Diagnostics.DiagnosticSource.5.0.0\lib\net46\System.Diagnostics.DiagnosticSource.dll + + + ..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.5.0.0\lib\net45\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll + + + ..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll + + + + + + + + + + + + + + + + + + + + + true + Always + PreserveNewest + + + + + + diff --git a/Rfid/Rfid/HttpHandler.cs b/Rfid/Rfid/HttpHandler.cs new file mode 100644 index 0000000..1a50834 --- /dev/null +++ b/Rfid/Rfid/HttpHandler.cs @@ -0,0 +1,92 @@ +using System; +using System.Text; +using DotNetty.Buffers; +using DotNetty.Codecs.Http; +using DotNetty.Common.Utilities; +using DotNetty.Transport.Channels; +using log4net; +using Newtonsoft.Json; + +namespace Rfid; + +public class HttpHandler : SimpleChannelInboundHandler +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(HttpHandler)); + + static readonly AsciiString TypePlain = AsciiString.Cached("text/plain; charset=utf-8"); + static readonly AsciiString TypeJson = AsciiString.Cached("application/json; charset=utf-8"); + static readonly AsciiString OkLength = AsciiString.Cached(Encoding.UTF8.GetBytes("true").Length.ToString()); + static readonly AsciiString FailLength = AsciiString.Cached(Encoding.UTF8.GetBytes("false").Length.ToString()); + static readonly AsciiString ServerName = AsciiString.Cached("Netty"); + static readonly AsciiString ContentTypeEntity = HttpHeaderNames.ContentType; + static readonly AsciiString DateEntity = HttpHeaderNames.Date; + static readonly AsciiString ContentLengthEntity = HttpHeaderNames.ContentLength; + static readonly AsciiString ServerEntity = HttpHeaderNames.Server; + + protected override void ChannelRead0(IChannelHandlerContext ctx, DefaultHttpRequest req) + { + Log.Info($"{req.Uri}, {req}"); + + DefaultFullHttpResponse response = null; + switch (req.Uri) + { + case "/Api/ReadRfidData": + + RfidReadModel? model = RfidMgr.ReadRifd(); + if (model != null) + { + byte[] json = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(model)); + this.WriteResponse(ctx, Unpooled.WrappedBuffer(json), TypeJson, new AsciiString(json.Length.ToString())); + } + else + { + response = new DefaultFullHttpResponse(HttpVersion.Http11, HttpResponseStatus.NoContent, Unpooled.Empty, false); + ctx.WriteAndFlushAsync(response); + } + + break; + case "/Api/BeginRead": + bool beginRead = RfidMgr.BeginRead(); + this.WriteResponse(ctx, Unpooled.WrappedBuffer(Encoding.UTF8.GetBytes(beginRead.ToString())), TypePlain, beginRead?OkLength: FailLength); + break; + case "/Api/StopRead": + var stopRead = RfidMgr.StopRead(); + this.WriteResponse(ctx, Unpooled.WrappedBuffer(Encoding.UTF8.GetBytes(stopRead.ToString())), TypePlain, stopRead?OkLength: FailLength); + break; + case "/Api/Open": + var connected = RfidMgr.Connect(); + this.WriteResponse(ctx, Unpooled.WrappedBuffer(Encoding.UTF8.GetBytes(connected.ToString())), TypePlain, connected?OkLength: FailLength); + break; + case "/Api/Close": + var closeRfid = RfidMgr.CloseRfid(); + this.WriteResponse(ctx, Unpooled.WrappedBuffer(Encoding.UTF8.GetBytes(closeRfid.ToString())), TypePlain, closeRfid?OkLength: FailLength); + break; + default: + response = new DefaultFullHttpResponse(HttpVersion.Http11, HttpResponseStatus.NotFound, Unpooled.Empty, false); + ctx.WriteAndFlushAsync(response); + break; + } + + + } + + void WriteResponse(IChannelHandlerContext ctx, IByteBuffer buf, ICharSequence contentType, + ICharSequence contentLength) + { + DateTime dateTime = DateTime.UtcNow; + // Build the response object. + var response = new DefaultFullHttpResponse(HttpVersion.Http11, HttpResponseStatus.OK, buf, false); + HttpHeaders headers = response.Headers; + headers.Set(ContentTypeEntity, contentType); + headers.Set(ServerEntity, ServerName); + headers.Set(DateEntity, AsciiString.Cached($"{dateTime.DayOfWeek}, {dateTime:dd MMM yyyy HH:mm:ss z}")); + headers.Set(ContentLengthEntity, contentLength); + + // Close the non-keep-alive connection after the write operation is done. + ctx.WriteAsync(response); + } + + public override void ExceptionCaught(IChannelHandlerContext context, Exception exception) => context.CloseAsync(); + + public override void ChannelReadComplete(IChannelHandlerContext context) => context.Flush(); +} diff --git a/Rfid/Rfid/RfidMgr.cs b/Rfid/Rfid/RfidMgr.cs new file mode 100644 index 0000000..0c93804 --- /dev/null +++ b/Rfid/Rfid/RfidMgr.cs @@ -0,0 +1,65 @@ +namespace Rfid; + +public static class RfidMgr +{ + private static RfidReadWriteTool RfidReadWriteTool = new RfidReadWriteTool("172.0.30.100"); + + /// + /// 连接 + /// + /// + public static bool Connect() + { + RfidReadWriteTool.CloseRfid(); + bool bResult = RfidReadWriteTool.ConnectRfid(); + return bResult; + } + + /// + /// 连接 + /// + /// + public static bool Connected() + { + return RfidReadWriteTool.IsConnected; + } + + /// + /// 断开 + /// + /// + public static bool CloseRfid() + { + bool bResult = RfidReadWriteTool.CloseRfid(); + return bResult; + } + + /// + /// 开始读 + /// + /// + public static bool BeginRead() + { + bool bResult = RfidReadWriteTool.ScanRfidUserDataTag(); + return bResult; + } + + /// + /// 停止读 + /// + /// + public static bool StopRead() + { + bool bResult = RfidReadWriteTool.StopRfidResult(); + return bResult; + } + + /// + /// 读取信息 + /// + /// + public static RfidReadModel? ReadRifd() + { + return RfidReadWriteTool.RfidReadModel; + } +} diff --git a/Rfid/Rfid/RfidReadModel.cs b/Rfid/Rfid/RfidReadModel.cs new file mode 100644 index 0000000..e0d6a57 --- /dev/null +++ b/Rfid/Rfid/RfidReadModel.cs @@ -0,0 +1,25 @@ +namespace Rfid; + +public class RfidReadModel +{ + /// + /// 1:成功 0:失败 + /// + public int Result { get; set; } + + /// + /// 车辆VIN码 + /// + public string VelVin { get; set; } + + + /// + /// 车辆MAC地址 + /// + public string? VelMac { set; get; } + + /// + /// 车辆车牌号 + /// + public string VelNo { set; get; } +} diff --git a/Rfid/Rfid/RfidReadWriteTool.cs b/Rfid/Rfid/RfidReadWriteTool.cs new file mode 100644 index 0000000..b72e67c --- /dev/null +++ b/Rfid/Rfid/RfidReadWriteTool.cs @@ -0,0 +1,421 @@ +using System; +using System.Text; +using log4net; +using SRGReaderAPI; + +namespace Rfid; + +public class RfidReadWriteTool +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(RfidReadWriteTool)); + + #region 字段属性 + + /// + /// IP地址 + /// + private string _ipaddr = "172.0.30.9"; + + /// + /// RFID连接IP地址 + /// + public string IpAddr + { + get { return _ipaddr; } + set { _ipaddr = value; } + } + + /// + /// 子网掩码 + /// + private string _subnet = "255.255.255.0"; + + /// + /// RFID连接的子网掩码 + /// + public string Subnet + { + get { return _subnet; } + set { _subnet = value; } + } + + /// + /// 网关 + /// + private string _gateway = "172.0.30.1"; + + /// + /// RFID连接的网关 + /// + public string Gateway + { + get { return _gateway; } + set { _gateway = value; } + } + + /// + /// 端口 + /// + private int _port = 9090; + + /// + /// RFID连接端口 + /// + public int Port + { + get { return _port; } + set { _port = value; } + } + + /// + /// 连接超时时间(ms) + /// + private int _timeout = 1000; + + /// + /// 连接超时时间(ms) + /// + public int TimeOut + { + get { return _timeout; } + set { _timeout = value; } + } + + /// + /// 读写器 + /// + private SReader _rfid_reader = null; + + /// + /// RFID连接客户端 + /// + public SReader RfidReader + { + get { return _rfid_reader; } + set { _rfid_reader = value; } + } + + /// + /// 客户端目前连接状态 + /// + private bool _isconnected = false; + + /// + /// 通讯是否连接 + /// + public bool IsConnected + { + get { return _isconnected; } + set { _isconnected = value; } + } + + /// + /// UserData + /// + private byte[] _user_datas = null; + + #endregion 字段属性 + + #region 事件定义 + + /// + /// 连接状态 + /// + public event EventHandler ConnectedChanged; + + /// + /// 数据已接收 + /// + public event EventHandler DataReceived; + + /// + /// 已发送的数据 + /// + public event EventHandler DataSended; + + + /// + /// 设置监听事件 + /// + /// 是否监听 + /// 监听消息事件 + private void SetConnectEvent(bool isConnected, string msgContent) + { + EventHandler ConnectedHandler; + ConnectedHandler = ConnectedChanged; + if (ConnectedHandler != null) + { + ConnectedHandler.Invoke(this, new ViewEventArgs() { IsConnected = isConnected, MsgContent = msgContent }); + } + } + + /// + /// 设置接收消息事件 + /// + /// 消息内容 + private void SetRecvMsgEvent(string msgContent) + { + EventHandler RecvedHandler; + RecvedHandler = DataReceived; + if (RecvedHandler != null) + { + RecvedHandler.Invoke(this, new ViewMsgEventArgs() { MsgContent = msgContent }); + } + } + + /// + /// 设置发送消息事件 + /// + /// 消息内容 + private void SetSendMsgEvent(string msgContent) + { + EventHandler SendedHandler; + SendedHandler = DataSended; + if (SendedHandler != null) + { + SendedHandler.Invoke(this, new ViewMsgEventArgs() { MsgContent = msgContent }); + } + } + + #endregion 事件定义 + + #region 结构体 + + public RfidReadWriteTool() + { + } + + public RfidReadWriteTool(string ipaddr) + { + _ipaddr = ipaddr; + } + + public RfidReadWriteTool(string ipaddr, string subnet, string gateway, int port) + { + _ipaddr = ipaddr; + _subnet = subnet; + _gateway = gateway; + _port = port; + } + + #endregion 结构体 + + public RfidReadModel RfidReadModel; + + /// + /// RFID读写器连接 + /// + /// + /// + /// -1:初始默认值;0:连接成功;1:超时;2:无响应 + public bool ConnectRfid() + { + Log.Info($"begin to connect tcp://{_ipaddr}"); + _rfid_reader = SReader.Create("tcp://" + _ipaddr); + try + { + _rfid_reader.Connect(); + IsConnected = true; + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + IsConnected = false; + } + + Log.Info($"connect tcp://{_ipaddr} {IsConnected}"); + + SetConnectEvent(_isconnected, "RFID读写器连接成功!"); + _rfid_reader.TagRead += _rfid_reader_TagRead; + return true; + } + + /// + /// 标签触发读取方法 + /// + /// + /// + private void _rfid_reader_TagRead(object sender, TagReadDataEventArgs tagData) + { + try + { + byte[] userDatas = tagData.TagData.Data; + + string strResult = ""; + string[] strTemps = null; + string strVelNo = ""; + if (userDatas != null) + { + string strUser = Encoding.ASCII.GetString(userDatas); + if (!string.IsNullOrEmpty(strUser)) + { + strResult = strUser.Replace("\0", "").Replace(" ", ""); + } + + strTemps = strResult.Split(';'); + + if (strTemps.Length == 4) + { + if (strTemps[3] != "") + { + byte[] bytesVelNo = ToByteByHexStr(strTemps[3]); + Encoding gbEcoding = Encoding.GetEncoding("gb2312"); + strVelNo = gbEcoding.GetString(bytesVelNo); + } + } + } + + strResult = "VIN码:" + strTemps[0] + ";车型号:" + strTemps[1] + ";车辆MAC:" + strTemps[2] + ";车牌号:" + strVelNo; + SetRecvMsgEvent(strResult); + + RfidReadModel = new RfidReadModel() + { + Result = 1, + VelVin = strTemps[0], + VelMac = strTemps[2], + VelNo = strTemps[3], + }; + } + catch (Exception ex) + { + ex.ToString(); + } + } + + /// + /// RFID读写器关闭 + /// + /// -1:初始默认值;0:连接成功;1:超时;2:无响应 + public bool CloseRfid() + { + if (_rfid_reader != null) + { + _rfid_reader.ShutDown(); + _rfid_reader.TagRead -= _rfid_reader_TagRead; //删除事件 + _isconnected = false; + SetConnectEvent(true, "RFID读写器断开成功!"); + return true; + } + + return true; + } + + /// + /// 写入单个标签值 + /// + public bool WriteRfidSingleTagResult(byte[] writeResult) + { + try + { + if (writeResult != null) + { + StopRfidResult(); + + //标签内存区。RESERVED (0x0),EPC (0x1),TID (0x2),USER (0x3); + Gen2.Bank userBank = Gen2.Bank.USER; + //起始地址,单位:字 + int wordPtrUser = 0; + //字节长度,单位:字 + int wordLenUser = 0; + //要写入的数据 + _user_datas = writeResult; + //访问密码,若没有锁定,可为0 + int accessPsd = 0; + wordLenUser = _user_datas.Length / 2; //长度必须偶数 + + //写数据对象 + Gen2.WriteData dataWrtUser = + new Gen2.WriteData(userBank, wordPtrUser, wordLenUser, _user_datas, accessPsd); + + //天线 + UInt16 ant = 0x01; + _rfid_reader.WriteMemory(ant, dataWrtUser, null); + SetRecvMsgEvent("RFID电子标签USER区:写入成功!"); + } + + return true; + } + catch (ReaderCommException e) + { + SetRecvMsgEvent(e.ToString()); + return false; + } + } + + /// + /// 盘点电子标签用户区数据 + /// + public bool ScanRfidUserDataTag() + { + try + { + if (_rfid_reader != null) + { + UInt16 ant = 0x01; + //标签内存区。RESERVED (0x0),EPC (0x1),TID (0x2),USER (0x3); + Gen2.Bank userBank = Gen2.Bank.USER; + //读取地址,单位:字 + int readAdrUser = 0; + //读取长度,单位:字 + int readLenUser = 36; + //访问密码,若没有锁定,可为0 + int accessPsd = 0; + Gen2.EmbedTagOp mixEmbedTag = new Gen2.EmbedTagOp(userBank, readAdrUser, readLenUser, accessPsd); + //_rfid_reader.Inventry(ant, null); + //Thread.Sleep(10); + _rfid_reader.Inventry_mix(ant, mixEmbedTag, null); + return true; + } + + return false; + } + catch (Exception ex) + { + ex.ToString(); + return false; + } + } + + /// + /// 停读 + /// + public bool StopRfidResult() + { + try + { + if (_rfid_reader != null) + { + _rfid_reader.Inventry_stop(); + SetRecvMsgEvent("RFID电子标签:停止扫读成功"); + return true; + } + + return false; + } + catch (Exception ex) + { + SetRecvMsgEvent("RFID电子标签:停止扫读失败"); + ex.ToString(); + return false; + } + } + + /// + /// 获取16进制字符串的字节数组 + /// + /// hexString 16进制字符串 + /// 字节数组 + public byte[] ToByteByHexStr(string hexString) + { + if (hexString == null) + return null; + + hexString = hexString.Replace(" ", ""); + if ((hexString.Length % 2) != 0) + hexString += " "; + byte[] returnBytes = new byte[hexString.Length / 2]; + for (int i = 0; i < returnBytes.Length; i++) + returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16); + return returnBytes; + } +} diff --git a/Rfid/Rfid/RfidServer.cs b/Rfid/Rfid/RfidServer.cs new file mode 100644 index 0000000..a5a18b9 --- /dev/null +++ b/Rfid/Rfid/RfidServer.cs @@ -0,0 +1,71 @@ +using System; +using DotNetty.Codecs.Http; +using DotNetty.Common.Internal.Logging; +using DotNetty.Handlers.Logging; +using DotNetty.Handlers.Streams; +using DotNetty.Handlers.Timeout; +using DotNetty.Transport.Bootstrapping; +using DotNetty.Transport.Channels; +using DotNetty.Transport.Channels.Sockets; +using log4net; +using Microsoft.Extensions.Logging; +using LogLevel = DotNetty.Handlers.Logging.LogLevel; + +namespace Rfid; + +public class RfidServer: IDisposable +{ + private static readonly ILog Log = LogManager.GetLogger(typeof(RfidServer)); + + private static MultithreadEventLoopGroup? bossGroup; + private static MultithreadEventLoopGroup? workerGroup; + private static ServerBootstrap? bootstrap; + + private int _port = 9000; + + public LogLevel? LogLevel { get; set; } + + + private void InitBootstrap() + { + if (LogLevel != null) + { + InternalLoggerFactory.DefaultFactory.AddProvider(new Log4NetProvider()); + } + + bossGroup = new MultithreadEventLoopGroup(); + workerGroup = new MultithreadEventLoopGroup(); + bootstrap = new ServerBootstrap(); + bootstrap + .Group(bossGroup, workerGroup) // 设置主和工作线程组 + .Channel() // 设置通道模式为TcpSocket + .Option(ChannelOption.SoKeepalive, true) //保持连接 + .Handler(new LoggingHandler()) + .ChildHandler(new ActionChannelInitializer(channel => + { + var pipeline = channel.Pipeline; + pipeline.AddLast(new LoggingHandler()); + //业务handler ,这里是实际处理业务的Handler + pipeline.AddLast(new HttpServerCodec()); + + pipeline.AddLast(new HttpHandler()); + })); + } + + public void Start(int port = 9000) + { + if (bossGroup == null) + { + InitBootstrap(); + } + + IChannel channel = bootstrap.BindAsync(_port).Result; + Log.Info($"server listen {_port}"); + } + + public void Dispose() + { + bossGroup.ShutdownGracefullyAsync().Wait(); + workerGroup.ShutdownGracefullyAsync().Wait(); + } +} diff --git a/Rfid/Rfid/ViewEventArgs.cs b/Rfid/Rfid/ViewEventArgs.cs new file mode 100644 index 0000000..9b6cf80 --- /dev/null +++ b/Rfid/Rfid/ViewEventArgs.cs @@ -0,0 +1,25 @@ + +using System; + +namespace Rfid; + + +public class ViewEventArgs : EventArgs +{ + /// + /// 连接状态 + /// + public bool IsConnected { get; set; } + /// + /// 连接结果消息 + /// + public string MsgContent { get; set; } +} + +public class ViewMsgEventArgs : EventArgs +{ + /// + /// 发送或接收消息 + /// + public string MsgContent { get; set; } +} diff --git a/Rfid/lib/SRGReaderAPI.dll b/Rfid/lib/SRGReaderAPI.dll new file mode 100644 index 0000000000000000000000000000000000000000..06ebe841fdb40b94ed21c11ee2bdbfda7a1ee606 GIT binary patch literal 47104 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 C1$HcTbH>?_ZU)&dwFa4K2e_~v$#!id#yu!% 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Rfid/packages.config b/Rfid/packages.config new file mode 100644 index 0000000..0b77b09 --- /dev/null +++ b/Rfid/packages.config @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Service/Service.csproj b/Service/Service.csproj index 433e1ae..e8b6d9a 100644 --- a/Service/Service.csproj +++ b/Service/Service.csproj @@ -24,4 +24,10 @@ + + + bin\Debug\net6.0\SRGReaderAPI.dll + + + diff --git a/WinFormStarter/Program.cs b/WinFormStarter/Program.cs index 72a6f73..124c974 100644 --- a/WinFormStarter/Program.cs +++ b/WinFormStarter/Program.cs @@ -58,4 +58,4 @@ internal static class Program var result = MessageBox.Show("系统发生错误,您需要退出系统吗?", "异常", MessageBoxButtons.YesNo); if (result == DialogResult.Yes) Application.Exit(); } -} \ No newline at end of file +} diff --git a/hnBackVehicle.sln b/hnBackVehicle.sln index a044641..020f84f 100644 --- a/hnBackVehicle.sln +++ b/hnBackVehicle.sln @@ -27,6 +27,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Framework", "Framework", "{ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Business", "Business", "{C9515084-B676-4C33-9FE7-E0B860493A4F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rfid", "Rfid\Rfid.csproj", "{053079C7-C9EE-49F4-B9CB-F06D14AEB027}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -69,6 +71,10 @@ Global {17044C11-3794-4938-BA80-C061BD871AE0}.Debug|Any CPU.Build.0 = Debug|Any CPU {17044C11-3794-4938-BA80-C061BD871AE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {17044C11-3794-4938-BA80-C061BD871AE0}.Release|Any CPU.Build.0 = Release|Any CPU + {053079C7-C9EE-49F4-B9CB-F06D14AEB027}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {053079C7-C9EE-49F4-B9CB-F06D14AEB027}.Debug|Any CPU.Build.0 = Debug|Any CPU + {053079C7-C9EE-49F4-B9CB-F06D14AEB027}.Release|Any CPU.ActiveCfg = Release|Any CPU + {053079C7-C9EE-49F4-B9CB-F06D14AEB027}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -83,6 +89,7 @@ Global {C2380814-15D4-491D-ADF2-ADC68617C3FA} = {C9515084-B676-4C33-9FE7-E0B860493A4F} {01D2CC15-F1FD-4E22-845A-2D2473662860} = {C9515084-B676-4C33-9FE7-E0B860493A4F} {A6C2AA7F-B2A2-4AE0-AE84-49BE36B990EC} = {C9515084-B676-4C33-9FE7-E0B860493A4F} + {053079C7-C9EE-49F4-B9CB-F06D14AEB027} = {E0B949DC-17FE-414D-8898-937A317BB853} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3E10BF3D-9914-44B1-A6AA-FCF013C3F155}