项目介绍:
本实例主要是接收安检闸机的数据解析并显示到界面上,只做功能实现,不做界面美化
硬件:闸机一个、网线一根、电脑主机
开发环境:vs2017 系统:win10
涵盖知识点:tcp通讯、文件写入、多线程,委托、类型转换等

软件操作流程:

点击开始监听按钮,8999要是未被占用则开启监听,然后人刷身份证通过安检闸机就可以接收到数据

数据格式截图:

安检闸机图片:

知识点介绍: 
1. socket.Listen(10); 官方给出的解释:挂起连接队列的最大长度。 连接队列,即连接池,也就是要保证挂起的连接池中至少要有10个连接                我解释一下,为什么要提前准备10个挂起的连接,原因就是每当一个新用户接入进来时,就需要立即创建一个socket,创建也需要时间和消耗系统资源,这样就会影响高并发的性能                ,用不用,先放那,用的时候直接取即

2. Socket clientSocket = socket.Accept();

AcceptSocket是同步的,你可以用异步通讯的BeginAcceptSocket或者用多线程。没有请求到达,就会“卡”住,术语叫程序阻塞,socket同步通讯就是这个步骤,执行到AcceptSocket就会阻塞等待请求,直到有请求到达时,才执行后面的语句,并且处理这个请求

3. while (true) 因为组要一直监听,所以得死循环;

4. 开启一个后来线程,不然主界面会假死 new Thread(delegate ()            {主体代码;})            { IsBackground = true }.Start();
5.从其它线程访问主线程控件需要委托,不然界面不会有数据的
this.Invoke((EventHandler)delegate                        {                            richTextBox1.Text += “”;                        });

完整代码如下:

