using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Windows.Forms; using System.Net; using System.Net.Sockets; using DevComponents.DotNetBar; namespace WCS { /// /// 条码线程 /// class BarcodeThread { #region 画面上同步显示控件 public ListBox barcodedisplay; public LabelX lb_barcode; delegate void displayresponse(string text); delegate void SetTextCallback(string barcode); #endregion Thread trd = null; string barcodeip = ""; int barcodeno = 0; int portno = 0; //int i = 1; //int scaleno = 0; main form1; private IPEndPoint ServerInfo; private Socket socket; private Byte[] MsgBuffer = new Byte[65535]; private Byte[] MsgSend = new Byte[65535]; public BarcodeThread(int barcode_no, string barcode_ip, int port, main f) { try { barcodeno = barcode_no; barcodeip = barcode_ip; this.portno = port; form1 = f; //MsgBuffer = new Byte[65535]; //MsgSend = new Byte[65535]; trd = new Thread(new ThreadStart(this.ThreadTask)); trd.IsBackground = true; trd.Start(); } catch (Exception em) { Common.WriteLogFile("WcsError", "BarcodeThread/BarcodeThread--条码线程启动出错:" + em.Message); } } #region socket连接 /// /// socket连接WMS服务器 /// private void SocketConnect() { ServerInfo = new IPEndPoint(IPAddress.Parse(barcodeip), portno); try { socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); socket.Connect(ServerInfo); //Int32 bytes = socket.Receive(MsgBuffer, MsgBuffer.Length, SocketFlags.None); //StringBuilder buff = new StringBuilder(); //String receiveData = Encoding.UTF8.GetString(MsgBuffer, 0, bytes); //socket.Send(Encoding.Unicode.GetBytes("socket connect!")); //RecevieData = "s"; //socket.BeginReceive(MsgBuffer, 0, MsgBuffer.Length, 0, new AsyncCallback(ReceiveCallBack), null); DisplayInfo("【" + DateTime.Now.ToString() + "】读取条码数据..."); } catch (Exception em) { DisplayInfo("【" + DateTime.Now.ToString() + "】条码连接失败!" + em.Message); Common.WriteLogFile("WcsError", "BarcodeThread/SocketConnect--条码连接失败:" + em.Message); } } /// /// socket重新连接WMS服务器 /// private void SocketReConnect() { if (socket.Connected) { socket.Close(); } Thread.Sleep(100); SocketConnect(); } /// /// 判断socket是否已连接 /// /// private bool checkSocket() { bool ret = true; bool isConnected = false; bool isRead = false; bool isWrite = false; bool isError = false; int avalSize = 0; try { isConnected = socket.Connected; isRead = socket.Poll(50, SelectMode.SelectRead); avalSize = socket.Available; isWrite = socket.Poll(50, SelectMode.SelectWrite); isError = socket.Poll(50, SelectMode.SelectError); if (isConnected == false || isError == true || (isRead == true && avalSize == 0)) { ret = false; } } catch (Exception em) { Common.WriteLogFile("WcsError", "BarcodeThread/checkSocket--判断条码是否连接失败:" + em.Message); ret = false; } return ret; } #endregion /// /// 获取条码扫描器数据并解析 /// private void GetBarcodeData() { string dataValue = "P", s_RecStr = ""; double d_RecStr = 0; try { if (checkSocket() == false) { //调用重连 //Common.gs_barcode_data[barcodeno - 1] = ""; //DisplayInfo("【" + DateTime.Now.ToString() + "】条码连接已断开,重连..."); SocketReConnect(); return; } MsgSend = Encoding.UTF8.GetBytes(dataValue); if (socket.Connected) { // 向主机发送数据. socket.Send(MsgSend, MsgSend.Length, SocketFlags.None); //socket.Send(MsgSend); //DisplayInfo("发送信息:" + dataValue); //RecevieData = ""; // 接收主机应答 socket.ReceiveTimeout = 60000; Int32 bytes = socket.Receive(MsgBuffer, MsgBuffer.Length, SocketFlags.None); StringBuilder buff = new StringBuilder(); if (bytes > 0) { // 将缓冲的字节数组,装换为字符串. // String receiveData = Encoding.ASCII.GetString(MsgBuffer, 0, bytes); s_RecStr = Encoding.ASCII.GetString(MsgBuffer, 0, bytes); s_RecStr = s_RecStr.Trim(''); if (s_RecStr.IndexOf("NOREAD") >= 0)// || (s_RecStr.Length < 7 && s_RecStr.Length > 0)) { //Common.gs_barcode_data[barcodeno - 1] = ""; DisplayInfo("【" + DateTime.Now.ToString() + "】条码返回信息:" + s_RecStr); return; } if (s_RecStr.Length < 7) { return; } s_RecStr = s_RecStr.Substring(0, 7); Common.gs_barcode_data[barcodeno - 1] = s_RecStr; //DisplayBarcode(Common.gs_barcode_data[barcodeno - 1]); DisplayInfo("【" + DateTime.Now.ToString() + "】" + Common.gs_barcode_data[barcodeno - 1]); //DisplayInfo("收到消息:" + receiveData); // AnalysisReceive(receiveData); //解析收到的数据 // 加入字符串缓存 //buff.Append(str); // 再次接受,看看后面还有没有数据. } } else { //Common.gs_barcode_data[barcodeno - 1] = ""; DisplayInfo("【" + DateTime.Now.ToString() + "】条码连接已断开,无法读取数据!"); } return; } catch(Exception em) { Common.WriteLogFile("WcsError", "BarcodeThread/GetBarcodeData--读取条码数据失败:" + em.Message); //Common.gs_barcode_data[barcodeno - 1] = ""; //DisplayInfo("【" + DateTime.Now.ToString() + "】扫描超时:" + t.Message); //Thread.Sleep(400); return; } } #region 通讯反馈同步显示 /// /// 显示条码通讯信息 /// /// private void DisplayInfo(string text) { if (barcodedisplay == null) { return; } if (barcodedisplay.InvokeRequired) { try { displayresponse d = new displayresponse(DisplayInfo); barcodedisplay.Invoke(d, new object[] { text }); } catch (Exception em) { Common.WriteLogFile("WcsError", "BarcodeThread/DisplayInfo--同步显示条码通讯信息失败:" + em.Message); } } else { if (barcodedisplay.Items.Count > 12) { barcodedisplay.Items.Clear(); } barcodedisplay.Items.Add(text); } } /// /// 显示条码号 /// /// private void DisplayBarcode(string barcode) { if (lb_barcode == null) { return; } if (lb_barcode.InvokeRequired) { try { SetTextCallback d = new SetTextCallback(DisplayBarcode); lb_barcode.Invoke(d, new object[] { barcode }); } catch (Exception em) { Common.WriteLogFile("WcsError", "BarcodeThread/DisplayBarcode--同步显示条码号失败:" + em.Message); } } else { lb_barcode.Text = barcode; } } #endregion /// /// 条码主线程 /// private void ThreadTask() { SocketConnect(); while (true) { GetBarcodeData(); Thread.Sleep(Common.ci_BarcodetimeInterval); } } } }