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

软件操作流程:

点击开始监听按钮,9082要是未被占用则开启监听,然后人通过金属门就可以接收到数据

金属门数据协议截图:

知识点介绍:  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 += “”;
                        }); 不完善的地方:金属门每通过一次会发送三条数据,三条数据间有时间间隔,所以为了接收到完整数据我 Thread.Sleep(1000);睡了1秒钟,所以几个人同时通过金属门会有数据丢包,暂时没做相应处理。

完整代码如下:

using System;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.Windows.Forms;
using System.IO;
using System.Threading;namespace TcpRecive
{public partial class mainForm : Form{public mainForm(){InitializeComponent();}private void Form1_Load(object sender, EventArgs e){textBox1.Text = "9082"; }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(ip, 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[1024];//对data清零//for (int i = 0; i < data.Length; i++) { data[i] = 0; }Socket clientSocket = socket.Accept(); //一旦接受连接,创建一个客户端Thread.Sleep(1000);//不延时收不到完整数据,可能是三组数据间有时间间隔recv = clientSocket.Receive(data);// 或者clientSocket.Receive(data, data.Length, SocketFlags.None);获取收到的数据的长度if (recv == 0) //如果收到的数据长度小于0,则退出break;//string stringData = Encoding.UTF8.GetString(data);//string stringData = byteToHexStr(data);//MessageBox.Show( dataDecode(data).ToString());//dataDecode(data);string stringData = "0x"+BitConverter.ToString(data, recv-32,32).Replace("-", " 0x").ToLower();//只取最后32个字节的数据//string stringData = Encoding.ASCII.GetString(data);this.Invoke((EventHandler)delegate{richTextBox1.Text += DateTime.Now.ToString("yy-MM-dd hh:mm:ss") + "  安检人数:" + dataDecode(data, 0, recv)+ "  报警人数:" + dataDecode(data, 1, recv) + "  报警信息:" + alarmPosition(data, recv)+ "\n" + stringData + "\n";});fileWrite(DateTime.Now.ToString("yy-MM-dd hh:mm:ss") + "\n" + stringData);}catch { };}}){ 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 int dataDecode(byte[] data, int type,int dataLength){int personNum = 0;switch (type){case 0:personNum = Convert.ToInt32(BitConverter.ToString(data, dataLength-27, 4).Replace("-", ""), 16); break; //取出对应位置连续四个字节并转换为通过人数case 1:personNum = Convert.ToInt32(BitConverter.ToString(data, dataLength-23, 4).Replace("-", ""), 16); break; //取出对应位置连续四个字节并转换为报警人数                  default:; break;}return personNum;}public string alarmPosition(byte[] bytes, int dataLength){string alarmStr = "";for(int i=0;i<10;i++){if (bytes[dataLength + i - 19] == 0x00)continue;//0x00则退出本次循环switch (bytes[dataLength+i-19]){case 0x01: alarmStr = "区位" + (i + 1).ToString() +"工具刀枪"; break;case 0x02: alarmStr = "区位" + (i + 1).ToString() + "马口铁罐体"; break;case 0x03: alarmStr = "区位" + (i + 1).ToString() + "铝制易拉罐"; break;case 0x04: alarmStr = "区位" + (i + 1).ToString() + "违禁品混合"; break;case 0x05: alarmStr = "区位" + (i + 1).ToString() + "铜制铝制管体"; break;case 0x09: alarmStr = "区位" + (i + 1).ToString() + "手机手表"; break;case 0x0a: alarmStr = "区位" + (i + 1).ToString() + "全金属报警"; break;case 0X30: alarmStr = "区位" + (i + 1).ToString() + "非磁性枪支"; break;default: alarmStr = ""; break;}}if (alarmStr == "")return "无报警";else return alarmStr;}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));}}
}

运行结果:

以上代码完全纯手工打造,如果有疑问欢迎留言,喜欢的小伙伴们可以多多分享,让更多志同道合的伙伴们加入我们的微信交流群一起学习、进步!

C sharp实例:华盾武器门数据接收和解析相关推荐

  1. Csharp实例:武汉智能安检闸机数据接收和解析

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

  2. 一个简单实用的电子称数据接收/解析类(C#)(附简单使用实例)

    一个C#写的接收电子称数据并解析出重量数据的类. 之前单位购买了两架电子称,同时单独购买了配套的软件.该软件是用Delphi 7写就的,界面老旧就不说了,关键是功能太弱了,基本只能简单地记录一下称重的 ...

  3. 【UVM基础】TLM常用数据接发送与数据接收实例

    文章目录 1.数据接发送(uvm_analysis_port) 2.数据接收(uvm_blocking_get_port) 3.连接发送和接收端口 在UVM中, 通常使用TLM( Transactio ...

  4. DynamicData for Asp.net Mvc留言本实例 中篇 新建.删除.数据验证

    上篇咱完成了显示列表的功能,下面接着来 也许您有疑问,这个显示列表不是和正常的Asp.net Mvc差不多吗?也是个foreach只是由原来的<%=字段%>变成了<% Html.Re ...

  5. 基于STC89C52的韦根数据接收

    韦根是一种开放的通讯协议,具体官方介绍如下: Wiegand协议是国际上统一的标准,有很多格式,标准的26-bit 应该是最常用的格式.此外,还有34-bit .37-bit 等格式.格式的含义如下: ...

  6. ESP32-IDF开发实例-非易失性存储(NVS)数据存取

    非易失性存储(NVS)数据存取 ESP32是一系列高度集成的.专为移动设备.可穿戴电子产品设计的物联网模块,其集成了天线开关.RF balun.功率放大器.低接收噪声放大器,滤波器.电源管理模块等,可 ...

  7. InterSystems IRIS数据平台:数据接收速度测试

    关于本文 本文为翻译整理(节选),原文链接请点击:https://openexchange.intersystems.com/package/Ingestion-Speed-Test?tab=deta ...

  8. [通信技术资料]基于STC89C52的韦根数据接收

    韦根是一种开放的通讯协议,具体官方介绍如下: Wiegand协议是国际上统一的标准,有很多格式,标准的26-bit 应该是最常用的格式.此外,还有34-bit .37-bit 等格式.格式的含义如下: ...

  9. 5-->详解《switch 数据接收驱动框架、mtk7621集成交换芯片mt7530》之一

    一. MTK7621 网络通讯原理简述 本篇博文分析的是mtk7621的芯片所内嵌的交换芯片mt7530的驱动程序,MTK7621采用内部的 MDIO 接口管理MT7530 的 switch 芯片:M ...

最新文章

  1. python入门基础代码图-python入门代码指南教程书籍推荐2020总结全集汇总
  2. mysql中表名为关键字的处理方法
  3. 今年阿里双十一CDN要冲历史之最,峰值带宽达到5000G+,来高手分析一下他们的CDN节点数量和规模...
  4. 傅里叶变化的本质:复数的实部和虚部的对应关系
  5. GitLab搭建详细过程
  6. Java学习之SpringBoot整合SSM Demo
  7. 中国长租公寓市场白皮书
  8. 【script】python requests模块中cookie的使用
  9. PyTorch 1.0 中文文档:CUDA 语义
  10. [Ext JS 4] 实战之浏览器兼容
  11. JSP→JSTL标准标签库简介与环境搭建、JSTL助手EL表达式EL隐式对象、标签→out、set、if、多选择配合、foreach、redirect、格式化、JSTL函数标签、自定义标签、标签类架构
  12. linux什么命令查设备型号,在Linux命令行中查看系统硬件制造商、型号与序列号的六种方法...
  13. 《mysql必知必会》学习_第八章_20180730_欢
  14. ArcGIS中属性域的使用
  15. 台达A2/B2伺服电机编码器改功率软件 台达A2/B2伺服电机编码修改, 用于更换编码器写匹配电机参数
  16. [转]信息安全相关理论题(四)
  17. css栅格布局的四种大小xs,sm,md,lg
  18. 使用360文档卫士监控文件修改操作
  19. SQL Server Management Studio
  20. matlab实现彩色图像的直方图均衡化

热门文章

  1. 一起来看流星雨剧情简介/剧情介绍/剧情分集介绍第三十集
  2. did双重差分法_Stata中双重差分操流程及代码
  3. Swing学习1——总体概述
  4. python简单开发接口
  5. Python3——字典
  6. 用PHP去掉文件头的Unicode签名(BOM)
  7. js浏览器对象模型(BOM)
  8. gRPC编码初探(java)
  9. Silverlight 里如何实现隐式样式,ImplicitStyleManager 的实现思想
  10. NFC服务器在Linux,linux 安装 libnfc ,打开串口PN532