using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.IO; using System.Net; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using GalaSoft.MvvmLight.Command; using TouchSocket.Core; using TouchSocket.Sockets; namespace SocketExample { public partial class TCPWindowV2 { public class PanelItem : INotifyPropertyChanged //实现组件更改的接口 { #region 变量定义 IPAddress ip; int port; ITcpClient client; MySessionClient TcpSessionClient; public string option;//命令选项 public ICommand TextChangedCommand { get; set; } public ICommand SelectionChangedCommand { get; set; } public ICommand SendTextChangedCommand { get; set; } public ICommand GPOSelectionChangedCommand { get; set; } private ObservableCollection _tagItems; public ObservableCollection TagItems { get => _tagItems; set { _tagItems = value; OnPropertyChanged(); } } public string Text { get; set; }//客户端编号 public string IPtext { get; set; }//IP文本框 public string Porttext { get; set; }//端口文本框 private string _messagetext; public string SessionID { get; set; } public int Borderwidth { get => _borderwidth; set { _borderwidth = value; OnPropertyChanged(); } } private int _borderwidth { get; set; } public string MessageText { get => _messagetext; set { _messagetext = value; OnPropertyChanged(); } }//发送框 private string _statecolour { get; set; }//状态指示灯 public string StateColour { get => _statecolour; set { _statecolour = value; OnPropertyChanged(); } } private string _linkstate;//链接状态文本 public string LinkState { get => _linkstate; set { _linkstate = value; OnPropertyChanged(); } } public string LinkButtonText { get => _linkbuttontext; set { _linkbuttontext = value; OnPropertyChanged(); } } private string _linkbuttontext { get; set; } private string _infotext;//信息框 public string Infotext { get => _infotext; set { _infotext = value; OnPropertyChanged(); // 通知 UI 更新 } } private bool _iptextreadonly; public bool IPtext_ReadOnly { get => _iptextreadonly;set { _iptextreadonly = value; OnPropertyChanged(); } } private bool _porttextreadonly; public bool Porttext_ReadOnly { get => _porttextreadonly; set { _porttextreadonly = value; OnPropertyChanged(); } } public string _actiontype;//触发动作 public string ActionType { get => _actiontype; set { _actiontype = value; OnPropertyChanged(); } } public string _timeout;//时间段盘点 public string TimeOut { get => _timeout; set { _timeout = value; OnPropertyChanged(); } } private string _rssiinfo;//RSSI强度 public string RSSIinfo { get => _rssiinfo; set { _rssiinfo = value; OnPropertyChanged(); } } private string _countinfo;//count数值 public string Countinfo { get => _countinfo; set { _countinfo = value; OnPropertyChanged(); } } private string _timeinfo;//当前时间 public string Timeinfo { get => _timeinfo; set { _timeinfo = value; OnPropertyChanged(); } } private string _epcinfo;//EPC信息 private string _epcasc;//ASC2码 EPC信息 public string EPCinfo { get => _epcinfo; set { _epcinfo = value; OnPropertyChanged(); } } public string EPCASC { get => _epcasc; set { _epcasc = value; OnPropertyChanged(); } } private string _readpowerstate; public string ReadPowerState { get => _readpowerstate; set { _readpowerstate = value; OnPropertyChanged(); } } private string _writepowerstate; public string WritePowerState { get => _writepowerstate; set { _writepowerstate = value; OnPropertyChanged(); } } private string _port1readtext; private string _port2readtext; private string _port3readtext; private string _port4readtext;//设置读功率1-4 private string _port1writetext; private string _port2writetext; private string _port3writetext; private string _port4writetext;//设置读功率1-4 private int[] _portComboBox; private string[] _gpoComboBox; private string[] _sendtextComboBox;//下拉框数据源 public string Port1ReadText { get => _port1readtext; set { _port1readtext = value; OnPropertyChanged(); } } public string Port2ReadText { get => _port2readtext; set { _port2readtext = value; OnPropertyChanged(); } } public string Port3ReadText { get => _port3readtext; set { _port3readtext = value; OnPropertyChanged(); } } public string Port4ReadText { get => _port4readtext; set { _port4readtext = value; OnPropertyChanged(); } } public string Port1WriteText { get => _port1writetext; set { _port1writetext = value; OnPropertyChanged(); } } public string Port2WriteText { get => _port2writetext; set { _port2writetext = value; OnPropertyChanged(); } } public string Port3WriteText { get => _port3writetext; set { _port3writetext = value; OnPropertyChanged(); } } public string Port4WriteText { get => _port4writetext; set { _port4writetext = value; OnPropertyChanged(); } } public int[] PortComboBox { get => _portComboBox; set { _portComboBox = value; OnPropertyChanged(); } } public string[] GPOComboBox { get => _gpoComboBox; set { _gpoComboBox = value; OnPropertyChanged(); } } public string[] SendTextComboBox { get => _sendtextComboBox; set { _sendtextComboBox = value; OnPropertyChanged(); } } private string _gpo1; private string _gpo2; private string _gpo3; private string _gpo4;//GPO1-4状态 private string _gpi1; private string _gpi2; private string _gpi3; private string _gpi4;//GPIO1-4状态 public string GPO1 { get => _gpo1; set { _gpo1 = value; OnPropertyChanged(); } } public string GPO2 { get => _gpo2; set { _gpo2 = value; OnPropertyChanged(); } } public string GPO3 { get => _gpo3; set { _gpo3 = value; OnPropertyChanged(); } } public string GPO4 { get => _gpo4; set { _gpo4 = value; OnPropertyChanged(); } } public string GPI1 { get => _gpi1; set { if (_gpi1 != value && _gpi1 != null) { _gpi1 = value; OnPropertyChanged(); } else { _gpi1 = value; OnPropertyChanged(); } } } public string GPI2 { get => _gpi2; set { if (_gpi2 != value && _gpi1 != null) { _gpi2 = value; OnPropertyChanged(); } else { _gpi2 = value; OnPropertyChanged(); } } } public string GPI3 { get => _gpi3; set { if (_gpi3 != value && _gpi1 != null) { _gpi3 = value; OnPropertyChanged(); } else { _gpi3 = value; OnPropertyChanged(); } } } public string GPI4 { get => _gpi4; set { if (_gpi4 != value && _gpi1 != null) { _gpi4 = value; OnPropertyChanged(); } else { _gpi4 = value; OnPropertyChanged(); } } } private string _moduleinfo; private string _motherboardhardware; private string _motherboardfirmware;//设备信息 public string moduleInfo { get => _moduleinfo; set { _moduleinfo = value; OnPropertyChanged(); } } public string motherboardHardware { get => _motherboardhardware; set { _motherboardhardware = value; OnPropertyChanged(); } } public string motherboardFirmware { get => _motherboardfirmware; set { _motherboardfirmware = value; OnPropertyChanged(); } } public string path; public StreamWriter streamWriter; public LinkCommand linkcomn;//链接命令 public LinkCommand readcomn;//读取命令 public LinkCommand sendcomn;//发送命令 public LinkCommand disconnectcomn;//断连命令 public LinkCommand clearcomn;//清空命令 public LinkCommand setpowercomn; //设置功率 public LinkCommand getpowercomn;//获取功率 public LinkCommand stopreadingcomn;//停止连续读取功能 public LinkCommand sendactioncomn; public LinkCommand powerselectchanged; Thread GPIOthread; #endregion public PanelItem(int index) { Text = $"客户端{index + 1}"; LinkButtonText = "连接"; StateColour = "Red"; LinkState = "未连接"; IPtext_ReadOnly = false; Porttext_ReadOnly = false; PanelInitialization(); } public PanelItem(MySessionClient recieveClient) { Text = $"服务端{recieveClient.Id.Substring(0,2)}"; TcpSessionClient = recieveClient; SessionID = recieveClient.Id; TcpSessionClient.OnMessageReceived += ClientRecieved; TcpSessionClient.Closed = (client, e) => { try { if(GPIOthread!=null) GPIOthread.Abort(); Infotext += "已断开!\n"; StateColour = "Red"; LinkState = "未连接"; } catch (Exception ex) { Infotext += ex; } return EasyTask.CompletedTask; }; LinkButtonText = "断开"; StateColour = "Green"; LinkState = "已连接"; IPtext_ReadOnly = true; Porttext_ReadOnly = true; PanelInitialization(); IPtext = recieveClient.IP;//默认IP Porttext = recieveClient.Port.ToString();//默认端口 linkcomn = new LinkCommand(SessionButton_Close); sendcomn = new LinkCommand(SessionButton_Click_Send); sendactioncomn = new LinkCommand(SessionButton_SendActionComn); GPOSelectionChangedCommand = new RelayCommand(SessionGPOComboBox_SelectChanged); Thread thread = new Thread(() => //连接初始化线程防止卡住UI线程 { SessionClientConnected(TcpSessionClient); }); thread.Start(); } public void PanelInitialization()//终端初始化 { linkcomn = new LinkCommand(Button_Link);//绑定按钮的链接事件 readcomn = new LinkCommand(Button_Read); stopreadingcomn = new LinkCommand(Button_StopReading); sendcomn = new LinkCommand(Button_Click_Send);//绑定发送按钮的事件 sendactioncomn = new LinkCommand(Button_SendActionComn); disconnectcomn = new LinkCommand(Button_disconnect);//绑定断连按钮的事件 clearcomn = new LinkCommand(Button_clear);//绑定清空按钮的事件 setpowercomn = new LinkCommand(Button_SetPower); getpowercomn = new LinkCommand(Button_GetPower); SelectionChangedCommand = new RelayCommand(ComboBox_SelectChanged); GPOSelectionChangedCommand = new RelayCommand(GPOComboBox_SelectChanged); SendTextChangedCommand = new RelayCommand(SendTextComboBox_SelectChanged); TextChangedCommand = new RelayCommand(TextBlock_SelectChanged); //页面初始化 int[] Powerdatasource = { 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33 }; string[] GPOdatasource = { "高", "低" }; string[] SendTextdatasource = { "单次盘点", "时间段盘点" }; Borderwidth = GetTerminalWidth(); //动态生成界面宽度 MessageText = string.Empty; IPtext = "192.168.0.7";//默认IP Porttext = "20108";//默认端口 RSSIinfo = "##"; Countinfo = "00"; EPCASC = "###"; EPCinfo = "###"; PortComboBox = Powerdatasource; GPOComboBox = GPOdatasource; SendTextComboBox = SendTextdatasource; GPO1 = "低"; GPO2 = "低"; GPO3 = "低"; GPO4 = "低"; GPI1 = "低"; GPI2 = "低"; GPI3 = "低"; GPI4 = "低"; }//终端初始化 #region 界面功能绑定定义 public LinkCommand _powerselectchanged { get { return powerselectchanged; } } public LinkCommand _linkcomn { get { return linkcomn; } } public LinkCommand _readcomn { get { return readcomn; } } public LinkCommand _stopreadingcomn { get { return stopreadingcomn; } } public LinkCommand _sendcomn { get { return sendcomn; } } public LinkCommand _disconnectcomn { get { return disconnectcomn; } } public LinkCommand _clearcomn { get { return clearcomn; } } public LinkCommand _setpowercomn { get { return setpowercomn; } } public LinkCommand _getpowercomn { get { return getpowercomn; } } public LinkCommand _sendactioncomn { get { return sendactioncomn; } } #endregion #region socket事件 private Task onRecieved(ITcpClient client, ReceivedDataEventArgs e) //接收事件 { ClientRecieved(e); return EasyTask.CompletedTask; } private void ClientRecieved(ReceivedDataEventArgs e) { Text = Text.Replace(" ", ""); path = ""; string time = DateTime.Now.ToString(); string currentTime = DateTime.Now.ToString("T"); var mes = e.ByteBlock.Span.ToString(Encoding.UTF8); byte[] data = e.ByteBlock.Span.ToArray(); string hexString = BitConverter.ToString(data).Replace("-", " "); //读取状态 string readStateString = hexString.Replace(" ", "");//去掉字符串中空格 string dataLength = readStateString.Substring(4, 2);//获取字符串中内容长度 string commandState = readStateString.Substring(6, 2);//获取命令 if (commandState != "81") Infotext += $"\n({currentTime})客户端接收到信息:\n{hexString}\n"; int i = Convert.ToInt32(dataLength, 16); if (i != 0) { switch (commandState) { case "01": try { byte[] newData = new byte[data.Length + 1]; Array.Copy(data, 0, newData, 0, 5); // 复制前半部分 // 插入新值 Array.Copy(data, 5, newData, 5, 4); Array.Copy(data, 5, newData, 6, data.Length - 5); Timeinfo = $"{time}";//获取时间 //Infotext += $"({currentTime})客户端接收到EPC信息:\n{EPCASC}\n\n"; List taglist = GetTagInfos(newData); ObservableCollection items = new ObservableCollection(); for (int j = 0; j < taglist.Count; j++) { EPCinfo = BitConverter.ToString(taglist[j].EPC).Replace("-", ""); items.Add(new TagItem(hexString, taglist[j].EPCstring, EPCinfo, taglist[j].RSSI.ToString(), taglist[j].Count.ToString(), Timeinfo)); string year = DateTime.Now.ToString("yyyy-MM-dd"); EnsureFolderExists($"日志文件夹/{year}/{Text}"); path = $"日志文件夹/{year}/{Text}/" + Text + "标签(" + IPtext + ")" + ".txt"; EnsureTxtExists(path, Text, IPtext, Porttext); writeToTxt(path, $"接收消息:{hexString}\nEPC:{taglist[j].EPCstring}\nHEX:{EPCinfo}\nRSSI:{taglist[j].RSSI.ToString()} Count:{taglist[j].Count.ToString()} Time:{Timeinfo}\n____________________________"); path = ""; //LogService.Instance.Debug(""); } TagItems = items; } catch (Exception ex) { Infotext += ex; } break; case "02": try { Timeinfo = $"{time}";//获取时间 //Infotext += $"({currentTime})客户端接收到EPC信息:\n{EPCASC}\n\n"; List taglist = GetTagInfos(data); ObservableCollection items = new ObservableCollection(); for (int j = 0; j < taglist.Count; j++) { EPCinfo = BitConverter.ToString(taglist[j].EPC).Replace("-", ""); items.Add(new TagItem(hexString, taglist[j].EPCstring, EPCinfo, taglist[j].RSSI.ToString(), taglist[j].Count.ToString(), Timeinfo)); string year = DateTime.Now.ToString("yyyy-MM-dd"); EnsureFolderExists($"日志文件夹/{year}/{Text}"); path = $"日志文件夹/{year}/{Text}/" + Text + "标签(" + IPtext + ")" + ".txt"; EnsureTxtExists(path, Text, IPtext, Porttext); writeToTxt(path, $"接收消息:{hexString}\nEPC:{taglist[j].EPCstring}\nHEX:{EPCinfo}\nRSSI:{taglist[j].RSSI.ToString()} Count:{taglist[j].Count.ToString()} Time:{Timeinfo}\n____________________________"); path = ""; //LogService.Instance.Debug(""); } TagItems = items; } catch (Exception ex) { Infotext += ex; } break; case "81": //获取GPIO状态,16进制转二进制 string GPIBinInfo = Convert.ToString(Convert.ToInt32(readStateString.Substring(12, 2), 16), 2).PadLeft(8, '0'); string GPOBinInfo = Convert.ToString(Convert.ToInt32(readStateString.Substring(10, 2), 16), 2).PadLeft(8, '0'); bool GPIchange = false; string GPI1string = ""; string GPI2string = ""; string GPI3string = ""; string GPI4string = ""; string GPIyear = DateTime.Now.ToString("yyyy-MM-dd"); for (int j = 4; j < GPOBinInfo.Length; j++) { //按位判断GPIO状态 switch (j) { case 4: if (GPOBinInfo.Substring(j, 1) == "1") GPO4 = "高"; else GPO4 = "低"; if (GPIBinInfo.Substring(j, 1) == "1") { if (GPI4 != "低") { GPI4 = "低"; GPI4string = "GPI4:" + GPIChangeLog(GPI4); GPIchange = true; } } else if (GPI4 != "高") { GPI4 = "高"; GPI4string = "GPI4:" + GPIChangeLog(GPI4); GPIchange = true; } break; case 5: if (GPOBinInfo.Substring(j, 1) == "1") GPO3 = "高"; else GPO3 = "低"; if (GPIBinInfo.Substring(j, 1) == "1") { if (GPI3 != "低") { GPI3 = "低"; GPI3string = "GPI3:" + GPIChangeLog(GPI3) + " "; GPIchange = true; } } else if (GPI3 != "高") { GPI3 = "高"; GPI3string = "GPI3:" + GPIChangeLog(GPI3) + " "; GPIchange = true; } break; case 6: if (GPOBinInfo.Substring(j, 1) == "1") GPO2 = "高"; else GPO2 = "低"; if (GPIBinInfo.Substring(j, 1) == "1") { if (GPI2 != "低") { GPI2 = "低"; GPI2string = "GPI2:" + GPIChangeLog(GPI2) + " "; GPIchange = true; } } else if (GPI2 != "高") { GPI2 = "高"; GPI2string = "GPI2:" + GPIChangeLog(GPI2) + " "; GPIchange = true; } break; case 7: if (GPOBinInfo.Substring(j, 1) == "1") GPO1 = "高"; else GPO1 = "低"; if (GPIBinInfo.Substring(j, 1) == "1") { if (GPI1 != "低") { GPI1 = "低"; GPI1string = "GPI1:" + GPIChangeLog(GPI1) + " "; GPIchange = true; } } else if (GPI1 != "高") { GPI1 = "高"; GPI1string = "GPI1:" + GPIChangeLog(GPI1) + " "; GPIchange = true; } break; default: break; } } if (GPIchange == true) { EnsureFolderExists($"日志文件夹/{GPIyear}/{Text}"); string temppath = $"日志文件夹/{GPIyear}/{Text}/" + Text + "GPI" + "(" + IPtext + ")" + ".txt"; EnsureTxtExists(temppath, Text, IPtext, Porttext); string currenttime = DateTime.Now.ToString(); writeToTxt(temppath, $"{GPI1string}{GPI2string}{GPI3string}{GPI4string}\n当前状态:GPI1:{GPI1} GPI2:{GPI2} GPI3:{GPI3} GPI4:{GPI4}\n当前时间:{currenttime}\n ______________________________"); GPIchange = false; } break; case "72": //获取功率信息 try { for (int n = 0; n < (Convert.ToInt32(dataLength, 16) / 5); n++) { switch (n) { case 0: Port1ReadText = $"{(Convert.ToInt32(readStateString.Substring(12 + 10 * n, 4), 16) / 100).ToString()}"; Port1WriteText = $"{(Convert.ToInt32(readStateString.Substring(16 + 10 * n, 4), 16) / 100).ToString()}"; break; case 1: Port2ReadText = $"{(Convert.ToInt32(readStateString.Substring(12 + 10 * n, 4), 16) / 100).ToString()}"; Port2WriteText = $"{(Convert.ToInt32(readStateString.Substring(16 + 10 * n, 4), 16) / 100).ToString()}"; break; case 2: Port3ReadText = $"{(Convert.ToInt32(readStateString.Substring(12 + 10 * n, 4), 16) / 100).ToString()}"; Port3WriteText = $"{(Convert.ToInt32(readStateString.Substring(16 + 10 * n, 4), 16) / 100).ToString()}"; break; case 3: Port4ReadText = $"{(Convert.ToInt32(readStateString.Substring(12 + 10 * n, 4), 16) / 100).ToString()}"; Port4WriteText = $"{(Convert.ToInt32(readStateString.Substring(16 + 10 * n, 4), 16) / 100).ToString()}"; break; default: break; } } } catch { } break; case "70": //获取设备信息 switch (option) { case "00": moduleInfo = Encoding.ASCII.GetString(HextoByte(readStateString.Substring(10, Convert.ToInt32(dataLength, 16) * 2))); //Infotext += $"({currentTime})客户端接收到module信息:\n{moduleInfo}\n\n"; writeToTxt(path, $"模块信息:{moduleInfo}"); break; case "03": motherboardHardware = Encoding.ASCII.GetString(HextoByte(readStateString.Substring(10, Convert.ToInt32(dataLength, 16) * 2))); //Infotext += $"({currentTime})客户端接收到hardware信息:\n{motherboardHardware}\n\n"; writeToTxt(path, $"硬件信息:{motherboardHardware}"); break; case "04": motherboardFirmware = Encoding.ASCII.GetString(HextoByte(readStateString.Substring(10, Convert.ToInt32(dataLength, 16) * 2))); //Infotext += $"({currentTime})客户端接收到firmware信息:\n{motherboardFirmware}\n\n"; writeToTxt(path, $"固件信息:{motherboardFirmware}"); option = ""; break; } break; default: //Infotext += $"default"; break; } //streamWriter.Close(); } else { switch (commandState) { case "01": case "02": Infotext += "未读取到\n"; RSSIinfo = "No Read";//未读取到数值时清空数据为初始值 Countinfo = "00"; EPCASC = "No Read"; EPCinfo = "No Read"; Timeinfo = $" {time}";//获取时间 ObservableCollection items = new ObservableCollection(); items.Add(new TagItem(hexString, EPCASC, EPCinfo, RSSIinfo, Countinfo, Timeinfo)); TagItems = items; string year = DateTime.Now.ToString("yyyy-MM-dd"); EnsureFolderExists($"日志文件夹/{year}/{Text}"); path = $"日志文件夹/{year}/{Text}/" + Text + "标签(" + IPtext + ")" + ".txt"; EnsureTxtExists(path, Text, IPtext, Porttext); writeToTxt(path, $"接收消息:{hexString}\nEPC:{EPCASC}\nHEX:{EPCinfo}\nRSSI:{RSSIinfo} Count:{Countinfo} Time:{Timeinfo}\n____________________________"); path = ""; break; } } } private Task onConnected(ITcpClient client, ConnectedEventArgs e)//连接后初始化 { ClientConnected(client); return EasyTask.CompletedTask; } private void ClientConnected(ITcpClient client) { try { Infotext += "已连接!\n"; StateColour = "Green"; LinkState = "已连接"; //streamWriter = new StreamWriter(path); byte[] data = strToToHexByte("AA 55 01 70 00 71 0D");//获取模块信息 option = "00"; client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 01 70 03 72 0D");//获取主板硬件信息 option = "03"; client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 01 70 04 75 0D");//获取主板固件信息 option = "04"; client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 00 72 72 0D");//获取功率状态 client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 00 81 81 0D");//获取GPIO状态 client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 02 02 07 D0 D7 0D");//获取1000ms内标签信息 client.Send(data); Thread.Sleep(1000); GPIOthread = new Thread(new ThreadStart(delegate () { while (true) { byte[] data = strToToHexByte("AA 55 00 81 81 0D"); client.Send(data); Thread.Sleep(1000); } })); GPIOthread.Start();//心跳获取GPIO状态 } catch (Exception ex) { Infotext += $"连接时报错,错误内容:{ex}!\n"; } } private void SessionClientConnected(MySessionClient client) { try { Infotext += "已连接!\n"; StateColour = "Green"; LinkState = "已连接"; //streamWriter = new StreamWriter(path); byte[] data = strToToHexByte("AA 55 01 70 00 71 0D");//获取模块信息 option = "00"; client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 01 70 03 72 0D");//获取主板硬件信息 option = "03"; client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 01 70 04 75 0D");//获取主板固件信息 option = "04"; client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 00 72 72 0D");//获取功率状态 client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 00 81 81 0D");//获取GPIO状态 client.Send(data); Thread.Sleep(500); data = strToToHexByte("AA 55 02 02 07 D0 D7 0D");//获取1000ms内标签信息 client.Send(data); Thread.Sleep(1000); GPIOthread = new Thread(new ThreadStart(delegate () { while (true) { byte[] data = strToToHexByte("AA 55 00 81 81 0D"); client.Send(data); Thread.Sleep(1000); } })); GPIOthread.Start();//心跳获取GPIO状态 } catch (Exception ex) { Infotext += $"连接时报错,错误内容:{ex}!\n"; } } #endregion #region 辅助功能 private string GPIChangeLog(string gpiInfo) { if (gpiInfo == "低") { return "高 => 低"; } else if (gpiInfo == "高") { return "低 => 高"; } throw new NotImplementedException(); } public int GetTerminalWidth() { int number = 4; int width = ((int)SystemParameters.PrimaryScreenWidth - 60) / number; while (width < 360 || width > 700) { if (width < 360) { number--; } else if (width > 700) { number++; } width = ((int)SystemParameters.PrimaryScreenWidth - 60) / number; } return width; } static void GetGPIOThread(ITcpClient client) { byte[] data = strToToHexByte("AA 55 00 81 81 0D");//获取GPIO状态 client.Send(data); } public byte GetXor(byte[] data, int m) { byte CheckCode = 0; int len = data.Length; for (int i = m; i < len; i++) { CheckCode ^= data[i]; } return CheckCode; } private static byte[] HextoByte(string Temp) { byte[] Tempbytes = new byte[Temp.Length / 2];//16进制转byte数组 for (int m = 0; m < Temp.Length; m += 2) { try { Tempbytes[m / 2] = Convert.ToByte(Temp.Substring(m, 2), 16); } catch (Exception excp) { } } return Tempbytes; } private static byte[] strToToHexByte(string hexString)//字符串转16进制 { hexString = hexString.Replace(" ", ""); if ((hexString.Length % 2) != 0) hexString += " "; byte[] returnBytes = new byte[hexString.Length / 2]; for (int i = 0; i < returnBytes.Length; i++) returnBytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2).Trim(), 16); return returnBytes; } private static void writeToTxt(string path, string content) { StreamWriter streamWriter = new StreamWriter(path, true); streamWriter.WriteLineAsync(content); streamWriter.Close(); } #endregion #region 动态界面控件功能 async void Button_Link()//链接按钮的事件 { if (LinkButtonText == "连接") { try { ip = IPAddress.Parse(IPtext); port = int.Parse(Porttext); Infotext += $"{Text}"; client = new TcpClient(); //连接事件 client.Connected += onConnected; //断连事件 client.Closed = (client, e) => { try { GPIOthread.Abort(); Infotext += "已断开!\n"; StateColour = "Red"; LinkState = "未连接"; } catch (Exception ex) { Infotext += ex; } return EasyTask.CompletedTask; }; //接收事件 client.Received += onRecieved; //设置连接属性 await client.SetupAsync(new TouchSocketConfig().SetRemoteIPHost($"{IPtext}:{Porttext}").ConfigureContainer(a => { a.AddConsoleLogger();//添加一个日志注入 })); //开启连接 await client.ConnectAsync(); } catch (Exception ex) { Infotext += $"处理请求时出错: {ex.Message}\n"; } LinkButtonText = "断开"; } else { client.Close(); LinkButtonText = "连接"; } } async void SessionButton_Close() { TcpSessionClient.Close(); } void Button_Read() { try { byte[] data = strToToHexByte("AA 55 02 02 07 D0 D7 0D");//获取2000ms内标签信息 client.Send(data); } catch (Exception ex) { Infotext += $"发送读取命令时出错: {ex.Message}\n"; } } void Button_StopReading() { try { byte[] data = strToToHexByte("AA 55 02 12 00 00 10 0D");//停止连续盘点 client.Send(data); } catch (Exception ex) { Infotext += $"发送读取命令时出错: {ex.Message}\n"; } } void Button_SetPower() { try { if (Port1ReadText == null || Port1WriteText == null || Port2ReadText == null || Port2WriteText == null || Port3ReadText == null || Port3WriteText == null || Port4ReadText == null || Port4WriteText == null) { MessageBox.Show("数值不可为空!"); return; } string setPowerString = "AA 55 14 42 ";//设置命令开头 int[] powers = new int[8] {int.Parse(Port1ReadText),int.Parse(Port2ReadText), int.Parse(Port3ReadText), int.Parse(Port4ReadText), int.Parse(Port1WriteText),int.Parse(Port2WriteText),int.Parse(Port3WriteText),int.Parse(Port4WriteText)}; for (int i = 0; i < powers.Length / 2; i++) { setPowerString += $"0{i + 1} {(powers[i] * 100).ToString("X").PadLeft(4, '0').Insert(2, " ")} {(powers[i + 4] * 100).ToString("X").PadLeft(4, '0').Insert(2, " ")} "; }//功率设置时为两位数,乘100后再转换为16进制字符串,再填满左侧保证4位数,最后两位两位隔开 byte[] powerdata = strToToHexByte(setPowerString); byte xor = GetXor(powerdata, 2);//计算校验位 setPowerString += Convert.ToString(xor, 16) + " 0D";//校验位需转成16进制字符串,命令结尾 byte[] data = strToToHexByte(setPowerString); client.Send(data); Infotext += setPowerString; data = strToToHexByte("AA 55 00 72 72 0D");//获取功率 client.Send(data); } catch (Exception e) { Infotext += $"处理请求时出错: {e.Message}\n"; } } void Button_GetPower() { try { byte[] data = strToToHexByte("AA 55 00 72 72 0D");//获取功率 client.Send(data); } catch (Exception ex) { Infotext += ex.Message; } } void Button_Click_Send()//发送按钮的事件 { try { string message = MessageText; if (message == string.Empty) { MessageBox.Show("输入内容不能为空!"); } else { byte[] data = Encoding.UTF8.GetBytes(message); client.Send(data);//发送原始数据 client.Send(strToToHexByte(message));//发送16进制数据 } MessageText = ""; } catch (Exception ex) { Infotext += $"处理请求时出错: {ex.Message}\n"; } } void SessionButton_Click_Send()//发送按钮的事件 { try { string message = MessageText; if (message == string.Empty) { MessageBox.Show("输入内容不能为空!"); } else { byte[] data = Encoding.UTF8.GetBytes(message); TcpSessionClient.Send(data);//发送原始数据 TcpSessionClient.Send(strToToHexByte(message));//发送16进制数据 } MessageText = ""; } catch (Exception ex) { Infotext += $"处理请求时出错: {ex.Message}\n"; } } void Button_SendActionComn() { try { string message = ActionType; if (message == string.Empty || message == null) { MessageBox.Show("请选择触发动作!"); } else { try { byte[] data = null; switch (message) { case "单次盘点": ActionType = "单次盘点"; data = strToToHexByte(CheckForOnce());//单次 break; /* case "连续读取": ActionType = "连续读取"; data = strToToHexByte("AA 55 02 11 00 00 13 0D");//连续 break; */ case "时间段盘点": ActionType = "时间段盘点"; data = strToToHexByte(CheckDuringTime()); break; } client.Send(data); } catch (Exception ex) { Infotext += ex.Message; } } } catch (Exception ex) { } } void SessionButton_SendActionComn() { try { string message = ActionType; if (message == string.Empty || message == null) { MessageBox.Show("请选择触发动作!"); } else { try { byte[] data = null; switch (message) { case "单次盘点": ActionType = "单次盘点"; data = strToToHexByte(CheckForOnce());//单次 break; /* case "连续读取": ActionType = "连续读取"; data = strToToHexByte("AA 55 02 11 00 00 13 0D");//连续 break; */ case "时间段盘点": ActionType = "时间段盘点"; data = strToToHexByte(CheckDuringTime()); break; } TcpSessionClient.Send(data); } catch (Exception ex) { Infotext += ex.Message; } } } catch (Exception ex) { } } void Button_disconnect() { client.Close();//断开连接 } void Button_clear() { Infotext = string.Empty;//清空信息框 } void TextBlock_SelectChanged(ScrollViewer scrollViewer) { scrollViewer.ScrollToVerticalOffset(scrollViewer.ExtentHeight); } void ComboBox_SelectChanged(ComboBox sender) { string comboxname = sender.Name; try { switch (comboxname) { case "Port1ReadComboBox": Port1ReadText = sender.SelectedItem?.ToString(); break; case "Port2ReadComboBox": Port2ReadText = sender.SelectedItem?.ToString(); break; case "Port3ReadComboBox": Port3ReadText = sender.SelectedItem?.ToString(); break; case "Port4ReadComboBox": Port4ReadText = sender.SelectedItem?.ToString(); break; case "Port1WriteComboBox": Port1WriteText = sender.SelectedItem?.ToString(); break; case "Port2WriteComboBox": Port2WriteText = sender.SelectedItem?.ToString(); break; case "Port3WriteComboBox": Port3WriteText = sender.SelectedItem?.ToString(); break; case "Port4WriteComboBox": Port4WriteText = sender.SelectedItem?.ToString(); break; } sender.SelectedItem = null; } catch (Exception ex) { Infotext += ex.Message; } } void GPOComboBox_SelectChanged(ComboBox sender) { string Order = "AA 55 04 51 "; string comboxname = sender.Name; try { if (sender.SelectedItem == null) return; switch (comboxname) { case "GPO1ComboBox": GPO1 = sender.SelectedItem?.ToString(); Order += "01 "; break; case "GPO2ComboBox": GPO2 = sender.SelectedItem?.ToString(); Order += "02 "; break; case "GPO3ComboBox": GPO3 = sender.SelectedItem?.ToString(); Order += "03 "; break; case "GPO4ComboBox": GPO4 = sender.SelectedItem?.ToString(); Order += "04 "; break; } if (sender.SelectedItem?.ToString() == "高") Order += "01 "; else if (sender.SelectedItem?.ToString() == "低") Order += "00 "; Order += "00 00 "; Order += Convert.ToString(GetXor(strToToHexByte(Order), 2), 16) + " 0D"; //Infotext += Order+"\n"; byte[] data = strToToHexByte(Order); client.Send(data); data = strToToHexByte("AA 55 00 81 81 0D");//获取GPIO状态 client.Send(data); sender.SelectedIndex = -1; //SaveCommand(); } catch (Exception ex) { Infotext += ex.Message; } } void SessionGPOComboBox_SelectChanged(ComboBox sender) { string Order = "AA 55 04 51 "; string comboxname = sender.Name; try { if (sender.SelectedItem == null) return; switch (comboxname) { case "GPO1ComboBox": GPO1 = sender.SelectedItem?.ToString(); Order += "01 "; break; case "GPO2ComboBox": GPO2 = sender.SelectedItem?.ToString(); Order += "02 "; break; case "GPO3ComboBox": GPO3 = sender.SelectedItem?.ToString(); Order += "03 "; break; case "GPO4ComboBox": GPO4 = sender.SelectedItem?.ToString(); Order += "04 "; break; } if (sender.SelectedItem?.ToString() == "高") Order += "01 "; else if (sender.SelectedItem?.ToString() == "低") Order += "00 "; Order += "00 00 "; Order += Convert.ToString(GetXor(strToToHexByte(Order), 2), 16) + " 0D"; //Infotext += Order+"\n"; byte[] data = strToToHexByte(Order); TcpSessionClient.Send(data); data = strToToHexByte("AA 55 00 81 81 0D");//获取GPIO状态 TcpSessionClient.Send(data); sender.SelectedIndex = -1; //SaveCommand(); } catch (Exception ex) { Infotext += ex.Message; } } void SendTextComboBox_SelectChanged(ComboBox sender) { string selcetion = sender.SelectedItem?.ToString(); try { //byte[] data = null; switch (selcetion) { case "单次盘点": ActionType = "单次盘点"; //data = strToToHexByte("AA 55 02 01 00 64 67 0D");//单次 break; /* case "连续读取": ActionType = "连续读取"; data = strToToHexByte("AA 55 02 11 00 00 13 0D");//连续 break; */ case "时间段盘点": ActionType = "时间段盘点"; //data = strToToHexByte(CheckDuringTime()); break; } //client.Send(data); sender.SelectedItem = null; } catch (Exception ex) { Infotext += ex.Message; } } public void dispose() { try { if (client != null) client.Close(); if (GPIOthread != null) GPIOthread.Abort(); } catch (Exception ex) { } } public void Sessiondispose() { try { if (TcpSessionClient != null) TcpSessionClient.Close(); if (GPIOthread != null) GPIOthread.Abort(); } catch (Exception ex) { } } string CheckForOnce() { string actionstring = "AA 55 02 01 "; if (TimeOut != "" && TimeOut != null) actionstring += Convert.ToInt32(TimeOut).ToString("X").PadLeft(4, '0').Insert(2, " ") + " "; else actionstring += "00 00 "; actionstring += Convert.ToString(GetXor(strToToHexByte(actionstring), 2), 16).PadLeft(2, '0').ToUpper() + " 0D"; return actionstring; } string CheckDuringTime() { string actionstring = "AA 55 02 02 "; if (TimeOut != "" && TimeOut != null) actionstring += Convert.ToInt32(TimeOut).ToString("X").PadLeft(4, '0').Insert(2, " ") + " "; else actionstring += "00 00 "; actionstring += Convert.ToString(GetXor(strToToHexByte(actionstring), 2), 16).PadLeft(2, '0') + " 0D"; return actionstring; } void SaveCommand() { byte[] confirmdata1 = strToToHexByte("AA 55 05 5F ");//保存命令 byte[] confirmdata2 = System.Text.Encoding.UTF8.GetBytes("\"SAVE\" "); byte[] confirmdata3 = strToToHexByte("01 5A 0D"); byte[] confirmdata = new byte[confirmdata1.Length + confirmdata2.Length + confirmdata3.Length]; confirmdata1.CopyTo(confirmdata, 0); confirmdata2.CopyTo(confirmdata, confirmdata1.Length); confirmdata3.CopyTo(confirmdata, confirmdata1.Length + confirmdata2.Length);//保存命令拼接 client.Send(confirmdata); } #endregion //组件属性更改事件 public event PropertyChangedEventHandler PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } /* 标签文本修改事件 protected void LabelPropertyChanged([CallerMemberName] string propertyName = null) { if(GPI1 == "" || GPI2 == ""|| GPI3 == ""|| GPI4 == "" || GPI1 ==null || GPI2 == null || GPI3 == null || GPI4 == null ||client == null) { return; } PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); string year = DateTime.Now.ToString("yyyy-MM-dd"); EnsureFolderExists($"日志文件夹/{year}/{Text}"); string temppath = $"日志文件夹/{year}/{Text}/" + Text + "GPI"+"(" + IPtext + ")" + ".txt"; EnsureTxtExists(temppath, Text, IPtext, Porttext); string currenttime = DateTime.Now.ToString(); string GPIname = ""; string front = ""; string back = ""; switch (propertyName) { case "GPI1": GPIname = "GPI1"; back = GPI1; break; case "GPI2": GPIname = "GPI2"; back = GPI2; break; case "GPI3": GPIname = "GPI3"; back = GPI3; break; case "GPI4": GPIname = "GPI4"; back = GPI4; break; } if (back == "高") front = "低"; else front = "高"; writeToTxt(temppath,$"{GPIname}:{front} => {back}\n当前状态:GPI1:{GPI1} GPI2:{GPI2} GPI3:{GPI3} GPI4:{GPI4}\n当前时间:{currenttime}\n ______________________________"); } */ public class TagItem : INotifyPropertyChanged { private string _originmessage;//原始数据 public string OriginMessage { get => _originmessage; set { _originmessage = value; OnPropertyChanged(); } } private string _rssiinfo;//RSSI强度 public string RSSIinfo { get => _rssiinfo; set { _rssiinfo = value; OnPropertyChanged(); } } private string _countinfo;//count数值 public string Countinfo { get => _countinfo; set { _countinfo = value; OnPropertyChanged(); } } private string _timeinfo;//当前时间 public string Timeinfo { get => _timeinfo; set { _timeinfo = value; OnPropertyChanged(); } } private string _infocolor; public string InfoColor { get => _infocolor; set { _infocolor = value; OnPropertyChanged(); } } private string _epcinfo;//EPC信息 private string _epcasc;//ASC2码 EPC信息 public string EPCinfo { get => _epcinfo; set { _epcinfo = value; OnPropertyChanged(); } } public string EPCASC { get => _epcasc; set { _epcasc = value; OnPropertyChanged(); } } public TagItem(string originMessage, string infoEPC, string ascEPC, string RSSI, string count, string time) { OriginMessage = originMessage; EPCinfo = infoEPC; EPCASC = ascEPC; RSSIinfo = RSSI; Countinfo = count; Timeinfo = time; if (infoEPC == "No Read") { InfoColor = "Red"; } else InfoColor = "Green"; } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } } } }