c#获取网口扫描枪数据
生活随笔
收集整理的這篇文章主要介紹了
c#获取网口扫描枪数据
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
之前負(fù)責(zé)過一個機(jī)場的項目,有一個環(huán)節(jié)是掃描登機(jī)牌,獲取旅客信息的操作,當(dāng)時是擬定了使用串口掃描槍來獲取登機(jī)牌信息,后面用測試了網(wǎng)口的,這里記錄一下當(dāng)時用來測試網(wǎng)口使用的程序,供有需求的小伙伴們參考
?
1、設(shè)置全局參數(shù),
?
private TcpClients _client;private string _ip = '192.168.1.1';//掃描槍ipprivate int _port = 4567;//掃描端口private bool bCnt = false;private bool t1Running = false;private bool t2Running = false;private static UdpClient client = new UdpClient(8081);//這邊是通訊端口,如果有多個設(shè)備,這里需要改變public Message_Scan data_ = new Message_Scan();//檢驗是否斷開鏈接或者斷網(wǎng)public bool client_Scan=false;//默認(rèn)為斷開鏈接private System.Threading.Timer timer_heart;//定時器2、存儲掃描槍的類,防止連續(xù)發(fā)送
?
/// <summary>/// 存儲掃描槍數(shù)據(jù)/// </summary>public class Message_Scan{public string message { get; set; }public DateTime CreateDatetime { get; set; }}3、主程序
data_.message = ""; //初始化消息_client = new TcpClients();_client.pushSockets = ReceiveMess;//注冊推送器client.JoinMulticastGroup(IPAddress.Parse("239.0.0.1"));t2Running = true;Thread t2 = new Thread(new ThreadStart(RecvThread2));t2.IsBackground = true;t2.Start();ConnectSocket();timer_heart = new System.Threading.Timer(new TimerCallback(MyDelegate_heart)); //實例化一個Timer時間器并啟動,用來加載列表模版列數(shù)據(jù)左邊參數(shù)為方法開始的時間,右邊為每此執(zhí)行方法的時間間隔,下面的意思是,十秒后,每過十秒執(zhí)行方法xxxtimer_heart.Change(15000, 15000);//15秒左右檢測設(shè)備心跳, /// <summary>/// 連接Socket/// </summary>public void ConnectSocket(){try{string ip = _ip;int port = _port;_client.InitSocket(ip, port);if (!bCnt){_client.Start();Logger.Info("連接成功");bCnt = true;}else{_client.Stop();Logger.Info("斷開成功");bCnt = false;}}catch (Exception ex){Logger.Info("鏈接失敗");}}//心跳方法 private void MyDelegate_heart(object state){// 如果建立鏈接,會循環(huán)進(jìn)入 ReceiveMess 方法,設(shè)置全局每次進(jìn)入,修改全局為true, //30s進(jìn)入心跳,如果為true,則修改全局為false,否則,則表示沒有進(jìn)入ReceiveMess 方法,即可發(fā)送心跳if (client_Scan==true){client_Scan = false;//修改為未連接,用來檢測是否斷開鏈接Logger.Info("通訊建立中");}else{//如果為false,則表示沒有進(jìn)入ReceiveMess方法,也就表示斷開鏈接了//這里可以自己業(yè)務(wù)進(jìn)行處理Logger.Info("通訊斷開,即將發(fā)送心跳");//準(zhǔn)備重連Logger.Info("進(jìn)行重連中");ConnectSocket();}}/// <summary>///接受線程/// </summary>private void RecvThread2(){IPEndPoint multicastin = new IPEndPoint(IPAddress.Parse("239.0.0.1"), 10001);while (t2Running){byte[] buf = client.Receive(ref multicastin);string msg = Encoding.Default.GetString(buf);string[] strList = msg.Split('&');if (strList[0].Length > 0){Logger.Info("strList" + strList[0]);t1Running = false;t2Running = false;}}}5、處理推送過來的消息
/// <summary>/// 處理推送過來的消息/// </summary>/// <param name="rec"></param>private void ReceiveMess(SocketHelper sks){client_Scan = true; //每次進(jìn)入都修改變量為已鏈接if (sks.ex != null){if (sks.ClientDispose == true){Logger.Info("由于未知原因引發(fā)異常.導(dǎo)致客戶端下線. 比如網(wǎng)絡(luò)故障.或服務(wù)器斷開連接.");}else{Logger.Info($"異常消息:{sks.ex}");}}else if (sks.Offset == 0){Logger.Info("客戶端下線");}else{byte[] buffer = new byte[sks.Offset];//需要和X4解碼協(xié)議對應(yīng),參照協(xié)議文檔Array.Copy(sks.RecBuffer, buffer, sks.Offset);if (buffer[4] != 0x00)return;int bcSize = 0;byte[] bcszieBuf = new byte[4];Array.Copy(buffer, 16, bcszieBuf, 0, 4);bcSize = BitConverter.ToInt32(bcszieBuf, 0);byte[] bcBuf = new byte[bcSize + 2];Array.Copy(buffer, 20, bcBuf, 0, bcSize);string str = Encoding.Default.GetString(bcBuf);if (str != "" || str != null){str = str.Replace("\r", "").Replace("\u0012", "");//去除特殊字符str = str.Split('\0')[0].ToString(); //截取字符串,\0\0\0dif (sks.Client.Client.Available > 0)//判斷消息是否發(fā)送完成,socket的數(shù)據(jù)大小限制,分多個包發(fā)送{Logger.Info("s:" + str);}else{//處理掃描槍數(shù)據(jù),比如重復(fù)發(fā)送Processing_data(str);}}else{Logger.Info("接受的消息長度為空或者為null值");}}}/// <summary>/// 處理掃描槍數(shù)據(jù)/// </summary>/// <param name="str"></param>public void Processing_data(string str){if (data_.message == "" || data_.message == null){data_.message = str;data_.CreateDatetime = DateTime.Now;Logger.Info(data_.message);//這里就可以對數(shù)據(jù)進(jìn)行處理了,比如發(fā)送給xxx設(shè)備}else if (data_.message == str){//獲取兩者時間差 TimeSpan ts = DateTime.Now.Subtract(data_.CreateDatetime);if (ts.TotalSeconds >= 7){data_.message = str;data_.CreateDatetime = DateTime.Now;//這里就可以對數(shù)據(jù)進(jìn)行處理了,比如發(fā)送給xxx設(shè)備}}else{data_.message = str;data_.CreateDatetime = DateTime.Now;//這里就可以對數(shù)據(jù)進(jìn)行處理了,比如發(fā)送給xxx設(shè)備}}這里給大家安排一個tcp調(diào)試工具
鏈接:https://pan.baidu.com/s/1rm7KCbT8kUp0udXCHU9IfQ?
提取碼:mszd
如果鏈接失效的話,可以關(guān)注“墨水直達(dá)”公眾號,回復(fù)“tcp調(diào)試工具”,即可獲取最新下載鏈接哦
?
有朋友反饋說TcpClients類找不到,是我的疏忽,這里將公共類補(bǔ)上:
鏈接:https://pan.baidu.com/s/1ZuXoguHU5VNaRnp9RGg5xA?
提取碼:mszd?
?到時候直接將包解壓放到項目中,引用就行
?
?
總結(jié)
以上是生活随笔為你收集整理的c#获取网口扫描枪数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷 1226 取余运算||快速幂
- 下一篇: C# 加密解密类