You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1387 lines
62 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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<TagItem> _tagItems;
public ObservableCollection<TagItem> 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<ComboBox>(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>(ComboBox_SelectChanged);
GPOSelectionChangedCommand = new RelayCommand<ComboBox>(GPOComboBox_SelectChanged);
SendTextChangedCommand = new RelayCommand<ComboBox>(SendTextComboBox_SelectChanged);
TextChangedCommand = new RelayCommand<ScrollViewer>(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<TagInfo> taglist = GetTagInfos(newData);
ObservableCollection<TagItem> items = new ObservableCollection<TagItem>();
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<TagInfo> taglist = GetTagInfos(data);
ObservableCollection<TagItem> items = new ObservableCollection<TagItem>();
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<TagItem> items = new ObservableCollection<TagItem>();
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));
}
}
}
}
}