diff --git a/SocketExample/MyTouchClass.cs b/SocketExample/MyTouchClass.cs index 82da05d..83edfdb 100644 --- a/SocketExample/MyTouchClass.cs +++ b/SocketExample/MyTouchClass.cs @@ -14,57 +14,6 @@ namespace SocketExample { public class MyTouchClass { - public void ConnectedSend() - { - try - { - - //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"; - } - } public sealed class MySessionClient : TcpSessionClient { @@ -74,10 +23,36 @@ namespace SocketExample //此处处理数据,功能相当于Received委托。 var mes = e.ByteBlock.Span.ToString(Encoding.UTF8); - Console.WriteLine($"已接收到信息:{mes}"); + MessageBox.Show($"已接收到信息:{mes}"); await base.OnTcpReceived(e); } } + + public class MyService : TcpService + { + protected override void LoadConfig(TouchSocketConfig config) + { + //此处加载配置,用户可以从配置中获取配置项。 + base.LoadConfig(config); + } + + protected override MySessionClient NewClient() + { + return new MySessionClient(); + } + + protected override async Task OnTcpConnecting(MySessionClient socketClient, ConnectingEventArgs e) + { + //此处逻辑会多线程处理。 + + //e.Id:对新连接的客户端进行ID初始化,默认情况下是按照设定的规则随机分配的。 + //但是按照需求,您可以自定义设置,例如设置为其IP地址。但是需要注意的是id必须在生命周期内唯一。 + + //e.IsPermitOperation:指示是否允许该客户端链接。 + + await base.OnTcpConnecting(socketClient, e); + } + } } } diff --git a/SocketExample/PanelItem.cs b/SocketExample/PanelItem.cs new file mode 100644 index 0000000..c04db70 --- /dev/null +++ b/SocketExample/PanelItem.cs @@ -0,0 +1,1386 @@ +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)); + } + } + + } + } +} diff --git a/SocketExample/RFIDmonitor.csproj b/SocketExample/RFIDmonitor.csproj index 3487987..6df2470 100644 --- a/SocketExample/RFIDmonitor.csproj +++ b/SocketExample/RFIDmonitor.csproj @@ -208,6 +208,7 @@ + TCPWindowV2.xaml diff --git a/SocketExample/TCPWindowV2.xaml b/SocketExample/TCPWindowV2.xaml index f2ee66f..dbf8937 100644 --- a/SocketExample/TCPWindowV2.xaml +++ b/SocketExample/TCPWindowV2.xaml @@ -8,7 +8,7 @@ xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options" xmlns:local="clr-namespace:SocketExample" mc:Ignorable="d" - Title="RFID读写器多终端监控软件v1.093" Height="680" Width="1180" + Title="RFID读写器多终端监控软件v1.11" Height="680" Width="1180" Background="Transparent" AllowsTransparency="True" WindowStyle="None" WindowStartupLocation="CenterScreen"> @@ -150,11 +150,11 @@ diff --git a/SocketExample/TCPWindowV2.xaml.cs b/SocketExample/TCPWindowV2.xaml.cs index c2c63a6..0b21c02 100644 --- a/SocketExample/TCPWindowV2.xaml.cs +++ b/SocketExample/TCPWindowV2.xaml.cs @@ -1,31 +1,25 @@ using System; using System.Buffers.Text; using System.Collections.Generic; -using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Diagnostics.Eventing.Reader; using System.IO; using System.IO.Ports; using System.Linq; -using System.Net; using System.Net.NetworkInformation; using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Remoting.Messaging; -using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows; -using System.Windows.Controls; using System.Windows.Input; using System.Windows.Markup; using System.Windows.Media; using System.Windows.Media.Imaging; using System.Windows.Shapes; using System.Xml; -using GalaSoft.MvvmLight.Command; using Google.Protobuf.WellKnownTypes; using K4os.Compression.LZ4.Streams.Abstractions; using Mesnac.Log; @@ -46,1159 +40,18 @@ namespace SocketExample /// public partial class TCPWindowV2 : Window { - - public class PanelItem : INotifyPropertyChanged //实现组件更改的接口 + public sealed class MySessionClient : TcpSessionClient { - #region 变量定义 - IPAddress ip; - int port; - ITcpClient client; - ITcpSessionClient 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 + public Action OnMessageReceived { get; set; } + protected override async Task OnTcpReceived(ReceivedDataEventArgs e) { - get => _infotext; set - { - _infotext = value; - OnPropertyChanged(); // 通知 UI 更新 - } + //此处逻辑单线程处理。 + + //此处处理数据,功能相当于Received委托 + OnMessageReceived?.Invoke(e); + + await base.OnTcpReceived(e); } - 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}"; - PanelInitialization(); - } - - public PanelItem(TcpSessionClient recieveClient) - { - Text = $"客户端{recieveClient.IP}"; - TcpSessionClient = recieveClient as ITcpSessionClient; - SessionID = recieveClient.Id; - //断连事件 - //TcpSessionClient.Closed = (client, e) => { try { GPIOthread.Abort(); Infotext += "已断开!\n"; StateColour = "Red"; LinkState = "未连接"; } catch (Exception ex) { Infotext += ex; } return EasyTask.CompletedTask; }; - //接收事件 - PanelInitialization(); - } - - 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";//默认端口 - LinkButtonText = "连接"; - StateColour = "Red"; - LinkState = "未连接"; - 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 onSend(ITcpClient client, ReceivedDataEventArgs e) - { - - return EasyTask.CompletedTask; - } - - - private Task onRecieved(ITcpClient client, 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; - } - } - - return EasyTask.CompletedTask; - } - - private Task onConnected(ITcpClient client, ConnectedEventArgs e)//连接后初始化 - { - 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"; - } - - return EasyTask.CompletedTask; - } - #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 = "连接"; - } - } - - 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 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 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 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) - { - - } - } - - 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)); - } - } - } #region 主界面参数 @@ -1286,6 +139,7 @@ namespace SocketExample foreach (PanelItem item in items) { item.dispose(); + item.Sessiondispose(); } items = new List(); PanelContainer.ItemsSource = null; @@ -1296,6 +150,8 @@ namespace SocketExample Thread ListeningPortThread = new Thread(ListeningTheard); ListeningPortThread.IsBackground = true; ListeningPortThread.Start(); + Welcome_StackPanel.Visibility = Visibility.Visible; + NewTerminal_StackPanel.Visibility = Visibility.Collapsed; } #endregion @@ -1339,7 +195,7 @@ namespace SocketExample foreach (var addr in unicastAddresses) { - var tcpService = new TcpService(); + var tcpService = new MyService(); tcpService.SetupAsync(new TouchSocketConfig()//载入配置 .SetListenIPHosts($"tcp://{addr.Address}:20108", 7790)//可以同时监听两个地址 .ConfigureContainer(a =>//容器的配置顺序应该在最前面 @@ -1359,7 +215,7 @@ namespace SocketExample } } - private Task ListeningConnected(TcpSessionClient client, ConnectedEventArgs e) //连接事件 + private Task ListeningConnected(MySessionClient client, ConnectedEventArgs e) //连接事件 { Application.Current.Dispatcher.Invoke(() => { @@ -1371,8 +227,9 @@ namespace SocketExample return EasyTask.CompletedTask; } - private Task ListeningClosed(TcpSessionClient client, ClosedEventArgs e) //断开事件 + private Task ListeningClosed(MySessionClient client, ClosedEventArgs e) //断开事件 { + try { Application.Current.Dispatcher.Invoke(() => { foreach (PanelItem item in items) @@ -1381,7 +238,10 @@ namespace SocketExample { try { + item.Sessiondispose(); items.Remove(item); + PanelContainer.ItemsSource = null; + PanelContainer.ItemsSource = items; if (items.Count == 0) break; } @@ -1391,9 +251,12 @@ namespace SocketExample } } } - PanelContainer.ItemsSource = null; - PanelContainer.ItemsSource = items; + }); + }catch(Exception ex) + { + Console.WriteLine(ex.Message); + } return EasyTask.CompletedTask; } @@ -1659,5 +522,31 @@ namespace SocketExample } #endregion + + public class MyService : TcpService + { + protected override void LoadConfig(TouchSocketConfig config) + { + //此处加载配置,用户可以从配置中获取配置项。 + base.LoadConfig(config); + } + + protected override MySessionClient NewClient() + { + return new MySessionClient(); + } + + protected override async Task OnTcpConnecting(MySessionClient socketClient, ConnectingEventArgs e) + { + //此处逻辑会多线程处理。 + + //e.Id:对新连接的客户端进行ID初始化,默认情况下是按照设定的规则随机分配的。 + //但是按照需求,您可以自定义设置,例如设置为其IP地址。但是需要注意的是id必须在生命周期内唯一。 + + //e.IsPermitOperation:指示是否允许该客户端链接。 + + await base.OnTcpConnecting(socketClient, e); + } + } } }