浏览代码

创建项目文件

SYL 4 年之前
父节点
当前提交
5fdf970230

二进制
.vs/DWZB_Agv_Agreement/DesignTimeBuild/.dtbcache.v2


+ 25 - 0
DWZB_Agv_Agreement.sln

@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 16
+VisualStudioVersion = 16.0.31424.327
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DWZB_Agv_Agreement", "DWZB_Agv_Agreement\DWZB_Agv_Agreement.csproj", "{6B85B962-9E5B-4C39-A4A4-09477953110F}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|Any CPU = Debug|Any CPU
+		Release|Any CPU = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{6B85B962-9E5B-4C39-A4A4-09477953110F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{6B85B962-9E5B-4C39-A4A4-09477953110F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{6B85B962-9E5B-4C39-A4A4-09477953110F}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{6B85B962-9E5B-4C39-A4A4-09477953110F}.Release|Any CPU.Build.0 = Release|Any CPU
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+	GlobalSection(ExtensibilityGlobals) = postSolution
+		SolutionGuid = {427962EF-F799-4AD8-9394-B3BE3708FAB4}
+	EndGlobalSection
+EndGlobal

+ 42 - 0
DWZB_Agv_Agreement/Agv_Agreement/AgvChangeRunStatusCmdMd.cs

@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    /// <summary>
+    /// 运行状态更改指令实体类
+    /// </summary>
+    public class AgvChangeRunStatusCmdMd : DataHeadMd
+    {
+        private const int btyArrLen = 11;
+
+        /// <summary>
+        /// 指令编号
+        /// </summary>
+        public int CmdNo { get; set; }
+        /// <summary>
+        /// 指令代码
+        /// </summary>
+        public byte CmdCode { get; set; }
+        /// <summary>
+        /// 状态代码
+        /// </summary>
+        public byte StatusCode { get; set; }
+        /// <summary>
+        /// 序列化为byte数组。
+        /// </summary>
+        public byte[] SerializeBytArr()
+        {
+            List<byte> retBtArr = new(btyArrLen);
+            retBtArr.Add(FunctionCode);
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(AgvNo)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(CmdNo)));
+            retBtArr.Add(CmdCode);
+            retBtArr.Add(StatusCode);
+            return retBtArr.ToArray();
+        }
+    }
+}

+ 42 - 0
DWZB_Agv_Agreement/Agv_Agreement/AgvPreventBumpCmdMd.cs

@@ -0,0 +1,42 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    /// <summary>
+    /// 防撞条屏蔽指令实体类
+    /// </summary>
+    public class AgvPreventBumpCmdMd : DataHeadMd
+    {
+        private const int btyArrLen = 11;
+
+        /// <summary>
+        /// 指令编号
+        /// </summary>
+        public int CmdNo { get; set; }
+        /// <summary>
+        /// 指令代码
+        /// </summary>
+        public byte CmdCode { get; set; }
+        /// <summary>
+        /// 状态代码
+        /// </summary>
+        public byte StatusCode { get; set; }
+        /// <summary>
+        /// 序列化为byte数组。
+        /// </summary>
+        public byte[] SerializeBytArr()
+        {
+            List<byte> retBtArr = new(btyArrLen);
+            retBtArr.Add(FunctionCode);
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(AgvNo)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(CmdNo)));
+            retBtArr.Add(CmdCode);
+            retBtArr.Add(StatusCode);
+            return retBtArr.ToArray();
+        }
+    }
+}

+ 31 - 0
DWZB_Agv_Agreement/Agv_Agreement/AgvQueryStatusMd.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    /// <summary>
+    /// 状态查询指令实体类
+    /// </summary>
+    public class AgvQueryStatusMd : DataHeadMd
+    {
+        private const int btyArrLen = 9;
+        /// <summary>
+        /// 心跳信号
+        /// </summary>
+        public int HeartbeatSignal { get; set; }
+        /// <summary>
+        /// 序列化为byte数组。
+        /// </summary>
+        public byte[] SerializeBytArr()
+        {
+            List<byte> retBtArr = new(btyArrLen);
+            retBtArr.Add(FunctionCode);
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(AgvNo)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(HeartbeatSignal)));
+            return retBtArr.ToArray();
+        }
+    }
+}

+ 37 - 0
DWZB_Agv_Agreement/Agv_Agreement/AgvResetCmdMd.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    /// <summary>
+    /// 复位指令实体类
+    /// </summary>
+    public class AgvResetCmdMd : DataHeadMd
+    {
+        private const int btyArrLen = 10;
+
+        /// <summary>
+        /// 指令编号
+        /// </summary>
+        public int CmdNo { get; set; }
+        /// <summary>
+        /// 指令代码
+        /// </summary>
+        public byte CmdCode { get; set; }
+        /// <summary>
+        /// 序列化为byte数组。
+        /// </summary>
+        public byte[] SerializeBytArr()
+        {
+            List<byte> retBtArr = new(btyArrLen);
+            retBtArr.Add(FunctionCode);
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(AgvNo)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(CmdNo)));
+            retBtArr.Add(CmdCode);
+            return retBtArr.ToArray();
+        }
+    }
+}

+ 136 - 0
DWZB_Agv_Agreement/Agv_Agreement/AgvStatusResponseMd.cs

@@ -0,0 +1,136 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    /// <summary>
+    /// 状态反馈(AGV发给上位机)指令实体类
+    /// </summary>
+    public class AgvStatusResponseMd : DataHeadMd
+    {
+        private const int btyArrLen = 63;
+        /// <summary>
+        /// AGV工作状态
+        /// </summary>
+        public byte AgvWorkMode { get; set; }
+        /// <summary>
+        /// AGV运行状态
+        /// </summary>
+        public byte AgvRunStatus { get; set; }
+        /// <summary>
+        /// AGV抱夹状态
+        /// </summary>
+        public byte AgvClipStatus { get; set; }
+        /// <summary>
+        /// AGV运动状态
+        /// </summary>
+        public byte AgvMotionStatus { get; set; }
+        /// <summary>
+        /// 当前任务阶段
+        /// </summary>
+        public byte CurrentTaskStage { get; set; }
+        /// <summary>
+        /// 支撑状态
+        /// </summary>
+        public byte PropUpStatus { get; set; }
+        /// <summary>
+        /// 光柱个数
+        /// </summary>
+        public byte BeamQty { get; set; }
+        /// <summary>
+        /// 车头超声波信号
+        /// </summary>
+        public byte AgvHeadUltrasonicSignal{ get; set; }
+        /// <summary>
+        /// 车尾超声波信号
+        /// </summary>
+        public byte AgvTailUltrasonicSignal { get; set; }
+        /// <summary>
+        /// 防撞条屏蔽
+        /// </summary>
+        public byte PreventBumpDeviceScreenSignal { get; set; }
+        /// <summary>
+        /// AGV当前位置X坐标
+        /// </summary>
+        public int AgvCurrent_X { get; set; }
+        /// <summary>
+        /// AGV当前位置Y坐标
+        /// </summary>
+        public int AgvCurrent_Y { get; set; }
+        /// <summary>
+        /// AGV当前位置R角度
+        /// </summary>
+        public int AgvCurrent_Angle { get; set; }
+        /// <summary>
+        /// 电池的电量
+        /// </summary>
+        public int Electricity { get; set; }
+        /// <summary>
+        /// 电池的电压
+        /// </summary>
+        public int ElectricTension { get; set; }
+        /// <summary>
+        /// 电池的电流
+        /// </summary>
+        public int ElectricCurrent { get; set; }
+        /// <summary>
+        /// AGV当前指令编号
+        /// </summary>
+        public int AgvCurrentCmdNo { get; set; }
+        /// <summary>
+        /// 报警编号1
+        /// </summary>
+        public int AlarmSignal1 { get; set; }
+        /// <summary>
+        /// 报警编号2
+        /// </summary>
+        public int AlarmSignal2 { get; set; }
+        /// <summary>
+        /// 报警编号3
+        /// </summary>
+        public int AlarmSignal3 { get; set; }
+        /// <summary>
+        /// 报警编号4
+        /// </summary>
+        public int AlarmSignal4 { get; set; }
+        /// <summary>
+        /// 心跳信号,环形计数
+        /// </summary>
+        public int AgvHeartbeatSignal { get; set; }
+        /// <summary>
+        /// 序列化为byte数组。
+        /// </summary>
+        public byte[] SerializeBytArr()
+        {
+            List<byte> retBtArr = new(btyArrLen);
+            retBtArr.Add(FunctionCode);
+            retBtArr.AddRange(BitConverter.GetBytes(AgvNo));
+            retBtArr.Add(AgvWorkMode);
+            retBtArr.Add(AgvRunStatus);
+            retBtArr.Add(AgvClipStatus);
+            retBtArr.Add(AgvMotionStatus);
+            retBtArr.Add(CurrentTaskStage);
+            retBtArr.Add(PropUpStatus);
+            retBtArr.Add(BeamQty);
+            retBtArr.Add(AgvHeadUltrasonicSignal);
+            retBtArr.Add(AgvTailUltrasonicSignal);
+            retBtArr.Add(PreventBumpDeviceScreenSignal);
+            retBtArr.AddRange(BitConverter.GetBytes(AgvCurrent_X));
+            retBtArr.AddRange(BitConverter.GetBytes(AgvCurrent_Y));
+            retBtArr.AddRange(BitConverter.GetBytes(AgvCurrent_Angle));
+            retBtArr.AddRange(BitConverter.GetBytes(Electricity));
+            retBtArr.AddRange(BitConverter.GetBytes(ElectricTension));
+            retBtArr.AddRange(BitConverter.GetBytes(ElectricCurrent));
+            retBtArr.AddRange(BitConverter.GetBytes(AgvCurrentCmdNo));
+            retBtArr.AddRange(BitConverter.GetBytes(AlarmSignal1));
+            retBtArr.AddRange(BitConverter.GetBytes(AlarmSignal2));
+            retBtArr.AddRange(BitConverter.GetBytes(AlarmSignal3));
+            retBtArr.AddRange(BitConverter.GetBytes(AlarmSignal4));
+            retBtArr.AddRange(BitConverter.GetBytes(AgvHeartbeatSignal));
+            return retBtArr.ToArray();
+        }
+    }
+}

