注意:该SDK是本人为北京思源科安信息技术有限公司虹膜识别设备KAIris100开发的基于Mina.NET框架的Socket通信协议编解码器,虽非官方产品,却填补官方空白。
同系列文章:
添加引用:
- MinaKAIrisCodec.dll
- Mina.NET.dll
编解码器源代码出售:
价格:壹仟元人民币
微信号:splashcn
演示程序界面
源代码
KAIrisMessage.cs
/* ---------------------------------------------------------- * 文件名称:KAIrisMessage.java * * 作者:秦建辉 * * QQ:36748897 * * 博客:http://www.firstsolver.com/wordpress/ * * 开发环境: * Visual Studio 2015 * .NET Framework 4 Client Profile * * 版本历史: * V1.0 2015年12月28日 * 思源科安 KAIris100 Socket 通信消息对象 ------------------------------------------------------------ */ namespace Com.FirstSolver.KAIris { /// <summary> /// 思源科安KAIris100消息对象 /// </summary> public class KAIrisMessage { /// <summary> /// 构造函数 /// </summary> /// <param name="header">包头</param> /// <param name="body">包体</param> public KAIrisMessage(string header, string body) { Header = header; Body = body; } /// <summary> /// 包头 /// </summary> public string Header { get; private set; } /// <summary> /// 包体,包体可以为null /// </summary> public string Body { get; private set; } /// <summary> /// 版本信息 /// </summary> public string Version { get { return Header.Substring(0, 2).Trim(); } } /// <summary> /// 命令 /// </summary> public string Command { get { return Header.Substring(12, 4).Trim(); } } /// <summary> /// 多包标识 /// </summary> public string FlowMark { get { return Header.Substring(16, 1).Trim(); } } /// <summary> /// 错误代码 /// </summary> public string ErrorCode { get { return Header.Substring(17, 4).Trim(); } } } } </code>
MinaTcpClientForm.cs
/* ---------------------------------------------------------- * 文件名称:MinaTcpClientForm.cs * * 作者:秦建辉 * * QQ:36748897 * * 博客:http://www.firstsolver.com/wordpress/ * * 开发环境: * Visual Studio 2015 * .NET Framework 4 Client Profile * * 版本历史: * V1.0 2016年01月09日 * 基于Mina.NET框架的Tcp连接客户端演示 * * 参考资料: * http://git.oschina.net/longshine/Mina.NET ------------------------------------------------------------ */ using Com.FirstSolver.KAIris; using Mina.Core.Future; using Mina.Filter.Codec; using Mina.Transport.Socket; using System; using System.Net; using System.Threading; using System.Windows.Forms; namespace Splash { public partial class MinaTcpClientForm : Form { private struct TaskArgs { public string IP; public int Port; public string Command; } private Thread QueryThread = null; public MinaTcpClientForm() { InitializeComponent(); } private void buttonClear_Click(object sender, EventArgs e) { textBoxAnswer.Clear(); } private void buttonExecute_Click(object sender, EventArgs e) { QueryThread = new Thread(new ParameterizedThreadStart(DoQuery)); QueryThread.Start(new TaskArgs { IP = textBoxDeviceIP.Text, Port = Int32.Parse(textBoxDevicePort.Text), Command = textBoxCommand.Text }); } public void DoQuery(Object obj) { TaskArgs args = (TaskArgs)obj; AsyncSocketConnector TcpClient = new AsyncSocketConnector(); try { TcpClient.FilterChain.AddLast("codec", new ProtocolCodecFilter(new KAIrisProtocolCodecFactory())); TcpClient.Handler = new MinaTcpClientHandler(ShowMessage); // 设置连接超时等待时间为10秒 TcpClient.ConnectTimeout = 10; // 设置读超时等待时间为60秒 TcpClient.SessionConfig.ReaderIdleTime = 60; // 建立连接 IConnectFuture ConnFuture = TcpClient.Connect(new IPEndPoint(IPAddress.Parse(args.IP), args.Port)); ConnFuture.Await(); // 发送查询命令 ConnFuture.Session.Write(args.Command); ConnFuture.Session.CloseFuture.Await(); } catch (Exception e) { MessageBox.Show(e.Message, "异常", MessageBoxButtons.OK, MessageBoxIcon.Error); } finally { TcpClient.Dispose(); QueryThread = null; } } public void ShowMessage(string message) { // 线程安全性 textBoxAnswer.BeginInvoke(new Action(() => { textBoxAnswer.AppendText(message); })); } private void MinaTcpClientForm_FormClosing(object sender, FormClosingEventArgs e) { if (QueryThread != null && QueryThread.IsAlive) { QueryThread.Interrupt(); QueryThread.Join(); } } } }
MinaTcpClientHandler.cs
using Com.FirstSolver.KAIris; using Mina.Core.Service; using Mina.Core.Session; using System; namespace Splash { public delegate void ShowMessageAction(string message); public class MinaTcpClientHandler : IoHandlerAdapter { private ShowMessageAction ShowMessage; public MinaTcpClientHandler(ShowMessageAction action) { ShowMessage = action; } override public void MessageReceived(IoSession session, object message) { // 处理消息 KAIrisMessage Source = (KAIrisMessage)message; // 输出包头和包体 ShowMessage("包头:\r\n" + Source.Header + "\r\n"); ShowMessage("包体:\r\n" + Source.Body + "\r\n"); session.Close(true); } override public void SessionIdle(IoSession session, IdleStatus status) { if(status == IdleStatus.ReaderIdle) { ShowMessage("ReaderIdle: exit...\r\n"); session.Close(true); } } override public void SessionClosed(IoSession session) { ShowMessage("Session Closed!!!\r\n"); } override public void ExceptionCaught(IoSession session, Exception cause) { ShowMessage("Exception: " + cause.Message + "\r\n"); session.Close(true); } } }