using HighWayIot.Log4net;
using HighWayIot.TouchSocket;
using Org.BouncyCastle.Utilities;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Xml;
using TouchSocket.Sockets;
namespace RFIDSocket
{
public partial class RFIDBinAudlt : Form
{
private TcpClientServer Client = TcpClientServer.Instance;
///
/// 日志实例
///
private static LogHelper logHelper = LogHelper.Instance;
///
/// 前端列表实例
///
private DataTable dt = new DataTable();
///
/// xml读写实例
///
XmlDocument xd = new XmlDocument();
///
/// 运行时路径
///
private string Path = System.Environment.CurrentDirectory;
///
/// 所有适配器IP
///
private string[] ServiceIPs;
///
/// 格口编码集合
///
private string[] BinCodes = new string[0];
///
/// 格口编码返回结果字符串
///
private StringBuilder BinCodesString = new StringBuilder();
///
/// 应有格口数
///
private int ServiceCount = -1;
///
/// 正常格口数
///
private int NormalCount = 0;
///
/// 异常格口数
///
private int ErrorCount = 0;
///
/// 服务端端口
///
string Port = string.Empty;
///
/// 服务端地址
///
string IP = string.Empty;
///
/// 上次接受数据的时间
///
DateTime LastInfoTime = DateTime.Now;
public RFIDBinAudlt()
{
InitializeComponent();
Init();
}
///
/// 初始化方法
///
private async void Init()
{
GetSetting();
dataGridView.AutoGenerateColumns = false;
foreach (DataGridViewColumn column in dataGridView.Columns)
{
dt.Columns.Add(column.HeaderText, typeof(string));
}
//Client.GetBinCode += AddBinCodeString;
Client.GetString += ConnectMessageString;
}
///
/// 读取XML配置文件中的IP
///
private void GetSetting()
{
xd.Load($"{Path}\\Configuration.xml");//加载xml文档
XmlNode rootNode = xd.SelectSingleNode("BinAudlt");//得到xml文档的根节点
XmlNodeList nodes = rootNode.SelectNodes("ServiceIpConfig");//获取根节点的子节点"ServiceIpConfig"
ServiceIPs = new string[nodes.Count];
for (int i = 0; i < nodes.Count; i++)
{
ServiceIPs[i] = nodes[i].InnerText;
}
XmlNode count = rootNode.SelectSingleNode("ServiceIpCount");
if (!int.TryParse(count.InnerText, out ServiceCount))
{
MessageBox.Show("XML配置文件中ServiceIpConfig的值有问题,请重新配置!");
}
XmlNode ServerIp = rootNode.SelectSingleNode("ConnectIp"); // 服务器IP
XmlNode ServerPort = rootNode.SelectSingleNode("ConnectPort"); // 服务器端口
IP = ServerIp.InnerText.Trim();
Port = ServerPort.InnerText.Trim();
IPText.Text = IP;
PortText.Text = Port;
}
///
/// 开始盘点
///
///
///
private void AudltButton_Click(object sender, EventArgs e)
{
BinCodes = new string[0];
BinCodesString.Clear();
MultiFuncLoading loadingfrm = new MultiFuncLoading(this);
SplashScreenManager loading = new SplashScreenManager(loadingfrm);
loading.ShowLoading();
loadingfrm.SetTxt("格口盘点中", $"共有{ServiceIPs.Length}个IP需要扫描", "Please Waitting...");
try
{
Task.Run(async () =>
{
int count = 0;
foreach (string s in ServiceIPs)
{
count++;
Client.Send($"connect {s}").GetAwaiter().GetResult();
loadingfrm.SetJD($"正在盘点{s} {count}/{ServiceIPs.Length}", $"正在盘点{s} {count}/{ServiceIPs.Length}");
do
{
await Task.Delay(500);
}
while (DateTime.Now - LastInfoTime <= TimeSpan.FromMilliseconds(3000));
}
}).GetAwaiter().GetResult();
}
catch (Exception ex)
{
MessageBox.Show("加载发生错误,请检查连接情况" + ex);
return;
}
finally
{
loading.CloseWaitForm();
}
string sss = BinCodesString.ToString();
logHelper.Info($"此次盘点的字符串为{sss}");
BinCodes = ClientStringAnalysis.GetInfoAnalyzer(sss);
int[] intArray = BinCodes
.Select(a => int.Parse(a)) // 转换为整型
.Distinct() // 去重
.OrderBy(x => x) // 排序
.ToArray(); // 转换为数组
NormalCount = 0;
ErrorCount = 0;
GridViewRefresh(ConvertToBoolArray(intArray, ServiceCount));
NormalCountLabel.Text = NormalCount.ToString();
ErrorCountLabel.Text = ErrorCount.ToString();
}
///
/// 字符串连接委托类
///
///
private void ConnectMessageString(string message)
{
LastInfoTime = DateTime.Now;
BinCodesString.Append(message);
}
///
/// 获取BinCode委托方法
///
private void AddBinCodeString(string[] binCodes)
{
///拼接BinCode
Task.Run(() =>
{
string[] temp = new string[binCodes.Length + BinCodes.Length];
Array.Copy(BinCodes, 0, temp, 0, BinCodes.Length);
Array.Copy(binCodes, 0, temp, BinCodes.Length, binCodes.Length);
BinCodes = temp;
});
}
///
/// int数组转化为bool数组
///
///
///
///
private bool[] ConvertToBoolArray(int[] intArray, int count)
{
// 初始化一个长度为count的bool数组,默认为false
bool[] result = new bool[count];
// 遍历intArray,将对应位置的值设置为true
foreach (int num in intArray)
{
if (num >= 1 && num <= count) // 确保num在合法范围内
{
result[num - 1] = true; // 将下标为num-1的值设置为true
}
}
return result;
}
///
/// 表格刷新
///
/// bool状态列表
private void GridViewRefresh(bool[] states)
{
if (ServiceCount < 0)
{
return;
}
//统计多少行
int lineCount = ServiceCount / 20;
//最后一行多少个数据
int lastCount = ServiceCount % 20;
if (lastCount > 0)
{
//最后不完整行
lineCount++;
}
//格口个数
int totalCount = 0;
dt.Rows.Clear();
//添加格口编号 添加状态
for (int i = 0; i < lineCount; i++)
{
//新建dt行
DataRow numdr = dt.NewRow();
DataRow statedr = dt.NewRow();
for (int j = 0; j < 20; j++)
{
if (totalCount >= ServiceCount)
{
break;
}
statedr[j] = states[totalCount] ? "正常" : "异常";
//计数
if (states[totalCount])
{
NormalCount++;
}
else if (!states[totalCount])
{
ErrorCount++;
}
numdr[j] = (++totalCount).ToString();
}
dt.Rows.Add(numdr);
dt.Rows.Add(statedr);
}
//添加DT表
dataGridView.DataSource = null;
dataGridView.DataSource = dt;
//设置背景颜色
for (int i = 0; i < lineCount * 2; i++)
{
if (i % 2 == 0)
{
continue;
}
for (int j = 0; j < 20; j++)
{
if (int.TryParse(dataGridView.Rows[i - 1].Cells[j].Value.ToString(), out int head))
{
DataGridViewCell cell = dataGridView.Rows[i].Cells[j];
cell.Style.BackColor = states[head - 1] ? Color.Green : Color.Red;
}
else
{
break;
}
}
}
}
///
/// 随机布尔数组生成
///
///
///
public bool[] GenerateRandomBoolArray(int length)
{
bool[] boolArray = new bool[length];
Random random = new Random();
for (int i = 0; i < length; i++)
{
boolArray[i] = random.Next(2) == 1;
}
return boolArray;
}
///
/// 连接开关
///
///
///
private void MonitorOnOff_Click(object sender, EventArgs e)
{
if (!Client.ClientState)
{
if (Client.ClientConnect(IP, Port).GetAwaiter().GetResult())
{
MonitorOnOff.Text = "断开客户端";
MonitorState.Text = "开";
MonitorState.BackColor = Color.Green;
MessageBox.Show("服务端连接成功!");
}
else
{
MessageBox.Show("服务端连接失败!");
}
}
else if (Client.ClientState)
{
if (Client.ClientClose().GetAwaiter().GetResult())
{
MonitorOnOff.Text = "连接客户端";
MonitorState.Text = "关";
MonitorState.BackColor = Color.Transparent;
MessageBox.Show("服务端断开成功!");
}
else
{
MessageBox.Show("服务端断开失败!");
}
}
}
///
/// 设置服务端地址
///
///
///
private void SetAddress_Click(object sender, EventArgs e)
{
try
{
IP = IPText.Text.Trim();
Port = PortText.Text.Trim();
//ip保存
XmlNode rootNode = xd.SelectSingleNode("BinAudlt");//得到xml文档的根节点
XmlNode ServerIp = rootNode.SelectSingleNode("ConnectIp"); // 服务器IP
XmlNode ServerPort = rootNode.SelectSingleNode("ConnectPort"); // 服务器端口
ServerIp.InnerText = IP;
ServerPort.InnerText = Port;
xd.Save($"{Path}\\Configuration.xml");
MessageBox.Show("保存成功!");
}
catch (Exception ex)
{
MessageBox.Show("服务端地址 XML文件保存失败!");
}
}
///
/// 关闭窗口事件
///
///
///
private void RFIDBinAudlt_FormClosing(object sender, FormClosingEventArgs e)
{
if (Client.ClientState)
{
if (!Client.ClientClose().GetAwaiter().GetResult())
{
MessageBox.Show("服务端断开失败!请检查原因后重新关闭或重试");
}
}
}
}
}