+ 37 - 0
DWZB_Agv_Agreement/Agv_Agreement/AgvStopCmdMd.cs

@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    /// <summary>
+    /// 停止指令实体类
+    /// </summary>
+    public class AgvStopCmdMd : DataHeadMd
+    {
+        private const int btyArrLen = 10;
+
+        /// <summary>
+        /// 指令编号
+        /// </summary>
+        public int CmdNo { get; set; }
+        /// <summary>
+        /// 指令代码
+        /// </summary>
+        public byte CmdCode { get; set; }
+        /// <summary>
+        /// 序列化为byte数组。
+        /// </summary>
+        public byte[] SerializeBytArr()
+        {
+            List<byte> retBtArr = new(btyArrLen);
+            retBtArr.Add(FunctionCode);
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(AgvNo)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(CmdNo)));
+            retBtArr.Add(CmdCode);
+            return retBtArr.ToArray();
+        }
+    }
+}

+ 76 - 0
DWZB_Agv_Agreement/Agv_Agreement/AgvTaskSendMd.cs

@@ -0,0 +1,76 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    /// <summary>
+    /// 任务下发指令实体类
+    /// </summary>
+    public class AgvTaskSendMd : DataHeadMd
+    {
+        private const int btyArrLen = 33;
+        /// <summary>
+        /// 指令编号
+        /// </summary>
+        public int CmdNo { get; set; }
+        /// <summary>
+        /// 指令代码
+        /// </summary>
+        public byte CmdCode { get; set; }
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        public byte TaskType { get; set; }
+        /// <summary>
+        /// 抱夹动作
+        /// </summary>
+        public byte ClipAction { get; set; }
+        /// <summary>
+        /// 移动方式
+        /// </summary>
+        public byte MoveMode { get; set; }
+        /// <summary>
+        /// 目标点X坐标
+        /// </summary>
+        public int Target_X { get; set; }
+        /// <summary>
+        /// 目标点Y坐标
+        /// </summary>
+        public int Target_Y { get; set; }
+        /// <summary>
+        /// 目标点角度
+        /// </summary>
+        public int Target_Angle { get; set; }
+        /// <summary>
+        /// 移动速度
+        /// </summary>
+        public int Speed { get; set; }
+        /// <summary>
+        /// 目标点1 RFID编号
+        /// </summary>
+        public int Target_rfidNo { get; set; }
+        /// <summary>
+        /// 序列化为byte数组。
+        /// </summary>
+        public byte[] SerializeBytArr()
+        {
+            List<byte> retBtArr = new(btyArrLen);
+            retBtArr.Add(FunctionCode);
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(AgvNo)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(CmdNo)));
+            retBtArr.Add(CmdCode);
+            retBtArr.Add(TaskType);
+            retBtArr.Add(ClipAction);
+            retBtArr.Add(MoveMode);
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(Target_X)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(Target_Y)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(Target_Angle)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(Speed)));
+            retBtArr.AddRange(DataHandleHelper.ReverseBtyArr(BitConverter.GetBytes(Target_rfidNo)));
+            return retBtArr.ToArray();
+        }
+    }
+}

+ 78 - 0
DWZB_Agv_Agreement/Agv_Agreement/DataHandleHelper.cs

@@ -0,0 +1,78 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    public static class DataHandleHelper
+    {
+        public static bool Verify_PackageHeadCRC(byte[] btArr)
+        {
+            try
+            {
+                byte[] pckHead = new byte[9];
+                Array.Copy(btArr, pckHead, pckHead.Length);
+                byte[] pckHeadCRC = new byte[8];
+                Array.Copy(pckHead, pckHeadCRC, pckHeadCRC.Length);
+                if (Get_CustomCRC(pckHeadCRC) == pckHead[^1])
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+            catch
+            {
+                return false;
+            }
+        }
+
+        public static bool Verify_DataMsgCRC(byte[] btArr)
+        {
+            try
+            {
+                byte[] pckHead = new byte[9];
+                Array.Copy(btArr, pckHead, pckHead.Length);
+                byte[] dataLenBt = new byte[4];
+                Array.Copy(btArr, 2, dataLenBt, 0, dataLenBt.Length);
+                Array.Reverse(dataLenBt);
+                int dataLen = BitConverter.ToInt32(dataLenBt, 0);
+                byte[] dataBtArr = new byte[dataLen];
+                Array.Copy(btArr, 9, dataBtArr, 0, dataLen);
+                if (Get_CustomCRC(dataBtArr) == pckHead[^2])
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
+            catch
+            {
+                return false;
+            }
+        }
+
+        public static byte Get_CustomCRC(byte[] dataBtArr)
+        {
+            int data_Xor = 0;
+            for (int i = 0; i < dataBtArr.Length; i++)
+            {
+                data_Xor ^= dataBtArr[i];
+            }
+            return Convert.ToByte(data_Xor);
+        }
+
+        public static byte[] ReverseBtyArr(byte[] btArr)
+        {
+            Array.Reverse(btArr);
+            return btArr;
+        }
+
+    }
+}

+ 20 - 0
DWZB_Agv_Agreement/Agv_Agreement/DataHeadMd.cs

@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    public class DataHeadMd
+    {
+        /// <summary>
+        /// 功能码
+        /// </summary>
+        public byte FunctionCode { get; set; }
+        /// <summary>
+        /// AGV编号
+        /// </summary>
+        public int AgvNo { get; set; }
+    }
+}

+ 31 - 0
DWZB_Agv_Agreement/Agv_Agreement/PackageHeadMd.cs

@@ -0,0 +1,31 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement.Agv_Agreement
+{
+    public class PackageHeadMd
+    {
+        public byte[] PackageHeadFlag = new byte[2] { 0x26, 0x05 };
+        public byte[] DataLen = new byte[4];
+        public byte VersionNo = 0x02;
+        public byte Data_CRC { get; set; }
+        public byte PackageHead_CRC { get; set; }
+
+        /// <summary>
+        /// 序列化为byte数组。
+        /// </summary>
+        public byte[] SerializeBytArr()
+        {
+            List<byte> retBtArr = new(9);
+            retBtArr.AddRange(PackageHeadFlag);
+            retBtArr.AddRange(DataLen);
+            retBtArr.Add(VersionNo);
+            retBtArr.Add(Data_CRC);
+            retBtArr.Add(PackageHead_CRC);
+            return retBtArr.ToArray();
+        }
+    }
+}

+ 13 - 0
DWZB_Agv_Agreement/App.config

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<configuration>
+	<appSettings>
+		<!--Socket服务端 连接方式 Udp、Tcp-->
+		<add key="SocketServerConnType" value="Tcp" />
+		<!--Socket服务端 IP地址-->
+		<add key="SocketServerIpAddress" value="192.168.5.156" />
+		<!--Socket服务端 端口号-->
+		<add key="SocketServerPort" value="10001"/>
+		<!--AGV编号-->
+		<add key="AgvNo" value="8888"/>
+	</appSettings>
+</configuration>

+ 52 - 0
DWZB_Agv_Agreement/AppConfigHelper.cs

@@ -0,0 +1,52 @@
+using System;
+using System.Collections.Generic;
+using System.Configuration;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement
+{
+    /// <summary>
+    /// 配置文件操作
+    /// </summary>
+    public static class AppConfigHelper
+    {
+        public static string Get(string key)
+        {
+            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
+            return config.AppSettings.Settings[key].Value;
+        }
+
+        public static void Remove(string key)
+        {
+            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
+            config.AppSettings.Settings.Remove(key);
+            config.Save(ConfigurationSaveMode.Modified);
+            ConfigurationManager.RefreshSection("appSettings");
+        }
+
+        public static void Add(string key, string value)
+        {
+            var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
+            config.AppSettings.Settings.Add(key, value);
+            config.Save(ConfigurationSaveMode.Modified);
+            ConfigurationManager.RefreshSection("appSettings");
+        }
+
+        public static void Update(string key, string value)
+        {
+            try
+            {
+                Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
+                config.AppSettings.Settings[key].Value = value;
+                config.Save(ConfigurationSaveMode.Modified);
+                ConfigurationManager.RefreshSection("appSettings");
+            }
+            catch (Exception)
+            {
+                Add(key, value);
+            }
+        }
+    }
+}

+ 9 - 0
DWZB_Agv_Agreement/DWZB_Agv_Agreement.csproj

@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <OutputType>WinExe</OutputType>
+    <TargetFramework>net5.0-windows</TargetFramework>
+    <UseWindowsForms>true</UseWindowsForms>
+  </PropertyGroup>
+
+</Project>

+ 340 - 0
DWZB_Agv_Agreement/Form1.Designer.cs