using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Windows.Forms;
using System.IO;
using System.Threading;
using System.Text;
using System.Drawing;namespace TcpRecive
{public partial class mainForm : Form{public mainForm(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){textBox1.Text = "8999"; }public void tcpRecive(int port){if (PortIsUse(port)){label1.Text = "端口" + port.ToString() + "被占用"; return;}else label1.Text = "端口" + port.ToString() + "没有占用,监听已开启";new Thread(delegate (){int recv;//定义接收数据长度变量//IPAddress ip = IPAddress.Parse("192.168.1.119");//接收端所在IP 192.168.1.119换成127.0.0.1不可以为什么?IPEndPoint ipEnd = new IPEndPoint(IPAddress.Any, port);//接收端所监听的接口,ip也可以用IPAddress.AnySocket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);//初始化一个Socket对象socket.Bind(ipEnd);//绑定套接字到一个IP地址和一个端口上(bind());//官方给出的解释:挂起连接队列的最大长度。//连接队列,即连接池,也就是要保证挂起的连接池中至少要有10个连接//我解释一下,为什么要提前准备10个挂起的连接,原因就是每当一个新用户接入进来时,就需要立即创建一个socket,创建也需要时间和消耗系统资源,这样就会影响高并发的性能//,用不用,先放那,用的时候直接取即可socket.Listen(10);while (true){try{byte[] data = new byte[70000];//对data清零Socket clientSocket = socket.Accept(); //一旦接受连接,创建一个客户端recv = clientSocket.Receive(data);// 或者clientSocket.Receive(data, data.Length, SocketFlags.None);获取收到的数据的长度if (recv == 0) //如果收到的数据长度小于0,则退出break;//string stringData = Encoding.ASCII.GetString(data);string stringData = Encoding.UTF8.GetString(data);dataDecode(data);fileWrite(DateTime.Now.ToString("yy-MM-dd hh:mm:ss") + "\n" + stringData);}catch(Exception ex){MessageBox.Show(ex.ToString());}}}){ IsBackground = true }.Start();}/// <summary>/// 字节数组转16进制字符串/// </summary>/// <param name="bytes"></param>/// <returns></returns>public static string byteToHexStr(byte[] bytes){string returnStr = "";if (bytes != null){for (int i = 0; i < bytes.Length; i++){returnStr += bytes[i].ToString("X2");}}return returnStr;}public void dataDecode(byte[] data){int dataL = 0, isPass = 0, nameL = 0, ethnicL = 0, sexL = 0, birthdayL = 0, adressL = 0, cardNoL = 0, startTimeL = 0, endTimeL = 0, cardImageL = 0, captureImageL = 0;string item = "", name = "", ethnic = "", sex = "", birthday = "", adress = "", cardNo = "", startTime = "", endTime = "";dataL = BitConverter.ToInt32(data, 0);//数据包大小,低字节在前面,高字节在后面isPass = BitConverter.ToInt32(data, 4);//人证核验结果nameL = BitConverter.ToInt32(data, 8);//姓名长度name = Encoding.UTF8.GetString(data, 12, nameL);//姓名ethnicL = BitConverter.ToInt32(data, 12 + nameL);//民族长度ethnic = Encoding.UTF8.GetString(data, 16 + nameL, ethnicL);//民族sexL = BitConverter.ToInt32(data, 16 + nameL + ethnicL);//性别长度sex = Encoding.UTF8.GetString(data, 20 + nameL+ ethnicL,sexL);//性别birthdayL = BitConverter.ToInt32(data, 20 + nameL + ethnicL + sexL);birthday = Encoding.UTF8.GetString(data, 24 + nameL + ethnicL+sexL,birthdayL);//出生日期adressL = BitConverter.ToInt32(data, 24 + nameL + ethnicL + sexL + birthdayL);adress = Encoding.UTF8.GetString(data, 28 + nameL + ethnicL + sexL+birthdayL, adressL);//地址cardNoL = BitConverter.ToInt32(data, 28 + nameL + ethnicL + sexL + birthdayL + adressL);cardNo = Encoding.UTF8.GetString(data, 32 + nameL + ethnicL + sexL + birthdayL+adressL, cardNoL);//身份证号码startTimeL = BitConverter.ToInt32(data, 32 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL);startTime = Encoding.UTF8.GetString(data, 36 + nameL + ethnicL + sexL + birthdayL + adressL+ cardNoL, startTimeL);//身份证起始时间endTimeL = BitConverter.ToInt32(data, 36 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL);endTime = Encoding.UTF8.GetString(data, 40 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL+ startTimeL, endTimeL);//身份证终止时间if (isPass == 1)item = "人证核验:成功" + "\n姓名:" + name + "\n民族:" + ethnic + "\n性别:" + sex + "\n出生日期:" + birthday +"\n地址:" + adress + "\n身份证号码:" + cardNo + "\n身份证起始时间:" + startTime + "\n身份证终止时间:" + endTime;elseitem = "人证核验:失败" + "\n姓名:" + name + "\n民族:" + ethnic + "\n性别:" + sex + "\n出生日期:" + birthday +"\n地址:" + adress + "\n身份证号码:" + cardNo + "\n身份证起始时间:" + startTime + "\n身份证终止时间:" + endTime;cardImageL = BitConverter.ToInt32(data, 40 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL);MemoryStream ms1 = new MemoryStream(data, 44 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL, cardImageL);captureImageL = BitConverter.ToInt32(data, 44 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL + cardImageL);MemoryStream ms2 = new MemoryStream(data, 48 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL+cardImageL, captureImageL);//ms.Write(data, 44 + nameL + ethnicL + sexL + birthdayL + adressL + cardNoL + startTimeL + endTimeL, cardImageL);Image img1 = Image.FromStream(ms1);Image img2 = Image.FromStream(ms2);this.Invoke((EventHandler)delegate{richTextBox1.Text = item;pictureBox1.Image = img1; //更新在窗体控件上          pictureBox2.Image = img2;});ms1.Flush(); ms2.Flush();ms1.Close(); ms2.Close();ms1.Dispose(); ms2.Dispose();}public void fileWrite(string str){if (!File.Exists("info.txt"))File.Create("info.txt").Close();//创建文件并关闭StreamWriter sw = new StreamWriter("info.txt",true);//向文件追加数据sw.WriteLine(str);sw.Close();}//通过 IPGlobalProperties来获取本机的网络连接的信息,并通过GetActiveTcpListeners找到已用端口,进而可以知道所需的端口是否已被占用public static bool PortIsUse(int port){bool isUse = false;IPGlobalProperties ipProperties = IPGlobalProperties.GetIPGlobalProperties();IPEndPoint[] ipEndPoints = ipProperties.GetActiveTcpListeners();//找到已用端口foreach (IPEndPoint endPoint in ipEndPoints){if (endPoint.Port == port)//判断是否存在{isUse= true;break;}}return isUse;}private void button1_Click(object sender, EventArgs e){tcpRecive(int.Parse(textBox1.Text));}}
}

运行结果:

Csharp实例:武汉智能安检闸机数据接收和解析相关推荐

  1. C sharp实例:华盾武器门数据接收和解析

    项目介绍: 本实例主要是接收安检金属门的数据解析并显示到界面上,只做功能实现,不做界面美化 硬件:金属门一个.网线一根.电脑主机,金属门网线可以直接接到电脑主机上 开发环境:vs2017 系统:win ...

  2. 小明加密通道进入_门禁系统跟闸机通道的区分是什么?功能是一样吗

    门禁系统属于一卡通系统的范畴.它是以中央处理器为核心,由控制器.信息采集器和电控锁组成的控制网络系统.通过系统的信息读取和处理,实现了各种门锁开关的自动控制.根据信息阅读的方式可以分为:插卡式.感应式 ...

  3. 中兴智能视觉大数据研发智能视觉大数据人脸闸机的功能说明

    智能视觉大数据人脸闸机 详细介绍 智能视觉大数据人脸闸机是基于智能动态人脸识别技术,结合新一代具有高安全性.高稳定性.高效率的自助闸机设备,自主研发的完成通行人员进出入控制的系统,可广泛应用于大厦.楼 ...

  4. 图像处理中ct图的通道是多少_新一代安检CT机,智能安防领域又一明星产品

    全面复工复产后,中国航天科工三院239厂博士孙翠丽每天都在加班加点测试,甚至周末都要忙到晚上九十点.办公楼北楼三层办公室.安检设备实验室晚上灯火通明成为一道特殊的风景. 在去年底完成样机研发后,孙翠丽 ...

  5. 云栖大会人脸识别闸机【技术亮点篇7】--人脸识别闸机可挑战12万组人脸数据

    云栖大会人脸识别闸机[技术亮点篇7]–人脸识别闸机可挑战12万组人脸数据 为云栖大会提供人脸识别闸机的艾力奋会展服务有限公司可做到,人脸识别前端硬件的数据库可支持超过十万组人脸数据,无惧人数的挑战.在 ...

  6. 百度智能云服务器大数据型实例族应用场景及规格参数介绍

    大数据型d1s规格族特点 处理器:Intel Xeon Platinum 6271,主频 2.6GHz 处理器与内存配比为1:4 实例配备大容量高吞吐的SATA HDD本地盘 最高可支持25Gbps内 ...

  7. 人脸测温门禁 传感器_艾力奋人脸识别测温门禁一体机系统 展会智能闸机人员管理...

    艾力奋人脸识别测温门禁闸机: 结合客户需求自主研发动态人脸识别身份证核查系统.集现场人脸采集.身份验证.黑名单预警.等功能为一体,从读取身份证信息到现场采集人脸照片.进行比对.并获取结果,全程自动化, ...

  8. 人脸识别门禁闸机在现代社会中的应用优势

    人脸识别闸机是一种管理通道的智能人行通道闸机,相比于其他闸机,采用的通道技术更为先进,管理人流量效率更高,还可以有效保证验证的精准度,人脸识别闸机的应用已经非常广泛,我们也可以经常接触到,特别是在高铁 ...

  9. 坐地铁飞机数秒进站,关于3D人脸识别闸机你知道的有多少?

    11月1日起,5G正式进入商用,这意味着5G终于要落地普及啦!在这场5G新风口下,各类人工智能技术的结合也将加速大规模应用,重塑各个传统行业的发展.其中"刷脸"应用遍布零售店.银行 ...

最新文章

  1. 深度学习入门课程推荐
  2. [Flutter] 发布自己的插件 package
  3. OpenGL着色器基础
  4. Mybatis框架的操作步骤和细节处理
  5. 最小生成树之Kruskal
  6. python的GUI之Tkinter的Label组件
  7. 聊聊jvm的-XX:MaxDirectMemorySize
  8. Linux挂载windows中的共享目录步骤及问题解决方案(步骤清晰)
  9. Oracle查看表空间,创建表空间
  10. sql server 群集_SQL Server 2014 –安装群集实例–分步(3/3)
  11. c语言控制安卓桌面,让你自己编写的Android的Launcher成为系统中第一个启动应用程序,也是唯一的Launcher...
  12. python安装成功之后教程_python安装教程 Pycharm安装详细教程
  13. pcm5102a解码芯片音质评测_精品推荐:用家票选TOP 30款最佳便携式解码耳放(中)...
  14. python中pytz库用法详解
  15. mysql phpmyadmin远程_phpMyAdmin远程连接mysql数据库
  16. html6张拼图,拼图6张-好看的6宫格拼图大全-稿定设计
  17. thymeleaf 基础教程-阅读官方教程(二)
  18. python中shelf对象_shelve -- 用来持久化任意的Python对象
  19. android 反编译 jadx,jadx gui下载 jadx(Android反编译gui工具) v0.6.1 官方版 下载-脚本之家...
  20. 腾讯投资“差评”遭舆论讨伐,或被迫退股!!

热门文章

  1. iOS-生成二维码图片【附中间带有小图标二维码】(QRCode)
  2. SVN安装和使用总结
  3. 隐藏UITableView当没有数据或数据不够的时候出现的分割线.
  4. 特定视图呈现时发生的事件顺序
  5. 我的专业我的梦作文计算机,我的创新我的梦作文
  6. 如何在Windows 8.1中获取Windows 10样式的开始菜单
  7. 在Ubuntu 11.10中将窗口按钮移回右侧
  8. 当检测到运动时如何自动打开门灯
  9. vba发送邮件 签名_如何更改“从Windows 10的邮件发送”签名
  10. android设置时间widget,【Android】时间与日期Widget(DatePicker 与 TimePicker)