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
zcmeHwd3;pW`S-bZX6~IOljKg4$-cl(|mwM(1#
z^r+_cL^{%)O17n9ospJUS68wpvL+r$^>#%PU6EM}nj)Ra)_7$w=pUn4H`EF-PjiV^
zn|^SyUD`fzNF<n&v9MKO$d^o|3x$*fTw>hG5s7OrT;T;
z1riGX=7H}5itH2OQc}c_f11bv?uI9Ys2-B`6^Mus-mGLV;JI0FWlwx#58#`Ai~wm|
zS0y(f{udEqb!94@Y5~Nu?L&kr`d@gm{!K@7Ri@${Nf45(LMR>llmRE0F2oE6P?3Jp
zEB=vey6}jNX(1|>FbBr}r$IrLTO^SQ5?CVa*HegeCoLiT6N7rnw1KEroa3FKm-zK$
z2x-RBlI0ggkt+}mMn?@Qj#n{Qi0p_S?-7nx~V7xe2wrGFA4h0ixd0Z1s=;Y
z@j0`=hziRXFAAz$BFyzb*|OwR5G7WiT@8O!fP`sQfCebg6z2IZi+EK#OkoLH6~hBPn_gma?9Oz-7EBjiez6X)SbNRB`-&Re`B$BU{>{=JbL
z2?WGIX%HK78=@X>kJM}Qc%k<}weFEE&j)lBUGv-)LMiYJXv}T8jDc7L{aUQLJSLNc
zQM|-&xJZ9F-if=$j}v;B^Fd~5>*#XO4YOyhQC+5h1zOL>m*-bNbbm5}z;AFHmhE>#
zmpQ^HE3Zn9BD^qI6_8yQ708eNV2Lz3qk$|a#1Mv_M1}B9g0~ScD`37dQ$dwS9ELnT
z%2UF&;nynwfhuf-jf)c%hoB5$RE*}AEQ$2w7Njpf%X)F*qAFOGKOBfcFjF@Nt`lbQ
zl7NW@;p+dl5sV5S+l7ZaM}YE`ad~6ItT=tu^Vf_mjtD4GUj=nvGqwb^{sKUGK0&2`
z#1~!qx>e;Rt8uPOZRBy6JREqjSl&Va+=fVT##1FV!w`c_o?9>veu`maJdJM!T
zE14!tL-!_u^q1!^=XY`(fDH1K46;1JY2yUjknC3b-9g{P`^{`qIz+EHl(aLxD?)wr
zqKQz?*k{or+!bgde?J)w>Cd)>T-IYBx{I4@wo)(LLV#X@)`60B7lV%NpeK=y!0aVG
ztjo29Ag-&lFGYiv&!Qn{yd#}czM_TdvS)=}6}g)P%hr}j|T
zVG283Kb=}YVkjy2<@8rlXlUiVCnWXcfWs;WvvocBNiceNONy|ga
zB)twTlQcQB%uJU+eGML`K?q-Q5_IX|0jFXDbwy7F`ZBaLVXTPIu*2g`KzF%K20ax=
z!u^bs&LAi15pFe3xy32aB}QQjEGn5r#o>5`_iGrUeekeVfW|5Qzy^I2asf>OHaQsq
zIRUq);t1)R*X`G6Y@A?-aDfLduNa}QJXu})z`l*5v+RkW@hNbuI1UVD{b~?HDef(t
zi2S-Z4bBVG1NfSNS+=wmGXox?j>kI}N%m6*xEaqXJnQiE;_1gj=@;O=6VG*cet_r4
zcz%lKVLW^Az{(;YD)fGgYh+vwn(Bp=fkt>NtLPrxx+M
zJ=MbR)u~Q?FG+3XcSC9izvrfI<@fZ|ef+LYJ
z$0Kbj+tT<-YI_(H>}q^w96|$AIe2B+3PD*k7`uq3$fikQtRf&YRwdB~{ES1k1MLuV
zw=CWSW${KwCf=CCWzi5clm^qeEEV7{Iu4?#m|
zN(RvoG?WID`z$^LF^x-{qzM5VP!(ymSB<}efZ_rmhy)uj$
zXQUrgmH8AS`bvK^r`R9$mtc}u>W}JC_>;c?Up`&WVyZmrtifDq5maDU#)J}D1xdyh
zM{Uk!;EXKwq=Z}}%2asc0e6)4EDawh0ePq|NKHVQBow}NsVcPjLXCZ)MVHaDr)d4rh^
z(QBcj*AN_84Lhz-Y9YVdDJ6RRm#Kd20Yzj~?@it6z7t>=2SKrA;_`sF^w+z?Dj6)G6`7B
z?6CB3>k;uYO>99gLv%Zwz!r3RGQK0_>nM5^ZmE{9X%cy~d>uot2<>@q!Ab*B?>0n_
zr)Wiq#tRPDmMH|fxkzbu=T
zKM7s9-v#0vy^nz8ZtkOcAC;8;EdW_DPK;a)f13O$Q%LIn%Ea|Ps%!G03?|YI7nFQ}
z5aWkoAM8<-3x@>%toM=9lJ_Br7l?Z55y-8u4+ERp3%CM$@>hIB`9*Z2$|NPL_!h9q
zM<_|=()&p1$z2&t)Z9M682}f*^;20Mx)Jppe!tw(L8AH}qTJHp18qw>-nZns}q_#Z8OZV#qG-(`-cvLE!ahL5{F;XoJCD5R62^
z1^reKlj~e77yH+#kI)s;P_}$(<|_GgGspi6X4>=pY(Bq!+1En`rTN5)E^EEy{u
zC@@nVm*}?K7h=@WD$r~Ea!)9gM`+Iw^e{pjL(pRhZ61iWJQL8IY@1Wi7@jF;ezY2n
zaA*cU?QH6tsUwh8mZ=1luW+es7O9$IB`_-{Cv_6#nNDUA#?*hbOtgZRVEE87XD*V$
z3gXNqXa#Y~KIg%ODDMh6!RMonw^PH8aem
zIEXS;mqV4v%3wzmUl-Bw*l~lt&|S+X?{~w+@med8ib3Pjw8L0$zQ+9rCnG8B?<>6J
z9zGC6F{O4fJ}Sm6x4SmV@u3{F#KhM~bGgFGm72?wn#)6B`Bwgcn#nC8(@403XVd&LUh8igplKx>PF72*dTbi!CE8vC_6IqXLe_Aa4^M
zz^UAbB?D6|%UewGkxK^H#Zxf_RsnV;i@>z_;AIIbr22ZP_}MG6P03%=m_JJTYj*aJ
z@_2(?s>|)j03ze$#09i;c7-H?EfNbo_+0oO>1<^M(QOGO>nLRpq))(%Bgb35ELlTS
z4@nsIvhPB#VS2Fh3-4G4Bx=bPO7Oy&%4}Y<*p4w(P@0!d@(CyJB6;OJhUVlLugQP8
zMkME<(12?szjIvWK8^&_3DDDcVow
zQLNr2>RqPZcDj1w-0}!i$B=3b)3K(6S-S@7qHLgyx23&?5;}DrOm~ROl1oUE>1D`-
z_M`n7VU+vPwPPkg3s8_ef#TnYL;cm*u`fM$zK(q}xQ7
zM=qo;QKvelgp_+~A3L18EsPZFDl`U@x(B$rb
z-kXIk1zHV~|8UTPeAnj=IGz`0G%uBVNHMfMmPTJ|kEN>O#Zn`NOTtdoE<@GE*#<{L
zALfREl@^3^71kB45W&NluvemCES;m
zZ}-3QfGR(%OdwzvX}`^qB>`98SZFHtd_bEj56{hk?oN)n0v>~1r6FA8RE*LCs&{wjYl*w0NcySj+
zmy;5kkWNW^9k#RK?P&!@b7KfQaW765e9=Ja6i3gHTKc+SI&ZRC!X-81N|I(USM$qQ
zz~m`Uj>~H%aYkYYi4MAy#?ob^5j3Ya8Kq>)VkTG9!EJd&!t=@#b3?BA)
zNy7=YqC-G>@X$mYmL`_rIS0?}c<#mX1fJLMc#!+cp1&cT96&Yg2dEOfP>VNNPK8(h
z8EKYBCL|AK6iq5*eP{%eb5p;|@>@PxSLF65E18reQKT5YBx#Pz%CQ0tX^tX=yR}I%
zy_Tf8E-TjxI;6RhG`dX5nHOzvB~L^_1^Mc2MUPjp5Tpnt4wM_oEG)2i8BuH%PYCFir{WXzYXLj5Jjsb*hwYGp
z602l_&q?EXrdwPFJHa*{?K!w{Ct*5houSSiZJdFnJb!Sfgd3bmvf49A+I4~3gnipX
zX_>n(4skC|EKy^(yKjv%f?%TELIBTm0JLVOP`2bO;x5!6WAL1L_|mMghG#j0=Q!i+
zIZk;#4~^(=di2$7WY9P5da_oD8-cYu)*H|!jdg+4dZ#ayFc$p{SX_}()6r7K(rhV^
zy2QbjF_vbCfz@ddCS}~Bi*TD{FEX|<;sV5z5wN5fQZjPpFG%bTsPWv4aXuzgb
zKtYZayL6yrie=YII&iGjuuivvn8RXAQdO^Xpgc6infHMs5z$6U5VttP71x7~HWO{8
z*~D;GM2toF1eb`eJs1h*h(to`Nsyd$z+ixNBh40RosNyT)LzupveMXRGAjNp%Pker
zph&%s1i3eXLz;qu>VML9f%0QBP?J&L!2hxe23x12OSTf`hr4_(_C#3s$-AY2)D<4P
zX(RswUBH7bAYHuE1w03I0Z(=p@ML!ZPj(lO*;E&h`COjh<
zNQr|bJD!%A4XT9^`d5FZe+^Tra`$Z|B==%bjfu1tb!6If@l^i=x$K^wf3O~?dNlPh>e0pD
zq({?63%cv#gYi>6y3i^l5;Xsy>0OakL_M0u9j8YZ4eHT8^x)#^5N-To{^S-rF#KcF
zQ}#EW*goj=w?co!>2X6B_-aOF+Jg>u0ND0SHR#wo0@UL$*;{~}c4^dR*#SMy%}jR_zw4
zDRx1j$+PVObQd{I44YQiDw5Mgl~$}amrCSJyVNSR!fL8r3Q{@OF11S3T)WgNwkO+V
z)z^}PQ~ArRvVvjOu&l{;2@kKw{MCeUmi
zi4(k5X>vUL0KTZf@dbkS3A|g4ri=%wZ}Wy5sa0t_CyCelCjd&_Tv7t+@r_0SR@3^Spumg4sp4k(d1SG
zskIq&fYCG!38cCmH18Il;efP9>=yLp)8ub3|1U52G9!~sNoF&6Y5G57HgcFeh=mNE
znikN;&orFxWLh~`OcO<#!VelE2`N{iSxrnxxe(2?Wf>vmIyBRi!w4ytq1zoz4kx5E
zrcB$6Af&XVOv{WUq%@_hcCr0L1b$-5H))H|m$rrM>mHe&s~V*_vtN)qq*Z`fLmg7)
z1eBS*8Gy3-v&w648rVB>x!(M;<@fLMswA;jIoo);QYP4zE
zpl)p7Boqm-&vcP?>ZM4u#V*
z5XehzTtIPhCLI;4yH2wxj{9KpE-x;|Sx{A$Ah@xH3v!v0dmb8=xATWGyy(P$
zT%K1qDzMWF3()(hzC2d$6t7non6?U1yI?zNujutif!D_C*bav3{G@MtcjPq(kXmX6k$3A~8*!VHm3CMGi))cL-VoD2NL3HesGCvA&qefAYD+$TXlBUR8n2qU^2_bH;~sb8Va
zKFb`q5VLx9duTcpge~?Z?LYR>ckRv%CNNS#oNnq*Vo}pe{
z5Bz2w_yo?(D{e(&kf#hw`DmasZ6fS+g9>+GeDv;GiaTlHb@FD-#H-}_u!UASn%jhK
zUwrwtG~Zg0F2Ql&m!ar`?y%4e7v8lDnA3iYxV^)XhPT4Wkvw-vmI1)MFh0*n;`AZ|
zjLZfi*}x&$z?f`cTsD9c=nOZQW(Js$4Pa9~lY$)-0KurcFepEVX1|3=@i#g@kL&}X
z8bC|c4BOtFbV>LCy{XF^&RKddHQNagVl(w6I!nJ2Z}icxJr|3-ktzG&XJhuMA`$Xw
z-m!y^$L!O*G4`1l42te1P&df~juzcyis&jPK6FqwDoMsi!4bR7Un`@%8G4|6yl;%V
zR-IomFBrzBd2G>SNbv7MEZOL0h2#h{VrTC>;zY|e?}$?>V+Vas6I+4PBsETdxIL73HmUD#$8HE
zHW6d`83_9E1j4wI%}fkBn;t`nL%+zT&q~kcx7be4@H_cHe%bU(hSD!RkY3L!f7wv_
z<=ONwM_E5yAV#fFYr6Q%Rb64z(YQYmbjK54JM|Pw6|WETi_}$U5rc=etWSyM)n(`I
za=s;o$#KjrFrH@X)QyADmA06(6@NmmVgVd^R@?GWTNi)_q@=cf$!=fuRrh|h?{sS4
z!YwuQIwOXRTQG&OqZmE28h;I?GQEq5#=rT$nV;?D0DWS*9^Nts6;?Mc}Om6^m!
zLE01QW805vZxWua$Ytz}Fs>wa1kg-hLcew>eOoqt4)Q7cAT?yZlOX+o=>gx7%pOET
z5Sa*g41@22A&KeACh(S(!C;G-DOoddz3zC<`W_K 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}
|