@@ -0,0 +1,340 @@
+
+namespace DWZB_Agv_Agreement
+{
+    partial class Form1
+    {
+        /// <summary>
+        ///  Required designer variable.
+        /// </summary>
+        private System.ComponentModel.IContainer components = null;
+
+        /// <summary>
+        ///  Clean up any resources being used.
+        /// </summary>
+        /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing && (components != null))
+            {
+                components.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+
+        #region Windows Form Designer generated code
+
+        /// <summary>
+        ///  Required method for Designer support - do not modify
+        ///  the contents of this method with the code editor.
+        /// </summary>
+        private void InitializeComponent()
+        {
+            this.button1 = new System.Windows.Forms.Button();
+            this.richTextBox1 = new System.Windows.Forms.RichTextBox();
+            this.label1 = new System.Windows.Forms.Label();
+            this.comboBox1 = new System.Windows.Forms.ComboBox();
+            this.button2 = new System.Windows.Forms.Button();
+            this.button3 = new System.Windows.Forms.Button();
+            this.button4 = new System.Windows.Forms.Button();
+            this.button5 = new System.Windows.Forms.Button();
+            this.button6 = new System.Windows.Forms.Button();
+            this.button7 = new System.Windows.Forms.Button();
+            this.button8 = new System.Windows.Forms.Button();
+            this.button9 = new System.Windows.Forms.Button();
+            this.label2 = new System.Windows.Forms.Label();
+            this.numericUpDown1 = new System.Windows.Forms.NumericUpDown();
+            this.button10 = new System.Windows.Forms.Button();
+            this.label3 = new System.Windows.Forms.Label();
+            this.textBox1 = new System.Windows.Forms.TextBox();
+            this.label4 = new System.Windows.Forms.Label();
+            this.numericUpDown2 = new System.Windows.Forms.NumericUpDown();
+            this.button11 = new System.Windows.Forms.Button();
+            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).BeginInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).BeginInit();
+            this.SuspendLayout();
+            // 
+            // button1
+            // 
+            this.button1.Location = new System.Drawing.Point(12, 12);
+            this.button1.Name = "button1";
+            this.button1.Size = new System.Drawing.Size(137, 30);
+            this.button1.TabIndex = 0;
+            this.button1.Text = "开启调度服务端监控";
+            this.button1.UseVisualStyleBackColor = true;
+            this.button1.Click += new System.EventHandler(this.Button1_Click);
+            // 
+            // richTextBox1
+            // 
+            this.richTextBox1.Location = new System.Drawing.Point(12, 203);
+            this.richTextBox1.Name = "richTextBox1";
+            this.richTextBox1.Size = new System.Drawing.Size(910, 390);
+            this.richTextBox1.TabIndex = 1;
+            this.richTextBox1.Text = "";
+            // 
+            // label1
+            // 
+            this.label1.AutoSize = true;
+            this.label1.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
+            this.label1.Location = new System.Drawing.Point(12, 55);
+            this.label1.Name = "label1";
+            this.label1.Size = new System.Drawing.Size(138, 22);
+            this.label1.TabIndex = 2;
+            this.label1.Text = "已连接的客户端:";
+            // 
+            // comboBox1
+            // 
+            this.comboBox1.Font = new System.Drawing.Font("Microsoft YaHei UI", 10.5F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
+            this.comboBox1.FormattingEnabled = true;
+            this.comboBox1.Location = new System.Drawing.Point(156, 53);
+            this.comboBox1.Name = "comboBox1";
+            this.comboBox1.Size = new System.Drawing.Size(312, 27);
+            this.comboBox1.TabIndex = 3;
+            // 
+            // button2
+            // 
+            this.button2.Location = new System.Drawing.Point(20, 109);
+            this.button2.Name = "button2";
+            this.button2.Size = new System.Drawing.Size(137, 23);
+            this.button2.TabIndex = 4;
+            this.button2.Text = "发送任务下发测试指令";
+            this.button2.UseVisualStyleBackColor = true;
+            this.button2.Click += new System.EventHandler(this.button2_Click_1);
+            // 
+            // button3
+            // 
+            this.button3.Location = new System.Drawing.Point(20, 142);
+            this.button3.Name = "button3";
+            this.button3.Size = new System.Drawing.Size(138, 23);
+            this.button3.TabIndex = 4;
+            this.button3.Text = "发送状态查询测试指令";
+            this.button3.UseVisualStyleBackColor = true;
+            this.button3.Click += new System.EventHandler(this.button3_Click);
+            // 
+            // button4
+            // 
+            this.button4.Location = new System.Drawing.Point(192, 109);
+            this.button4.Name = "button4";
+            this.button4.Size = new System.Drawing.Size(165, 23);
+            this.button4.TabIndex = 4;
+            this.button4.Text = "发送任务状态更改测试指令";
+            this.button4.UseVisualStyleBackColor = true;
+            this.button4.Click += new System.EventHandler(this.button4_Click);
+            // 
+            // button5
+            // 
+            this.button5.Location = new System.Drawing.Point(398, 109);
+            this.button5.Name = "button5";
+            this.button5.Size = new System.Drawing.Size(112, 23);
+            this.button5.TabIndex = 4;
+            this.button5.Text = "发送复位测试指令";
+            this.button5.UseVisualStyleBackColor = true;
+            this.button5.Click += new System.EventHandler(this.button5_Click);
+            // 
+            // button6
+            // 
+            this.button6.Location = new System.Drawing.Point(398, 142);
+            this.button6.Name = "button6";
+            this.button6.Size = new System.Drawing.Size(112, 23);
+            this.button6.TabIndex = 4;
+            this.button6.Text = "发送停止测试指令";
+            this.button6.UseVisualStyleBackColor = true;
+            this.button6.Click += new System.EventHandler(this.button6_Click);
+            // 
+            // button7
+            // 
+            this.button7.Location = new System.Drawing.Point(192, 142);
+            this.button7.Name = "button7";
+            this.button7.Size = new System.Drawing.Size(165, 23);
+            this.button7.TabIndex = 4;
+            this.button7.Text = "发送防撞条屏蔽测试指令";
+            this.button7.UseVisualStyleBackColor = true;
+            this.button7.Click += new System.EventHandler(this.button7_Click);
+            // 
+            // button8
+            // 
+            this.button8.Location = new System.Drawing.Point(550, 109);
+            this.button8.Name = "button8";
+            this.button8.Size = new System.Drawing.Size(181, 23);
+            this.button8.TabIndex = 5;
+            this.button8.Text = "发送Socket客户端随机数据";
+            this.button8.UseVisualStyleBackColor = true;
+            this.button8.Click += new System.EventHandler(this.button8_Click);
+            // 
+            // button9
+            // 
+            this.button9.Location = new System.Drawing.Point(832, 167);
+            this.button9.Name = "button9";
+            this.button9.RightToLeft = System.Windows.Forms.RightToLeft.No;
+            this.button9.Size = new System.Drawing.Size(90, 30);
+            this.button9.TabIndex = 6;
+            this.button9.Text = "清理Log";
+            this.button9.UseVisualStyleBackColor = true;
+            this.button9.Click += new System.EventHandler(this.button9_Click);
+            // 
+            // label2
+            // 
+            this.label2.AutoSize = true;
+            this.label2.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
+            this.label2.Location = new System.Drawing.Point(487, 55);
+            this.label2.Name = "label2";
+            this.label2.Size = new System.Drawing.Size(125, 22);
+            this.label2.TabIndex = 7;
+            this.label2.Text = "当前AGV编号:";
+            // 
+            // numericUpDown1
+            // 
+            this.numericUpDown1.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
+            this.numericUpDown1.Location = new System.Drawing.Point(618, 52);
+            this.numericUpDown1.Maximum = new decimal(new int[] {
+            10000,
+            0,
+            0,
+            0});
+            this.numericUpDown1.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+            this.numericUpDown1.Name = "numericUpDown1";
+            this.numericUpDown1.Size = new System.Drawing.Size(153, 28);
+            this.numericUpDown1.TabIndex = 8;
+            this.numericUpDown1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+            this.numericUpDown1.Value = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+            // 
+            // button10
+            // 
+            this.button10.Location = new System.Drawing.Point(797, 48);
+            this.button10.Name = "button10";
+            this.button10.Size = new System.Drawing.Size(125, 28);
+            this.button10.TabIndex = 9;
+            this.button10.Text = "修改AGV编号";
+            this.button10.UseVisualStyleBackColor = true;
+            this.button10.Click += new System.EventHandler(this.button10_Click);
+            // 
+            // label3
+            // 
+            this.label3.AutoSize = true;
+            this.label3.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
+            this.label3.Location = new System.Drawing.Point(165, 15);
+            this.label3.Name = "label3";
+            this.label3.Size = new System.Drawing.Size(122, 22);
+            this.label3.TabIndex = 7;
+            this.label3.Text = "服务端IP地址:";
+            // 
+            // textBox1
+            // 
+            this.textBox1.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
+            this.textBox1.Location = new System.Drawing.Point(296, 12);
+            this.textBox1.Name = "textBox1";
+            this.textBox1.Size = new System.Drawing.Size(172, 28);
+            this.textBox1.TabIndex = 10;
+            this.textBox1.Text = "192.168.5.156";
+            // 
+            // label4
+            // 
+            this.label4.AutoSize = true;
+            this.label4.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
+            this.label4.Location = new System.Drawing.Point(487, 15);
+            this.label4.Name = "label4";
+            this.label4.Size = new System.Drawing.Size(122, 22);
+            this.label4.TabIndex = 7;
+            this.label4.Text = "服务端端口号:";
+            // 
+            // numericUpDown2
+            // 
+            this.numericUpDown2.Font = new System.Drawing.Font("Microsoft YaHei UI", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point);
+            this.numericUpDown2.Location = new System.Drawing.Point(618, 12);
+            this.numericUpDown2.Maximum = new decimal(new int[] {
+            100000,
+            0,
+            0,
+            0});
+            this.numericUpDown2.Minimum = new decimal(new int[] {
+            1,
+            0,
+            0,
+            0});
+            this.numericUpDown2.Name = "numericUpDown2";
+            this.numericUpDown2.Size = new System.Drawing.Size(153, 28);
+            this.numericUpDown2.TabIndex = 8;
+            this.numericUpDown2.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
+            this.numericUpDown2.Value = new decimal(new int[] {
+            10001,
+            0,
+            0,
+            0});
+            // 
+            // button11
+            // 
+            this.button11.Location = new System.Drawing.Point(797, 12);
+            this.button11.Name = "button11";
+            this.button11.Size = new System.Drawing.Size(125, 30);
+            this.button11.TabIndex = 11;
+            this.button11.Text = "更改服务端IP端口号";
+            this.button11.UseVisualStyleBackColor = true;
+            this.button11.Click += new System.EventHandler(this.button11_Click);
+            // 
+            // Form1
+            // 
+            this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 17F);
+            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+            this.ClientSize = new System.Drawing.Size(934, 605);
+            this.Controls.Add(this.button11);
+            this.Controls.Add(this.textBox1);
+            this.Controls.Add(this.button10);
+            this.Controls.Add(this.numericUpDown2);
+            this.Controls.Add(this.numericUpDown1);
+            this.Controls.Add(this.label4);
+            this.Controls.Add(this.label3);
+            this.Controls.Add(this.label2);
+            this.Controls.Add(this.button9);
+            this.Controls.Add(this.button8);
+            this.Controls.Add(this.button7);
+            this.Controls.Add(this.button6);
+            this.Controls.Add(this.button5);
+            this.Controls.Add(this.button4);
+            this.Controls.Add(this.button3);
+            this.Controls.Add(this.button2);
+            this.Controls.Add(this.comboBox1);
+            this.Controls.Add(this.label1);
+            this.Controls.Add(this.richTextBox1);
+            this.Controls.Add(this.button1);
+            this.Name = "Form1";
+            this.Text = "Form1";
+            this.Load += new System.EventHandler(this.Form1_Load);
+            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown1)).EndInit();
+            ((System.ComponentModel.ISupportInitialize)(this.numericUpDown2)).EndInit();
+            this.ResumeLayout(false);
+            this.PerformLayout();
+
+        }
+
+        #endregion
+
+        private System.Windows.Forms.Button button1;
+        private System.Windows.Forms.RichTextBox richTextBox1;
+        private System.Windows.Forms.Label label1;
+        private System.Windows.Forms.ComboBox comboBox1;
+        private System.Windows.Forms.Button button2;
+        private System.Windows.Forms.Button button3;
+        private System.Windows.Forms.Button button4;
+        private System.Windows.Forms.Button button5;
+        private System.Windows.Forms.Button button6;
+        private System.Windows.Forms.Button button7;
+        private System.Windows.Forms.Button button8;
+        private System.Windows.Forms.Button button9;
+        private System.Windows.Forms.Label label2;
+        private System.Windows.Forms.NumericUpDown numericUpDown1;
+        private System.Windows.Forms.Button button10;
+        private System.Windows.Forms.Label label3;
+        private System.Windows.Forms.TextBox textBox1;
+        private System.Windows.Forms.Label label4;
+        private System.Windows.Forms.NumericUpDown numericUpDown2;
+        private System.Windows.Forms.Button button11;
+    }
+}
+

+ 540 - 0
DWZB_Agv_Agreement/Form1.cs

@@ -0,0 +1,540 @@
+using DWZB_Agv_Agreement.Agv_Agreement;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Text.RegularExpressions;
+using System.Threading;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace DWZB_Agv_Agreement
+{
+    public partial class Form1 : Form
+    {
+        public Form1()
+        {
+            InitializeComponent();
+        }
+        /// <summary>
+        /// Socket服务端
+        /// </summary>
+        private readonly SocketServerHelper socketServerMd = new SocketServerHelper();
+        /// <summary>
+        /// 日志头部
+        /// </summary>
+        private readonly string LogHeadText = "设备实时运行Log界面 ==>> ";
+        #region 日志显示
+        private void ShowLogToFrmRichTextBox(object sender, ShowLogToFrmEventArgs e)
+        {
+            Invoke(new Action(() =>
+            {
+                richTextBox1.AppendText($"发生时间:{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff} | {e.ShowMsg}\r\n");
+            }));
+        }
+        private void ShowLog(string msg, bool isShowLogToFrm, LogTypeEnum logTypeEnum)
+        {
+            if (isShowLogToFrm)
+            {
+                ShowLogToFrmRichTextBox(this, new ShowLogToFrmEventArgs(LogHeadText + msg));
+            }
+            LogHelper.WriteLog(LogHeadText + msg, logTypeEnum);
+        }
+        #endregion
+        private void Button1_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                socketServerMd.MessageEvent += new GetMessageEventHandler(Socket_MessageEvent);
+                socketServerMd.AcceptEvent += new GetAcceptEventHandler(Socket_AcceptEvent);
+                socketServerMd.CloseEvent += new GetCloseEventHandler(Socket_CloseEvent);
+                //开启监听
+                socketServerMd.StartListen(AppConfigHelper.Get("SocketServerIpAddress"), Convert.ToInt32(AppConfigHelper.Get("SocketServerPort")));
+                Thread thCodeScanner = new Thread(socketServerMd.ListeneSocketClientConnectAccept)
+                {
+                    IsBackground = true
+                };
+                thCodeScanner.Start();
+                button1.Enabled = false;
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        /// <summary>
+        /// Socket连接关闭事件
+        /// </summary>
+        /// <param name="sender">数据</param>
+        /// <param name="e">事件参数</param>
+        void Socket_CloseEvent(object sender, EventArgs e)
+        {
+            string socketIpAddress = sender as string;
+            Invoke(new Action(() =>
+            {
+                if (comboBox1.Items.Contains(socketIpAddress))
+                {
+                    comboBox1.Items.Remove(socketIpAddress);
+                }
+                if (comboBox1.Items.Count == 0)
+                {
+                    comboBox1.Text = "";
+                }                
+            }));
+            socketServerMd.RemoveSocketClient(socketIpAddress);
+            ShowLog($"Socket客户端:【{socketIpAddress}】主动断开连接,Socket服务端已经移除该客户端连接!", true, LogTypeEnum.Run);
+        }
+
+        /// <summary>
+        /// Socket获取远程连接节点事件
+        /// </summary>
+        /// <param name="sender">数据</param>
+        /// <param name="e">事件参数</param>
+        void Socket_AcceptEvent(object sender, EventArgs e)
+        {
+            string socketIpAddress = sender as string;
+            ShowLog($"Socket客户端:【{socketIpAddress}】连接成功!", true, LogTypeEnum.Run);
+            Invoke(new Action(() =>
+            {
+                if (!comboBox1.Items.Contains(socketIpAddress))
+                {
+                    comboBox1.Items.Add(socketIpAddress);
+                }
+            }));
+        }
+
+        /// <summary>
+        /// Socket接收消息数据事件
+        /// </summary>
+        /// <param name="sender">数据流</param>
+        /// <param name="ip">ip地址</param>
+        /// <param name="dataLength">数据长度</param>
+        /// <param name="e">事件参数</param>
+        void Socket_MessageEvent(object sender, string ip, int dataLength, EventArgs e)
+        {
+            try
+            {
+                byte[] by = sender as byte[];
+                if (dataLength == 0)
+                {
+                    ShowLog($"Socket客户端断开连接!", true, LogTypeEnum.SocketData);
+                    return;
+                }
+                byte[] dataBtArr = new byte[dataLength];
+                Array.Copy(by, 0, dataBtArr, 0, dataLength);
+                if (DataHandleHelper.Verify_DataMsgCRC(dataBtArr))
+                {
+                    if (DataHandleHelper.Verify_PackageHeadCRC(dataBtArr))
+                    {
+                        ShowLog($"接收到Socket客户端:【{ip}】的数据成功!:【{BitConverter.ToString(dataBtArr)}】", true, LogTypeEnum.SocketData);
+                    }
+                    else
+                    {
+                        ShowLog($"接收到Socket客户端:【{ip}】的数据的包头校验码验证不通过!【{BitConverter.ToString(dataBtArr)}】", true, LogTypeEnum.SocketErr);
+                    }
+                }
+                else
+                {
+                    ShowLog($"接收到Socket客户端:【{ip}】的数据的数据校验码验证不通过!【{BitConverter.ToString(dataBtArr)}】", true, LogTypeEnum.SocketErr);
+                }
+            }
+            catch (Exception ex)
+            {
+                ShowLog($"Socket客户端:【{ip}】接收数据发生异常:【{ex.Message}】!", true, LogTypeEnum.Err);
+            }
+        }
+
+        private void button2_Click(object sender, EventArgs e)
+        {
+            short a = 29000;
+            byte[] b = BitConverter.GetBytes(a);
+        }
+
+        private void button2_Click_1(object sender, EventArgs e)
+        {
+            try
+            {
+                int r = new Random().Next(1, 65536);
+                AgvTaskSendMd agvTaskSendMd = new()
+                {
+                    FunctionCode = 0xF2,
+                    AgvNo = Convert.ToInt32(AppConfigHelper.Get("AgvNo")),
+                    CmdNo = r,
+                    CmdCode = 2,
+                    TaskType = 0x01,
+                    ClipAction = 0x01,
+                    MoveMode = 0x01,
+                    Target_X = 11,
+                    Target_Y = 12,
+                    Target_Angle = 13,
+                    Speed = 23,
+                    Target_rfidNo = 1
+                };
+                byte[] btArrData = agvTaskSendMd.SerializeBytArr();
+                byte[] dataLen = BitConverter.GetBytes(btArrData.Length);
+                Array.Reverse(dataLen);
+                PackageHeadMd packageHeadMd = new();
+                packageHeadMd.DataLen = dataLen;
+                packageHeadMd.Data_CRC = DataHandleHelper.Get_CustomCRC(btArrData);
+                List<byte> headBtLst = new(8);
+                headBtLst.AddRange(packageHeadMd.PackageHeadFlag);
+                headBtLst.AddRange(packageHeadMd.DataLen);
+                headBtLst.Add(packageHeadMd.VersionNo);
+                headBtLst.Add(packageHeadMd.Data_CRC);
+                packageHeadMd.PackageHead_CRC = DataHandleHelper.Get_CustomCRC(headBtLst.ToArray());
+                byte[] btArrHead = packageHeadMd.SerializeBytArr();
+
+                byte[] sendBtArr = new byte[btArrData.Length + btArrHead.Length];
+                sendBtArr = btArrHead.Concat(btArrData).ToArray();
+                if (!string.IsNullOrEmpty(comboBox1.Text))
+                {
+                    if (!string.IsNullOrEmpty(comboBox1.SelectedItem.ToString()))
+                    {
+                        socketServerMd.SendData(comboBox1.SelectedItem.ToString(), sendBtArr);
+                        ShowLog($"发送任务下发测试指令数据成功:【{BitConverter.ToString(sendBtArr)}】指令号:【{r}】", true, LogTypeEnum.SocketData);
+                    }
+                    else
+                    {
+                        MessageBox.Show("请选择要发送数据的Socket客户端!");
+                    }
+                }
+                else
+                {
+                    MessageBox.Show("请选择要发送数据的Socket客户端!");
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        private void button4_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                int r = new Random().Next(1, 65536);
+                AgvChangeRunStatusCmdMd agvChangeRunStatusCmdMd = new();
+                agvChangeRunStatusCmdMd.FunctionCode = 0xF2;
+                agvChangeRunStatusCmdMd.AgvNo = Convert.ToInt32(AppConfigHelper.Get("AgvNo"));
+                agvChangeRunStatusCmdMd.CmdNo = r;
+                agvChangeRunStatusCmdMd.CmdCode = 0x01;
+                agvChangeRunStatusCmdMd.StatusCode = 0x05;
+
+                byte[] btArrData = agvChangeRunStatusCmdMd.SerializeBytArr();
+                byte[] dataLen = BitConverter.GetBytes(btArrData.Length);
+                Array.Reverse(dataLen);
+                PackageHeadMd packageHeadMd = new();
+                packageHeadMd.DataLen = dataLen;
+                packageHeadMd.Data_CRC = DataHandleHelper.Get_CustomCRC(btArrData);
+                List<byte> headBtLst = new(8);
+                headBtLst.AddRange(packageHeadMd.PackageHeadFlag);
+                headBtLst.AddRange(packageHeadMd.DataLen);
+                headBtLst.Add(packageHeadMd.VersionNo);
+                headBtLst.Add(packageHeadMd.Data_CRC);
+                packageHeadMd.PackageHead_CRC = DataHandleHelper.Get_CustomCRC(headBtLst.ToArray());
+                byte[] btArrHead = packageHeadMd.SerializeBytArr();
+
+                byte[] sendBtArr = new byte[btArrData.Length + btArrHead.Length];
+                sendBtArr = btArrHead.Concat(btArrData).ToArray();
+                if (!string.IsNullOrEmpty(comboBox1.Text))
+                {
+                    if (!string.IsNullOrEmpty(comboBox1.SelectedItem.ToString()))
+                    {
+                        socketServerMd.SendData(comboBox1.SelectedItem.ToString(), sendBtArr);
+                        ShowLog($"发送任务状态更改测试指令数据成功:【{BitConverter.ToString(sendBtArr)}】指令号:【{r}】", true, LogTypeEnum.SocketData);
+                    }
+                    else
+                    {
+                        MessageBox.Show("请选择要发送数据的Socket客户端!");
+                    }
+                }
+                else
+                {
+                    MessageBox.Show("请选择要发送数据的Socket客户端!");
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        private void button3_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                AgvQueryStatusMd agvQueryStatusMd = new();
+                int r = new Random().Next(1, 3000);
+                agvQueryStatusMd.FunctionCode = 0xF1;
+                agvQueryStatusMd.AgvNo = Convert.ToInt32(AppConfigHelper.Get("AgvNo"));
+                agvQueryStatusMd.HeartbeatSignal = r;
+                byte[] btArrData = agvQueryStatusMd.SerializeBytArr();
+                byte[] dataLen = BitConverter.GetBytes(btArrData.Length);
+                Array.Reverse(dataLen);
+                PackageHeadMd packageHeadMd = new();
+                packageHeadMd.DataLen = dataLen;
+                packageHeadMd.Data_CRC = DataHandleHelper.Get_CustomCRC(btArrData);
+                List<byte> headBtLst = new(8);
+                headBtLst.AddRange(packageHeadMd.PackageHeadFlag);
+                headBtLst.AddRange(packageHeadMd.DataLen);
+                headBtLst.Add(packageHeadMd.VersionNo);
+                headBtLst.Add(packageHeadMd.Data_CRC);
+                packageHeadMd.PackageHead_CRC = DataHandleHelper.Get_CustomCRC(headBtLst.ToArray());
+                byte[] btArrHead = packageHeadMd.SerializeBytArr();
+
+                byte[] sendBtArr = new byte[btArrData.Length + btArrHead.Length];
+                sendBtArr = btArrHead.Concat(btArrData).ToArray();
+                if (!string.IsNullOrEmpty(comboBox1.Text))
+                {
+                    if (!string.IsNullOrEmpty(comboBox1.SelectedItem.ToString()))
+                    {
+                        socketServerMd.SendData(comboBox1.SelectedItem.ToString(), sendBtArr);
+                        ShowLog($"发送状态查询测试指令数据成功:【{BitConverter.ToString(sendBtArr)}】心跳数据:【{r}】", true, LogTypeEnum.SocketData);
+                    }
+                    else
+                    {
+                        MessageBox.Show("请选择要发送数据的Socket客户端!");
+                    }
+                }
+                else
+                {
+                    MessageBox.Show("请选择要发送数据的Socket客户端!");
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        private void button7_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                int r = new Random().Next(1, 65536);
+                AgvPreventBumpCmdMd agvPreventBumpCmdMd = new();
+                agvPreventBumpCmdMd.FunctionCode = 0xF2;
+                agvPreventBumpCmdMd.AgvNo = Convert.ToInt32(AppConfigHelper.Get("AgvNo"));
+                agvPreventBumpCmdMd.CmdNo = r;
+                agvPreventBumpCmdMd.CmdCode = 0x10;
+                agvPreventBumpCmdMd.StatusCode = 0x01;
+
+
+                byte[] btArrData = agvPreventBumpCmdMd.SerializeBytArr();
+                byte[] dataLen = BitConverter.GetBytes(btArrData.Length);
+                Array.Reverse(dataLen);
+                PackageHeadMd packageHeadMd = new();
+                packageHeadMd.DataLen = dataLen;
+                packageHeadMd.Data_CRC = DataHandleHelper.Get_CustomCRC(btArrData);
+                List<byte> headBtLst = new(8);
+                headBtLst.AddRange(packageHeadMd.PackageHeadFlag);
+                headBtLst.AddRange(packageHeadMd.DataLen);
+                headBtLst.Add(packageHeadMd.VersionNo);
+                headBtLst.Add(packageHeadMd.Data_CRC);
+                packageHeadMd.PackageHead_CRC = DataHandleHelper.Get_CustomCRC(headBtLst.ToArray());
+                byte[] btArrHead = packageHeadMd.SerializeBytArr();
+
+                byte[] sendBtArr = new byte[btArrData.Length + btArrHead.Length];
+                sendBtArr = btArrHead.Concat(btArrData).ToArray();
+                if (!string.IsNullOrEmpty(comboBox1.Text))
+                {
+                    if (!string.IsNullOrEmpty(comboBox1.SelectedItem.ToString()))
+                    {
+                        socketServerMd.SendData(comboBox1.SelectedItem.ToString(), sendBtArr);
+                        ShowLog($"发送防撞条屏蔽测试指令数据成功:【{BitConverter.ToString(sendBtArr)}】指令号:【{r}】", true, LogTypeEnum.SocketData);
+                    }
+                    else
+                    {
+                        MessageBox.Show("请选择要发送数据的Socket客户端!");
+                    }
+                }
+                else
+                {
+                    MessageBox.Show("请选择要发送数据的Socket客户端!");
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        private void button5_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                int r = new Random().Next(1, 65536);
+                AgvResetCmdMd agvResetCmdMd = new();
+                agvResetCmdMd.FunctionCode = 0xF2;
+                agvResetCmdMd.CmdNo = r;
+                agvResetCmdMd.AgvNo = Convert.ToInt32(AppConfigHelper.Get("AgvNo"));
+                agvResetCmdMd.CmdCode = 0x07;
+
+                byte[] btArrData = agvResetCmdMd.SerializeBytArr();
+                byte[] dataLen = BitConverter.GetBytes(btArrData.Length);
+                Array.Reverse(dataLen);
+                PackageHeadMd packageHeadMd = new();
+                packageHeadMd.DataLen = dataLen;
+                packageHeadMd.Data_CRC = DataHandleHelper.Get_CustomCRC(btArrData);
+                List<byte> headBtLst = new(8);
+                headBtLst.AddRange(packageHeadMd.PackageHeadFlag);
+                headBtLst.AddRange(packageHeadMd.DataLen);
+                headBtLst.Add(packageHeadMd.VersionNo);
+                headBtLst.Add(packageHeadMd.Data_CRC);
+                packageHeadMd.PackageHead_CRC = DataHandleHelper.Get_CustomCRC(headBtLst.ToArray());
+                byte[] btArrHead = packageHeadMd.SerializeBytArr();
+
+                byte[] sendBtArr = new byte[btArrData.Length + btArrHead.Length];
+                sendBtArr = btArrHead.Concat(btArrData).ToArray();
+                if (!string.IsNullOrEmpty(comboBox1.Text))
+                {
+                    if (!string.IsNullOrEmpty(comboBox1.SelectedItem.ToString()))
+                    {
+                        socketServerMd.SendData(comboBox1.SelectedItem.ToString(), sendBtArr);
+                        ShowLog($"发送复位测试指令数据成功:【{BitConverter.ToString(sendBtArr)}】指令号:【{r}】", true, LogTypeEnum.SocketData);
+                    }
+                    else
+                    {
+                        MessageBox.Show("请选择要发送数据的Socket客户端!");
+                    }
+                }
+                else
+                {
+                    MessageBox.Show("请选择要发送数据的Socket客户端!");
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        private void button6_Click(object sender, EventArgs e)
+        {
+            try
+            {
+                int r = new Random().Next(1, 65536);
+                AgvStopCmdMd agvStopCmdMd = new();
+                agvStopCmdMd.FunctionCode = 0xF2;
+                agvStopCmdMd.AgvNo = Convert.ToInt32(AppConfigHelper.Get("AgvNo"));
+                agvStopCmdMd.CmdNo = r;
+                agvStopCmdMd.CmdCode = 0x08;
+
+                byte[] btArrData = agvStopCmdMd.SerializeBytArr();
+                byte[] dataLen = BitConverter.GetBytes(btArrData.Length);
+                Array.Reverse(dataLen);
+                PackageHeadMd packageHeadMd = new();
+                packageHeadMd.DataLen = dataLen;
+                packageHeadMd.Data_CRC = DataHandleHelper.Get_CustomCRC(btArrData);
+                List<byte> headBtLst = new(8);
+                headBtLst.AddRange(packageHeadMd.PackageHeadFlag);
+                headBtLst.AddRange(packageHeadMd.DataLen);
+                headBtLst.Add(packageHeadMd.VersionNo);
+                headBtLst.Add(packageHeadMd.Data_CRC);
+                packageHeadMd.PackageHead_CRC = DataHandleHelper.Get_CustomCRC(headBtLst.ToArray());
+                byte[] btArrHead = packageHeadMd.SerializeBytArr();
+
+                byte[] sendBtArr = new byte[btArrData.Length + btArrHead.Length];
+                sendBtArr = btArrHead.Concat(btArrData).ToArray();
+                if (!string.IsNullOrEmpty(comboBox1.Text))
+                {
+                    if (!string.IsNullOrEmpty(comboBox1.SelectedItem.ToString()))
+                    {
+                        socketServerMd.SendData(comboBox1.SelectedItem.ToString(), sendBtArr);
+                        ShowLog($"发送停止测试指令数据成功:【{BitConverter.ToString(sendBtArr)}】指令号:【{r}】", true, LogTypeEnum.SocketData);
+                    }
+                    else
+                    {
+                        MessageBox.Show("请选择要发送数据的Socket客户端!");
+                    }
+                }
+                else
+                {
+                    MessageBox.Show("请选择要发送数据的Socket客户端!");
+                }
+            }
+            catch (Exception ex)
+            {
+                MessageBox.Show(ex.Message);
+            }
+        }
+
+        private void button8_Click(object sender, EventArgs e)
+        {
+            Random r = new();
+            int a = r.Next(0,10000);
+            byte[] b = BitConverter.GetBytes(a);
+            if (!string.IsNullOrEmpty(comboBox1.Text))
+            {
+                if (!string.IsNullOrEmpty(comboBox1.SelectedItem.ToString()))
+                {
+                    socketServerMd.SendData(comboBox1.SelectedItem.ToString(), b);
+                    ShowLog($"发送自定义测试数据成功:【{a}】【{BitConverter.ToString(b)}】", true, LogTypeEnum.SocketData);
+                }
+                else
+                {
+                    MessageBox.Show("请选择要发送数据的Socket客户端!");
+                }
+            }
+            else
+            {
+                MessageBox.Show("请选择要发送数据的Socket客户端!");
+            }
+
+}
+
+        private void button9_Click(object sender, EventArgs e)
+        {
+            richTextBox1.Clear();
+        }
+
+        private void button10_Click(object sender, EventArgs e)
+        {
+            AppConfigHelper.Update("AgvNo", Convert.ToInt32(numericUpDown1.Value).ToString());
+        }
+
+        private void Form1_Load(object sender, EventArgs e)
+        {
+            textBox1.Text = AppConfigHelper.Get("SocketServerIpAddress");
+            numericUpDown2.Value = Convert.ToInt32(AppConfigHelper.Get("SocketServerPort"));
+            numericUpDown1.Value = Convert.ToInt32(AppConfigHelper.Get("AgvNo"));
+        }
+
+        private void button11_Click(object sender, EventArgs e)
+        {
+            if (!IsIP(textBox1.Text))
+            {
+                MessageBox.Show("请输入正确的IP地址!");
+                return;
+            }
+            if (AppConfigHelper.Get("SocketServerIpAddress") == textBox1.Text && Convert.ToInt32(numericUpDown2.Value) == Convert.ToInt32(AppConfigHelper.Get("SocketServerPort")))
+                return;
+            AppConfigHelper.Update("SocketServerIpAddress", textBox1.Text);
+            AppConfigHelper.Update("SocketServerPort", Convert.ToInt32(numericUpDown2.Value).ToString());
+            MessageBox.Show("更改IP地址和端口号后,需要重启程序才能生效!");
+        }
+        /// <summary>
+        /// 验证IP地址是否合法
+        /// </summary>
+        /// <param name="ip">要验证的IP地址</param>
+        public bool IsIP(string ip)
+        {
+            //如果为空,认为验证合格
+            if (string.IsNullOrEmpty(ip))
+            {
+                return false;
+            }
+            //清除要验证字符串中的空格
+            ip = ip.Trim();
+            //模式字符串
+            string pattern = @"^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$";
+            //验证
+            return Regex.IsMatch(ip, pattern);
+        }
+    }
+}

+ 60 - 0
DWZB_Agv_Agreement/Form1.resx

@@ -0,0 +1,60 @@
+<root>
+  <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
+    <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
+    <xsd:element name="root" msdata:IsDataSet="true">
+      <xsd:complexType>
+        <xsd:choice maxOccurs="unbounded">
+          <xsd:element name="metadata">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" />
+              </xsd:sequence>
+              <xsd:attribute name="name" use="required" type="xsd:string" />
+              <xsd:attribute name="type" type="xsd:string" />
+              <xsd:attribute name="mimetype" type="xsd:string" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="assembly">
+            <xsd:complexType>
+              <xsd:attribute name="alias" type="xsd:string" />
+              <xsd:attribute name="name" type="xsd:string" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="data">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+                <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
+              <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
+              <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
+              <xsd:attribute ref="xml:space" />
+            </xsd:complexType>
+          </xsd:element>
+          <xsd:element name="resheader">
+            <xsd:complexType>
+              <xsd:sequence>
+                <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
+              </xsd:sequence>
+              <xsd:attribute name="name" type="xsd:string" use="required" />
+            </xsd:complexType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:complexType>
+    </xsd:element>
+  </xsd:schema>
+  <resheader name="resmimetype">
+    <value>text/microsoft-resx</value>
+  </resheader>
+  <resheader name="version">
+    <value>2.0</value>
+  </resheader>
+  <resheader name="reader">
+    <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+  <resheader name="writer">
+    <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
+  </resheader>
+</root>

+ 240 - 0
DWZB_Agv_Agreement/LogHelper.cs

@@ -0,0 +1,240 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement
+{
+    public static class LogHelper
+    {
+        private readonly static object thLock = new object();
+
+        #region 记录日志为文本文档形式
+        /// <summary>
+        /// 记录日志类
+        /// </summary>
+        /// <param name="Txt">日志内容</param>
+        /// <param name="logType">日志类型(Run:程序运行日志; Err:程序错误日志; DbErr:数据库异常相关日志;  OPCRun:OPC运行日志; SocketRun:Socket运行日志; SocErr:Socket异常日志。)</param>
+        public static void WriteLog(string Txt, LogTypeEnum logType)
+        {
+            lock (thLock)
+            {
+                //获取日志存放位置,年份不同,存放文件夹不同。
+                string strDir = Environment.CurrentDirectory + "\\Log\\" + DateTime.Now.ToString("yyyy") + "\\";
+                //获取时间,年月日。
+                string fileDate = DateTime.Now.ToString("yyyy-MM-dd");
+                //获取时间,年月。
+                string fileDate1 = DateTime.Now.ToString("yyyy-MM");
+                //每一年的不同月份日志放在不同的文件夹,同一月份不同类型的日志放于同一个文件夹。
+                string strDir1 = strDir + fileDate1 + "\\";
+                //每一年的相同月份不同日期的日志放在不同的文件夹
+                string strDir2 = strDir1 + fileDate + "\\";
+                //不同的日志名称,日志文件不同
+                string filePath = strDir2 + fileDate + "_" + logType + ".log";
+                string DateString = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
+                string Str = "发生时间:" + DateString + "|" + Txt + "\r\n";
+                WriteFile(strDir2, filePath, Str);
+            }
+        }
+        /// <summary>
+        /// 日志文件打印类
+        /// </summary>
+        /// <param name="strDir">日志文件存放的文件夹</param>
+        /// <param name="filePath">日志文件存放路径</param>
+        /// <param name="txt">日志内容</param>
+        private static void WriteFile(string strDir, string filePath, string txt)
+        {
+            FileStream fs = null;
+            StreamWriter sw = null;
+            try
+            {
+                if (!Directory.Exists(strDir))//如果日志文件存放的文件夹不存在,就新建一个文件夹。
+                {
+                    Directory.CreateDirectory(strDir);
+                }
+
+                if (File.Exists(filePath))//日志文件存放路径存在,向日志文件追加记录。
+                {
+                    fs = new FileStream(filePath, FileMode.Append);
+                }
+                else//日志文件存放路径不存在,创建日志文件。
+                {
+                    fs = new FileStream(filePath, FileMode.Create);
+                }
+                sw = new StreamWriter(fs);
+                //开始写入
+                sw.Write(txt);
+
+                //清空缓冲区
+                sw.Flush();
+                //关闭流
+                sw.Close();
+                fs.Close();
+            }
+            catch (Exception)
+            {
+                ;
+            }
+            finally
+            {
+                if (sw != null)
+                    sw.Close();
+                if (fs != null)
+                    fs.Close();
+            }
+        }
+        #endregion
+
+        #region 读日志
+        /// <summary>
+        /// 生成文件信息
+        /// </summary>
+        /// <param name="date"></param>
+        /// <param name="logType"></param>
+        /// <returns></returns>
+        private static Tuple<string, string> BuildLogFileName(DateTime date, LogTypeEnum logType)
+        {
+
+            string strDir = Environment.CurrentDirectory + "\\NX_CleanMac_Log\\" + date.ToString("yyyy") + "\\";
+            //获取时间,年月日。
+            string fileDate = date.ToString("yyyy-MM-dd");
+            //获取时间,年月。
+            string fileDate1 = date.ToString("yyyy-MM");
+            //每一年的不同月份日志放在不同的文件夹,同一月份不同类型的日志放于同一个文件夹。
+            string strDir1 = strDir + fileDate1 + "\\";
+            //每一年的相同月份不同日期的日志放在不同的文件夹
+            string strDir2 = strDir1 + fileDate + "\\";
+            //不同的日志名称,日志文件不同
+            string filePath = strDir2 + fileDate + "_" + logType + ".log";
+            return new Tuple<string, string>(strDir2, filePath);
+        }
+        public static IEnumerable<LogSearchMd> ReadLog(DateTime begindate, DateTime endDate, LogTypeEnum logType)
+        {
+            List<LogSearchMd> logs = new List<LogSearchMd>();
+            List<string> strlogs = ReadLogFile(begindate, endDate, logType);
+            foreach (string strLog in strlogs)
+            {
+                LogSearchMd log = LogSearchMd.Deserialize(strLog);
+                logs.Add(log);
+            }
+            return logs;
+        }
+        /// <summary>
+        /// 读取log文件
+        /// </summary>
+        /// <param name="date"></param>
+        /// <param name="logType"></param>
+        /// <returns></returns>
+        public static string[] ReadLogFile(DateTime date, LogTypeEnum logType)
+        {
+            string filename = BuildLogFileName(date, logType).Item2;
+            if (!File.Exists(filename))
+            {
+                return new string[] { };
+            }
+            return File.ReadAllLines(filename);
+        }
+        /// <summary>
+        /// 读取log文件
+        /// </summary>
+        /// <param name="date"></param>
+        /// <param name="logType"></param>
+        /// <returns></returns>
+        public static List<string> ReadLogFile(DateTime begindate, DateTime endDate, LogTypeEnum logType)
+        {
+            DateTime _date = begindate.Date;
+            DateTime _endDate = endDate.Date;
+            List<string> logs = new List<string>();
+            while (_date <= _endDate)
+            {
+                string[] _logs = ReadLogFile(_date, logType);
+                logs.AddRange(_logs);
+                _date = _date.AddDays(1);
+            }
+            return logs;
+        }
+        #endregion
+
+    }
+
+    /// <summary>
+    /// 日志类型枚举
+    /// </summary>
+    public enum LogTypeEnum
+    {
+        /// <summary>
+        /// 程序运行日志
+        /// </summary>
+        [Description("程序运行日志")]
+        Run,
+        /// <summary>
+        /// 程序错误日志
+        /// </summary>
+        [Description("程序错误日志")]
+        Err,
+        /// <summary>
+        /// 数据库异常相关日志
+        /// </summary>
+        [Description("数据库异常相关日志")]
+        DbErr,
+        /// <summary>
+        /// OPC运行日志
+        /// </summary>
+        [Description("OPC运行日志")]
+        OPCRun,
+        /// <summary>
+        /// Socket运行日志
+        /// </summary>
+        [Description("Socket运行日志")]
+        SocketRun,
+        /// <summary>
+        /// Socket收发数据日志
+        /// </summary>
+        [Description("Socket收发数据日志")]
+        SocketData,
+        /// <summary>
+        /// Socket异常日志
+        /// </summary>
+        [Description("Socket异常日志")]
+        SocketErr
+    }
+
+    public class LogSearchMd
+    {
+        private const char SplitCHar = '|';
+        public DateTime Time { get; set; }
+        public string Message { get; set; }
+        public string Serialize()
+        {
+            return $"{Time}{SplitCHar}{Message}";
+        }
+        public static LogSearchMd Deserialize(string txt)
+        {
+            LogSearchMd log = new LogSearchMd();
+            string[] txts = txt.Split(SplitCHar);
+            txts[0] = txts[0].Replace("发生时间:", "");
+            return new LogSearchMd()
+            {
+                Message = txts[1],
+                Time = DateTime.Parse(txts[0])
+            };
+        }
+    }
+
+    public class ShowLogToFrmEventArgs : EventArgs
+    {
+        private readonly string _showMsg = string.Empty;
+        public ShowLogToFrmEventArgs(string msg)
+        {
+            _showMsg = msg;
+        }
+
+        public string ShowMsg
+        {
+            get { return _showMsg; }
+        }
+    }
+}

+ 23 - 0
DWZB_Agv_Agreement/Program.cs

@@ -0,0 +1,23 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace DWZB_Agv_Agreement
+{
+    static class Program
+    {
+        /// <summary>
+        ///  The main entry point for the application.
+        /// </summary>
+        [STAThread]
+        static void Main()
+        {
+            Application.SetHighDpiMode(HighDpiMode.SystemAware);
+            Application.EnableVisualStyles();
+            Application.SetCompatibleTextRenderingDefault(false);
+            Application.Run(new Form1());
+        }
+    }
+}

+ 288 - 0
DWZB_Agv_Agreement/SocketServerHelper.cs

@@ -0,0 +1,288 @@
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace DWZB_Agv_Agreement
+{
+
+    #region 定义委托、事件
+    /// <summary>
+    /// 获取消息委托
+    /// </summary>
+    /// <param name="sender">消息主体buffer</param>
+    /// <param name="ip">ip</param>
+    /// <param name="dataLength">数据长度</param>
+    /// <param name="e">事件类对象</param>
+    public delegate void GetMessageEventHandler(object sender, string ip, int dataLength, EventArgs e);
+    /// <summary>
+    /// 获取链接委托
+    /// </summary>
+    /// <param name="sender">链接进入的IP</param>
+    /// <param name="e">事件类对象</param>
+    public delegate void GetAcceptEventHandler(object sender, EventArgs e);
+    /// <summary>
+    /// 关闭链接委托
+    /// </summary>
+    /// <param name="sender">链接进入的IP</param>
+    /// <param name="e">事件类对象</param>
+    public delegate void GetCloseEventHandler(object sender, EventArgs e);
+    #endregion
+
+    public class SocketServerHelper
+    {
+
+        #region 事件
+        public event GetMessageEventHandler MessageEvent;
+        /// <summary>
+        /// 触发接收到Socket客户端消息的委托事件
+        /// </summary>
+        /// <param name="sender">数据buffer</param>
+        /// <param name="ip">ip</param>
+        /// <param name="dataLength">数据长度</param>
+        /// <param name="e">事件类对象</param>
+        protected virtual void OnNewMessage(object sender, string ip, int dataLength, EventArgs e)
+        {
+            MessageEvent?.Invoke(sender, ip, dataLength, e);
+        }
+
+        public event GetAcceptEventHandler AcceptEvent;
+        /// <summary>
+        /// 触发Socket客户接入服务端的委托事件
+        /// </summary>
+        /// <param name="sender">链接进入的IP(Socket对象)</param>
+        /// <param name="e">事件类对象</param>
+        protected virtual void OnAcceptEvent(object sender, EventArgs e)
+        {
+            AcceptEvent?.Invoke(sender, e);
+        }
+
+        public event GetCloseEventHandler CloseEvent;
+        /// <summary>
+        /// 触发关闭链接委托事件
+        /// </summary>
+        /// <param name="sender">链接进入的IP(Socket对象)</param>
+        /// <param name="e">事件类对象</param>
+        protected virtual void OnCloseEvent(object sender, EventArgs e)
+        {
+            CloseEvent?.Invoke(sender, e);
+        }
+
+        #endregion
+
+        #region 全局变量
+        /// <summary>
+        /// Socket服务端套接字对象
+        /// </summary>
+        public Socket SocketServerListen;
+        /// <summary>
+        /// Socket客户端套接字对象字典
+        /// </summary>
+        public ConcurrentDictionary<string, Socket> dicSockClientList = new ConcurrentDictionary<string, Socket>();
+        /// <summary>
+        /// Socket客户端接收数据线程字典
+        /// </summary>
+        //public ConcurrentDictionary<string, Thread> dicSockThreadList = new ConcurrentDictionary<string, Thread>();
+        /// <summary>
+        /// 监听客户端连接的线程标识
+        /// </summary>
+        private bool Flag_Listen = false;
+        #endregion
+
+        #region 方法
+        /// <summary>
+        /// 开启监听
+        /// </summary>
+        /// <param name="ip">服务端IP地址</param>
+        /// <param name="port"服务端>端口号</param>
+        public void StartListen(string ip, int port)
+        {
+            try
+            {
+                //当开始监听的时候,在服务器端创建一个负责监听IP地址跟端口号的Socket
+                SocketServerListen = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
+                //获取ip地址
+                IPAddress ipadd = IPAddress.Parse(ip);
+                //创建一个网络通信节点,这个通信节点包含了ip地址,端口号。
+                //这里的端口我们设置为1029,这里设置大于1024,为什么自己查一下端口号范围使用说明。
+                IPEndPoint endpoint = new IPEndPoint(ipadd, Convert.ToInt32(port));//创建一个网络通信节点,该节点中包含了IP地址和端口号.
+                //Socket绑定网络通信节点
+                SocketServerListen.Bind(endpoint);
+                //设置监听队列
+                SocketServerListen.Listen(100);
+                LogHelper.WriteLog($"Socket服务端 ip地址:【{ip}】端口号:【{port}】 开启监听成功!", LogTypeEnum.SocketRun);
+                Flag_Listen = true;
+            }
+            catch (Exception ex)
+            {
+                LogHelper.WriteLog($"Socket服务端 ip地址:【{ip}】端口号:【{port}】 开启监听发生异常:【{ex.Message}】", LogTypeEnum.SocketErr);
+            }
+        }
+
+        #region UDP协议
+        //public void StartListenUdp(string ip, int port, List<BasBarcodeScannerMd> allBarcodeScannerList)
+        //{
+        //    try
+        //    {
+        //        //当开始监听的时候,在服务器端创建一个负责监听IP地址跟端口号的Socket
+        //        SocketServerListen = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
+        //        //获取ip地址
+        //        IPAddress ipadd = IPAddress.Parse(ip);
+        //        //创建一个网络通信节点,这个通信节点包含了ip地址,端口号。
+        //        //这里的端口我们设置为1029,这里设置大于1024,为什么自己查一下端口号范围使用说明。
+        //        IPEndPoint endpoint = new IPEndPoint(ipadd, Convert.ToInt32(port));//创建一个网络通信节点,该节点中包含了IP地址和端口号.
+        //        //Socket绑定网络通信节点
+        //        SocketServerListen.Bind(endpoint);
+        //        LogHelper.WriteLog($"Socket服务端 ip地址:【{ip}】端口号:【{port}】 开启监听成功!", LogTypeEnum.SocketRun);
+        //        ParameterizedThreadStart par = new ParameterizedThreadStart(ReciveMsg);
+        //        Thread t = new Thread(par)
+        //        {
+        //            IsBackground = true
+        //        };
+        //        t.Start(allBarcodeScannerList);
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        LogHelper.WriteLog($"Socket服务端 ip地址:【{ip}】端口号:【{port}】 开启监听发生异常:【{ex.Message}】", LogTypeEnum.SocketErr);
+        //    }
+        //}
+        //void ReciveMsg(object allBarcodeScannerList)
+        //{
+        //    List<BasBarcodeScannerMd> scannerList = allBarcodeScannerList as List<BasBarcodeScannerMd>;
+        //    while (true)
+        //    {
+        //        try
+        //        {
+        //            EndPoint point = new IPEndPoint(IPAddress.Any, 0);
+        //            byte[] buffer = new byte[1024 * 1024];
+        //            int length = SocketServerListen.ReceiveFrom(buffer, ref point);
+        //            if (scannerList.FindAll(x => x.IpAddress == ((IPEndPoint)point).Address.ToString()).Count > 0)
+        //            {
+        //                //string message = Encoding.UTF8.GetString(buffer, 0, length);
+        //                //触发接收到Socket客户端发送数据的事件
+        //                OnNewMessage(buffer, point.ToString(), length, EventArgs.Empty);
+        //            }
+        //        }
+        //        catch
+        //        {
+
+        //        }
+        //    }
+        //}
+        #endregion
+
+        /// <summary>
+        /// 循环监听客户端的连接
+        /// </summary>
+        public void ListeneSocketClientConnectAccept()
+        {
+            while (Flag_Listen)
+            {
+                try
+                {
+                    Socket newSoket = SocketServerListen.Accept();
+                    string ipAddress = newSoket.RemoteEndPoint.ToString();
+
+                    ParameterizedThreadStart par = new(RecevieMsg);
+                    Thread thread = new(par)
+                    {
+                        IsBackground = true
+                    };
+                    thread.Start(newSoket);
+
+                    dicSockClientList.TryAdd(ipAddress, newSoket);
+                    //dicSockThreadList.TryAdd(ipAddress, thread);
+                    //触发Socket客户端接入服务端事件
+                    OnAcceptEvent(ipAddress, EventArgs.Empty);
+
+                    LogHelper.WriteLog($"Socket客户端:【{ipAddress}】连接成功!", LogTypeEnum.SocketRun);
+                }
+                catch (Exception ex)
+                {
+                    LogHelper.WriteLog($"Socket服务端监听客户端的连接的函数发生异常:【{ex.Message}】", LogTypeEnum.SocketErr);
+                }
+            }
+        }
+
+        /// <summary>
+        /// //该方法负责接收从客户端发送过来的数据
+        /// </summary>
+        /// <param name="socket">Socket套接字</param>
+        public void RecevieMsg(object socket)
+        {
+            Socket newSocket = socket as Socket;//转成对应的Socket类型
+            string IPPortID = newSocket.RemoteEndPoint.ToString();//这个线程ID
+
+            while (Flag_Listen)
+            {
+                byte[] buffer = new byte[1024 * 2];
+                int receiveLength;
+                try  //由于Socket中的Receive方法容易抛出异常,所以我们在这里要捕获异常。
+                {
+                    bool a = dicSockClientList[IPPortID].Poll(10,SelectMode.SelectRead);
+                    receiveLength = dicSockClientList[IPPortID].Receive(buffer);//接收从客户端发送过来的数据
+                    if (a)
+                    {
+                        LogHelper.WriteLog($"Socket客户端:【{IPPortID}】主动断开连接,Socket服务端准备移除该客户端连接!", LogTypeEnum.SocketErr);
+                        //触发Socket客户端断开连接实践
+                        OnCloseEvent(IPPortID, EventArgs.Empty);
+                        break;
+                    }
+                }
+                catch (Exception ex)
+                {                    
+                    LogHelper.WriteLog($"Socket客户端:【{IPPortID}】数据接受发生异常:【{ex.Message}】,Socket服务端已经移除该客户端连接!", LogTypeEnum.SocketErr);
+                    //触发Socket客户端断开连接实践
+                    OnCloseEvent(IPPortID, EventArgs.Empty);
+                    break;
+                }
+                if (receiveLength > 0)
+                {
+                    //记录接收到的原始数据                    
+                    LogHelper.WriteLog($"Socket客户端:【{IPPortID}】接收到:【{receiveLength}】字节数据,数据内容:【{BitConverter.ToString(buffer, 0, receiveLength)}】。", LogTypeEnum.SocketData);
+                    //触发接收到Socket客户端发送数据的事件
+                    OnNewMessage(buffer, IPPortID, receiveLength, EventArgs.Empty);
+                }
+            }
+        }
+
+        /// <summary>
+        /// 关闭服务
+        /// </summary>
+        public void CloseServer()
+        {
+            lock (dicSockClientList)
+            {
+                foreach (var item in dicSockClientList)
+                {
+                    item.Value.Close();//关闭每一个连接
+                }
+                dicSockClientList.Clear();//清除字典
+            }
+            Flag_Listen = false;
+            //服务端不能主动关闭连接,需要把监听到的连接逐个关闭
+            SocketServerListen.Shutdown(SocketShutdown.Both);
+            if (SocketServerListen != null)
+            {
+                SocketServerListen.Close();
+            }
+        }
+
+        public void SendData(string ipAddress,byte[] btArr)
+        {
+            dicSockClientList[ipAddress].Send(btArr);
+        }
+
+        public void RemoveSocketClient(string ipAddress)
+        {
+            dicSockClientList.TryRemove(ipAddress, out _);
+        }
+        #endregion
+
+    }
+}