c#  tcp客户端 针对火灾报警系统进行自测的工具

c#  tcp客户端 针对火灾报警系统进行自测的工具

using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp1
{
    public partial class client : Form
    {
        public client()
        {
            InitializeComponent();
        }
        Socket sockClient = null;
        Socket[] sockets;
        public List<byte> BufferData = new List<byte>();  // 数据帧缓存空间
        public FileStream writefile = null;  //文件输入

        private void txtIp_TextChanged(object sender, EventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Control.CheckForIllegalCrossThreadCalls = false;
            btnStart.Enabled = false;
            string strPath = System.Windows.Forms.Application.StartupPath + "\\" + "ipSave.txt";
            //string pathsave = strStartupPath + "\\" + "1.txt"; //项目名称
            string str = File.ReadAllText(strPath);
            if (str!=null)
            {
                txtServer.Text = str;
            }
           

            // button1.Click;
            //Thread.Sleep(1000);
            // button1_Click(this, e);
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            try
            {
                //创建负责通信的Socket
                sockClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPAddress ip = IPAddress.Parse(txtServer.Text);
                IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
                try
                {
                    showMsg("与服务器连接中……");
                    sockClient.Connect(point);

                }
                catch (SocketException se)
                {
                    MessageBox.Show(se.Message);
                    return;
                    //this.Close();
                }

                showMsg("与服务器连接成功!!!");

                //开启一个新的线程不停的接收服务端发来的消息
                Thread th = new Thread(RecMsg);
                th.IsBackground = true;
                th.Start();
            }
            catch
            { }
        }
        void showMsg(string str)
        {
            txtMsg.AppendText(str + "\r\n");
        }

        void showErrMsg(string str)
        {
            txtErr.AppendText(str + "\r\n");
        }


        private void button2_Click(object sender, EventArgs e)
        {

        }
        void ThreadSavDat(object o)
        {
            byte[] buf = o as byte[];  // 声明一个数组
            if (writefile != null && writefile.CanWrite)
            {
                writefile.Write(buf, 0, buf.Length);  // 数据写入内部缓冲区
            }
        }
        #region

        void RecMsg()
        {
            while (true)
            {
                byte[] arrClientRecMsg = new byte[1024 * 1024 * 2];
                int length = -1;
                try
                {

                    length = sockClient.Receive(arrClientRecMsg);
                    //实际接收到的有效字节数
                    if (length == 0)
                    {
                        break;
                    }
                    string strSRecMsg = Encoding.UTF8.GetString(arrClientRecMsg, 0, length);

                    if (chkbHexDisplay.CheckState == CheckState.Checked)  // 判定数据显示格式为十六进制
                    {
                        byte[] buf = new byte[length];  // 声明一个临时数组存储当前串口数据
                        ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadSavDat), buf);  // 将方法排入队列
                        BufferData.AddRange(buf);  // 串口数据写到自定义缓冲区,准备进行数据帧识别处理

                        string tempstr = string.Empty; // 声明一个没有分配空间的变量
                        for (int i = 0; i < length; i++)  // 遍历缓存数据
                        {
                            tempstr += arrClientRecMsg[i].ToString("X2") + " ";  // 拼接十六进制字符串
                        }
                        txtRec.AppendText("FromServer:" + GetCurrentTime() + "  " + tempstr + "\r\n");//追加到接收数据显示框中
                    }
                    else
                    {
                        txtRec.AppendText("FromServer:" + GetCurrentTime() + "  " + strSRecMsg + "\r\n");
                    }

                }
                catch { }

            }

        }
  #endregion
        private void button2_Click_1(object sender, EventArgs e)
        {
            string strSendMsg = null;
            if (sendcheckBox.CheckState == CheckState.Checked)
            {
                strSendMsg = sendMsg.Text.Trim() + "\r\n";
                ServerSendMsg(strSendMsg);
            }
            else
                ServerSendMsg(sendMsg.Text.Trim());

        }
        private void ServerSendMsg(string sendMsg)
        {
            //获取输入框输入的数据  SendHexcheckBox  sockClient.Send(buffer);
            byte[] arrSendMsg = Encoding.UTF8.GetBytes(sendMsg);

            //this.sendMsg.Text = "";

            if (SendHexcheckBox.CheckState == CheckState.Checked)  //判定数据显示格式为十六进制显示
            {
                try
                {
                    byte[] sendData = HexStringToByte(sendMsg);  // 将字符串转换成byte字符串放入数组
                    if (sendData == null)  // 判定发送的数据为空
                    {
                        MessageBox.Show("请输入数据", "提示");
                    }
                    else
                    {
                        for (int i = 0; i < sockets.Length; i++)
                        {
                            sockets[i].Send(sendData);
                        }


                        showMsg("[" + DateTime.Now + "]: " + "客户端发送:" + sendMsg);
                    }

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    MessageBox.Show("SendData请输入以“0x00”或“00”形式输入十六进制数", "错误");
                }
            }
            else  // 直接以字符形式发送 
            {
                try
                {
                    // if (checknewline2.CheckState == CheckState.Checked)  //判定数据显示格式为十六进制显示
                    {
                        //sockClient.Send(arrSendMsg);
                        for (int i = 0; i < sockets.Length; i++)
                        {
                            sockets[i].Send(arrSendMsg);
                        }
                        showMsg("[" + DateTime.Now + "]: " + "客户端发送:" + sendMsg);
                    }
                }
                catch (Exception ec)
                {
                    MessageBox.Show("错误1:SendData2" + ec.Message, "错误"); // 异常提示信息
                }
            }
        }
        private byte[] HexStringToByte(string InString)
        {
            InString = InString.Replace(" ", "");
            byte[] buffer = new byte[InString.Length / 2];
            for (int i = 0; i < InString.Length; i += 2)
                buffer[i / 2] = (byte)Convert.ToByte(InString.Substring(i, 2), 16);
            return buffer;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //socketarray
            Thread[] Threads;
            sockets = new Socket[int.Parse(txtPortNum.Text)];
            Threads = new Thread[int.Parse(txtPortNum.Text)];
            for (int i = 0; i < sockets.Length; i++)
            {
                sockets[i] = new Socket(
                AddressFamily.InterNetwork,
                SocketType.Stream,
                ProtocolType.Tcp);
                sockets[i].Bind(new IPEndPoint(IPAddress.Any, 0));
            }
            IPAddress ip = IPAddress.Parse(txtServer.Text);
            IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
            try
            {
                for (int i = 0; i < sockets.Length; i++)
                {
                    if (sockets[i].Connected)
                    {
                        //sockets[i].Close();
                        Thread.Sleep(100);
                    }
                    else
                    {
                        showMsg("[" + GetCurrentTime() +"]" +  "connecting.......  第" + i + "个客户端正在连接服务器!!!");
                        sockets[i].Connect(point);
                        showMsg("[" + GetCurrentTime() +"]" +  "success##########  第" + i + "个客户端连接服务器成功!!!");
                    }

                 }
            }
            catch 
            {
                MessageBox.Show("TCP连接失败,目标主机拒绝连接");
               
                
            }


            showMsg(txtPortNum.Text.ToString()+"个客户端都与服务器连接成功!!!");
            for (int i = 0; i < Threads.Length; i++)
            {
                Threads[i] = new Thread(new ParameterizedThreadStart(RecMsg_transPara));
                Threads[i].IsBackground = true;
                Threads[i].Start(i);
                // Threads[i] = new Thread(()=> RecMsg_transPara(i));
                //Threads[i].IsBackground = true;
                //Threads[i].Start();
            }

            if (checkBoxHeartBeat.CheckState == CheckState.Checked)
            {
                timer1.Enabled = true;
                timer1.Interval = 10000; //执行间隔时间,单位为毫秒; 这里实际间隔为10s  
                timer1.Start();
                sendHeartBeat();
            }
            if (checkBoxReset.CheckState == CheckState.Checked)
            {
                timer1.Enabled = true;
                timer1.Interval = 10000; //执行间隔时间,单位为毫秒; 这里实际间隔为10s  
                timer1.Start();
                SendResetEvernt();
            }
            if (checkBoxFireEvent.CheckState == CheckState.Checked)
            {
                timer2.Enabled = true;
                timer2.Interval = 30000; //执行间隔时间,单位为毫秒; 这里实际间隔为10s  
                timer2.Start();
               //SendFireEvernt();
            }

            //Thread.Sleep(100);
            //sendHeartBeat();
            //Thread.Sleep(1000);
            //SendResetEvernt();

            //Thread.Sleep(1000);
            string strSaveIPPath = System.Windows.Forms.Application.StartupPath + "\\" + "ipSave.txt";
            StreamWriter Savefile = File.CreateText(strSaveIPPath);  // 文件写入流
            if (txtServer.Text != "")  // 接收数据文本区数据状态判定
            {
                //Savefile.WriteLine(DateTime.Now.ToString("yyyy/MM/dd  hh:mm:ss"));  // 保存文件当前写入时间
                Savefile.Write(txtServer.Text);            // 接收数据文本区的数据写入保存文件txtServer.Text = str;
            }
            Savefile.Close();

        }

        void RecMsg_transPara(object data)
        {
            if (data != null) 
            {
                int num = int.Parse(data.ToString());
                while (true)
                {
                    byte[] arrClientRecMsg = new byte[1024 * 1024 * 2];
                    int length = -1;
                    try
                    {

                        length = sockets[num].Receive(arrClientRecMsg);
                        //实际接收到的有效字节数
                        if (length == 0)
                        {
                            break;
                        }
                        string strSRecMsg = Encoding.UTF8.GetString(arrClientRecMsg, 0, length);

                        if (chkbHexDisplay.CheckState == CheckState.Checked)  // 判定数据显示格式为十六进制
                        {
                            byte[] buf = new byte[length];  // 声明一个临时数组存储当前串口数据
                            ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadSavDat), buf);  // 将方法排入队列
                            BufferData.AddRange(buf);  // 串口数据写到自定义缓冲区,准备进行数据帧识别处理

                            string tempstr = string.Empty; // 声明一个没有分配空间的变量
                            for (int i = 0; i < length; i++)  // 遍历缓存数据
                            {
                                tempstr += arrClientRecMsg[i].ToString("X2") + " ";  // 拼接十六进制字符串
                            }
                            txtRec.AppendText(GetCurrentTime() + "客户端" + num + "接收" + "\r\n" + tempstr + "\r\n");//追加到接收数据显示框中
                            SendAskPack(num);
                        }
                        else
                        {
                            txtRec.AppendText(GetCurrentTime() + "客户端" + num + "接收" + "\r\n" + strSRecMsg + "\r\n");
                        }

                    }
                    catch { }

                }
            }
            
        }
        DateTime GetCurrentTime()
        {
            DateTime currentTime = new DateTime();
            currentTime = DateTime.Now;
            return currentTime;
        }

        void sendHeartBeat()
        {
            sendMsg.Text = " ";
            byte[] hearbeat = { 0, 0, 0, 0 };
            hearbeat[0] = 0x41;
            hearbeat[1] = 0x04;
            hearbeat[2] = 0x00;
            hearbeat[3] = 0x00;
            for (int i = 0; i < sockets.Length; i++)
            {
                hearbeat[1] = (byte)(0x04 + i);
                try
                {
                    sockets[i].Send(hearbeat);
                    showMsg("\r\n" + "[" + DateTime.Now + "]: " + "心跳:从机号:" + hearbeat[1]);
                    for (int num = 0; num < hearbeat.Length; num++)
                    {
                        txtMsg.AppendText(hearbeat[num].ToString("X02") + " ");
                    }
                    Thread.Sleep(5);
                }
                catch
                {
                    showErrMsg("心跳操作:客户端"+i+"    "+"服务器已关闭");
                    sockets[i].Close();
                    timer1.Enabled = false;

                }

            }
        }
        static int addrRound = 0x00;//地址循环1-250
        static int LoopRound = 0x01;//回路循环1-2
        #region 火警事件
        void SendFireEvernt()
        {
            sendMsg.Text = " ";

            byte[] FireFrame = new byte[59];
            Int16 crcCheck = 0x00;
            //packHead_union  packHead
            FireFrame[0] = 0x21;
            FireFrame[1] = 0x00;
            FireFrame[2] = 0x00;
            FireFrame[3] = 0x00;
            //TimeParam_TypeDef  TimeParam
            FireFrame[4] = 0x14;    //year  
            FireFrame[5] = 0x00;    //month
            FireFrame[6] = 0x00;    //day
            FireFrame[7] = 0x00;    //hour
            FireFrame[8] = 0x00;    //minute
            FireFrame[9] = 0x00;    //second
            //u8 loop
            FireFrame[10] = 0x00;
            //u8 addr
            FireFrame[11] = 0x00;
            //u8 SensorType;
            FireFrame[12] = 0x0B;
            //u8 sensorstatus
            FireFrame[13] = 0x21;   
            //AreaData_TypeDef AreaData
            FireFrame[14] = 0x00;   //栋
            FireFrame[15] = 0x00;   //层
            FireFrame[16] = 0x00;   //防火区
            FireFrame[17] = 0x00;   //防烟区
            FireFrame[18] = 0x00;   //号
            //u8[38]  AreaData  -> SensorInfo[38]
            FireFrame[19] = 0x01;   //联动延时
            FireFrame[20] = 0x00;   //第1位:联动/手动启动
            FireFrame[21] = 0x00;   //第2-31位:10个汉字的位置信息
            FireFrame[22] = 0x00;
            FireFrame[23] = 0x00;
            FireFrame[24] = 0x00;
            FireFrame[25] = 0x00;
            FireFrame[26] = 0x00;
            FireFrame[27] = 0x00;
            FireFrame[28] = 0x00;
            FireFrame[29] = 0x00;
            FireFrame[30] = 0x00;
            FireFrame[31] = 0x00;
            FireFrame[32] = 0x00;
            FireFrame[33] = 0x00;
            FireFrame[34] = 0x00;
            FireFrame[35] = 0x00;
            FireFrame[36] = 0x00;
            FireFrame[37] = 0x00;
            FireFrame[38] = 0x00;
            FireFrame[39] = 0x00;
            FireFrame[40] = 0x00;
            FireFrame[41] = 0x00;
            FireFrame[42] = 0x00;
            FireFrame[43] = 0x00;
            FireFrame[44] = 0x00;
            FireFrame[45] = 0x00;
            FireFrame[46] = 0x00;
            FireFrame[47] = 0x00;
            FireFrame[48] = 0x00;
            FireFrame[49] = 0x00;
            FireFrame[50] = 0x00;
            FireFrame[51] = 0x00;
            FireFrame[52] = 0x00;
            FireFrame[53] = 0x00;
            FireFrame[54] = 0x00;
            FireFrame[55] = 0x00;
            FireFrame[56] = 0x00;
            //u16 CrcCheck
            FireFrame[57] = 0x00;
            FireFrame[58] = 0x00;
            if ((addrRound >=1) | (addrRound <=250))//
            {
                if (addrRound == 250)
                {
                    addrRound = 0;
                    if ((LoopRound >= 1) | (LoopRound <= 2))//
                    {
                        if (LoopRound == 2)
                        {
                            LoopRound = 0;
                        }
                        LoopRound = LoopRound + 1;
                    }
                }

            }
            addrRound = addrRound + 1;


            FireFrame[10] = (byte)LoopRound;
            FireFrame[11] = (byte)addrRound;
//showMsg(DateTime.Now.Month);
            for (int i = 0; i < sockets.Length; i++)
            {
                FireFrame[1] = (byte)(0x04 + i);

               // FireFrame[4] =(byte)((DateTime.Now.Year) & 0xF);//HexStringToByte
                FireFrame[5] = (byte)(DateTime.Now.Month);
                FireFrame[6] = (byte)(DateTime.Now.Day);
                FireFrame[7] = (byte)(DateTime.Now.Hour);
                FireFrame[8] = (byte)(DateTime.Now.Minute);
                FireFrame[9] = (byte)(DateTime.Now.Second);

                crcCheck = CRC16(FireFrame, FireFrame.Length - 2);
                //ResetFrame[18] = (byte)(crcCheck);
                //ResetFrame[19] = (byte)(crcCheck >> 8);
                FireFrame[57] = (byte)(crcCheck >> 8);
                FireFrame[58] = (byte)(crcCheck);
                // MessageBox.Show((ResetFrame.Length - 2).ToString());
                //showMsg(ResetFrame);
                try
                {
                    sockets[i].Send(FireFrame);
                    showMsg("\r\n"+"[" + DateTime.Now + "]: " + "设备号:" + FireFrame[1] + "回路号" + FireFrame[10] + "地址号" + FireFrame[11]);
                    for (int num = 0; num < FireFrame.Length; num++)
                    {
                        txtMsg.AppendText( FireFrame[num].ToString("X02") +" ");
                    }
                    //showMsg("[" + DateTime.Now + "]: " + "设备号:"+ FireFrame[1] +"回路号"+ FireFrame[10]+ "地址号"+FireFrame[11] +"\r\n"+ sendMsg);
                    Thread.Sleep(5);
                }
                catch
                {
                    //MessageBox.Show("客户端" + i + "    " + "服务器已关闭");
                    showErrMsg("火警操作:客户端" + i + "    " + "服务器已关闭");
                    sockets[i].Close();
                    timer1.Enabled = false;

                }

            }
        }
        #endregion
        #region  复位事件
        void SendResetEvernt()
        {
            sendMsg.Text = " ";
            byte[] ResetFrame = new byte[20];
            Int16 crcCheck = 0x00;
            //packHead_unio packHead
            ResetFrame[0] = 0x31;
            ResetFrame[1] = 0x00;
            ResetFrame[2] = 0x00;
            ResetFrame[3] = 0x00;
            //u16 OPRTTYPE 
            ResetFrame[4] = 0x02;   //复位操作
            ResetFrame[5] = 0x00;
            //TimeParam_TypeDef TimeParam
            ResetFrame[6] = 0x00;
            ResetFrame[7] = 0x00;
            ResetFrame[8] = 0x00;
            ResetFrame[9] = 0x00;
            ResetFrame[10] = 0x00;
            ResetFrame[11] = 0x00;
            //u8 Data_2[6]
            ResetFrame[12] = 0x00;
            ResetFrame[13] = 0x00;
            ResetFrame[14] = 0x00;
            ResetFrame[15] = 0x00;
            ResetFrame[16] = 0x00;
            ResetFrame[17] = 0x00;
            //u16 CrcCheck
            ResetFrame[18] = 0x00;
            ResetFrame[19] = 0x00;
            for (int i = 0; i < sockets.Length; i++)
            {
                ResetFrame[1] = (byte)(0x04 + i);
                crcCheck = CRC16(ResetFrame, ResetFrame.Length-2);

                //ResetFrame[18] = (byte)(crcCheck);
                //ResetFrame[19] = (byte)(crcCheck >> 8);
                ResetFrame[18] = (byte)(crcCheck >> 8);
                ResetFrame[19] = (byte)(crcCheck);
                
                // MessageBox.Show((ResetFrame.Length - 2).ToString());
                //showMsg(ResetFrame);
                try
                {
                    sockets[i].Send(ResetFrame);
                    showMsg("\r\n" + "[" + DateTime.Now + "]: " + "复位:从机号:" + ResetFrame[1]);
                    for (int num = 0; num < ResetFrame.Length; num++)
                    {
                        txtMsg.AppendText(ResetFrame[num].ToString("X02") + " ");
                    }
                    Thread.Sleep(5);
                }
                catch
                {
                    //MessageBox.Show("客户端" + i + "    " + "服务器已关闭");
                    showErrMsg("复位操作:客户端" + i + "    " + "服务器已关闭");
                    sockets[i].Close();
                    timer1.Enabled = false;

                }

            }
        }
        #endregion
        private void timer1_Tick(object sender, EventArgs e)
        {
            
            if (checkBoxHeartBeat.CheckState == CheckState.Checked)
            {
                sendHeartBeat();
            }
            if (checkBoxReset.CheckState == CheckState.Checked)
            {
                SendResetEvernt();
            }

        }

        private void btnClrRcv2_Click(object sender, EventArgs e)
        {
            txtRec.Text = string.Empty;  // 清除数据接收区(Empty为不分配存储空间)
        }

        private void btnSave2_Click(object sender, EventArgs e)
        {
            string sSavePath = txtbSavePath0.Text + @"\DataSave0.txt";  // 声明数据保存格式及保存路径
            try
            {
                StreamWriter Savefile = File.CreateText(sSavePath);  // 文件写入流
                if (txtRec.Text != "")  // 接收数据文本区数据状态判定
                {
                    Savefile.WriteLine(DateTime.Now.ToString("yyyy/MM/dd  hh:mm:ss"));  // 保存文件当前写入时间
                    Savefile.WriteLine(txtRec.Text);            // 接收数据文本区的数据写入保存文件
                }
                Savefile.Close();
            }
            catch (Exception ec)
            {
                MessageBox.Show("错误:保存按钮" + ec.Message, "错误");
            }
        }
        #region CRC校验
        /// <summary>
        /// CRC高位校验码checkCRCHigh
        /// </summary>
        static byte[] ArrayCRCHigh =
        {
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
        0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
        0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
        0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
        0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
        0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
        0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
        0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
        0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
        0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
        0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
        };

        /// <summary>
        /// CRC地位校验码checkCRCLow
        /// </summary>
        static byte[] checkCRCLow =
        {
        0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,
        0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
        0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,
        0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
        0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
        0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
        0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
        0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
        0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
        0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
        0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
        0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
        0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
        0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
        0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
        0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
        0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
        0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
        0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
        0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
        0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
        0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
        0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
        0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
        0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
        0x43, 0x83, 0x41, 0x81, 0x80, 0x40
        };
        /// <summary>
        /// CRC校验
        /// </summary>
        /// <param name="data">校验的字节数组</param>
        /// <param name="length">校验的数组长度</param>
        /// <returns>该字节数组的奇偶校验字节</returns>
        public static Int16 CRC16(byte[] data, int arrayLength)
        {
            byte CRCHigh = 0xFF;
            byte CRCLow = 0xFF;
            byte index;
            int i = 0;
            while (arrayLength-- > 0)
            {
                index = (System.Byte)(CRCHigh ^ data[i++]);
                CRCHigh = (System.Byte)(CRCLow ^ ArrayCRCHigh[index]);
                CRCLow = checkCRCLow[index];
            }

            return (Int16)(CRCHigh << 8 | CRCLow);
        }
        #endregion

        private void button3_Click(object sender, EventArgs e)
        {
            SendResetEvernt();
        }

        private void button4_Click(object sender, EventArgs e)
        {
            SendFireEvernt();
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            if (checkBoxFireEvent.CheckState == CheckState.Checked)
            {
                SendFireEvernt();
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            for (int i = 0; i < sockets.Length; i++)
            {
                if (sockets[i].Connected)
                {
                    sockets[i].Close();
                    Thread.Sleep(100);
                }
            }

          }
        string sSavePath = null;
        private void button8_Click(object sender, EventArgs e)
        {

            //SaveFileDialog saveDlg = new SaveFileDialog();
            //saveDlg.Filter = "文本(*.txt)|*.txt;|Excle(*.xls)|*.xls";
            //if (saveDlg.ShowDialog() == DialogResult.OK)
            //{
            //    FileStream fs1 = new FileStream(saveDlg.FileName, FileMode.Create, FileAccess.Write);

            //    fs1.Close();
            //}
            //string sSavePath = saveDlg.FileName;
            //string sSavePath = txtbSavePath1.Text + @"\操作框数据DataSave0.txt";  // 声明数据保存格式及保存路径 操作框数据
            // string sSavePath = txtbSavePath0.Text + System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "操作框.txt";
            if (sSavePath!=null)
            {
                try
                {
                    StreamWriter Savefile = File.CreateText(sSavePath);  // 文件写入流
                    if (txtMsg.Text != "")  // 接收数据文本区数据状态判定
                    {
                        //Savefile.WriteLine(DateTime.Now.ToString("yyyy/MM/dd  hh:mm:ss"));  // 保存文件当前写入时间
                        Savefile.WriteLine(txtMsg.Text);            // 接收数据文本区的数据写入保存文件
                    }
                    Savefile.Close();
                }
                catch (Exception ec)
                {
                    MessageBox.Show("错误:保存按钮" + ec.Message, "错误");
                }
            }
            else
            {
                MessageBox.Show("请选择保存的文件路径和文件名");
            }
           


        }

        private void button6_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveDlg = new SaveFileDialog();
            saveDlg.Filter = "文本(*.txt)|*.txt;|Excle(*.xls)|*.xls";
            if (saveDlg.ShowDialog() == DialogResult.OK)
            {
                FileStream fs1 = new FileStream(saveDlg.FileName, FileMode.Create, FileAccess.Write);

                fs1.Close();
            }
            sSavePath = saveDlg.FileName;
            txtbSavePath1.Text = saveDlg.FileName;
        }

        private void cleartxtErrBTN_Click(object sender, EventArgs e)
        {
            txtErr.Text = string.Empty;  // 清除数据接收区(Empty为不分配存储空间)
        }

        private void button7_Click(object sender, EventArgs e)
        {
            txtMsg.Text = string.Empty;  // 清除数据接收区(Empty为不分配存储空间)
        }

        private void checkBoxHeartBeat_CheckedChanged(object sender, EventArgs e)
        {

        }

        private void button9_Click(object sender, EventArgs e)
        {
            string strStartupPath = System.Windows.Forms.Application.StartupPath; //+ @"../../"
            //System.IO.Directory.SetCurrentDirectory(path);
            string pathsave = strStartupPath + "\\" + "1.txt"; //项目名称
            //string strFilePath = System.IO.Directory.GetCurrentDirectory() + @"\txt\1.txt";

            StreamWriter Savefile = File.CreateText(pathsave);  // 文件写入流
            if (txtErr.Text != "")  // 接收数据文本区数据状态判定
            {
                //Savefile.WriteLine(DateTime.Now.ToString("yyyy/MM/dd  hh:mm:ss"));  // 保存文件当前写入时间
                Savefile.WriteLine(txtErr.Text);            // 接收数据文本区的数据写入保存文件
            }
            Savefile.Close();
        }

        private void button9_Click_1(object sender, EventArgs e)
        {
            string strPath = System.Windows.Forms.Application.StartupPath + "\\" + "ipSave.txt";
            //string pathsave = strStartupPath + "\\" + "1.txt"; //项目名称
            string str = File.ReadAllText(strPath);
            txtErr.Text = str;
        }
        void SendAskPack(int clintNum)
        {
            int now_clintNum = clintNum + 4;
            sendMsg.Text = " ";
            byte[] AskPack = new byte[6];
            byte PackSerial = 0x01;
            byte PackType = 0x05;
            byte MId = (byte)(now_clintNum & 0x7F);
            byte Model_2 = 0x01;
            byte Model_1 = 0x01;

            AskPack[0] = (byte)(PackSerial|(PackType<<4));
            AskPack[1] = (byte)(MId | (Model_2<<7));
            AskPack[2] = (byte)(Model_1 | (0x00<<7));
            AskPack[3] = 0x00;
            AskPack[4] = MId;
            AskPack[5] = 0x00;

            
                try
                {
                    sockets[clintNum].Send(AskPack);
                    showMsg("\r\n" + "[" + DateTime.Now + "]: " + "应答:从机号:" + MId);
                    for (int num = 0; num < AskPack.Length; num++)
                    {
                        txtMsg.AppendText(AskPack[num].ToString("X02") + " ");
                    }
                   // Thread.Sleep(5);
                }
                catch
                {
                    //MessageBox.Show("客户端" + i + "    " + "服务器已关闭");
                    showErrMsg("应答操作:客户端" + clintNum + "    " + "服务器已关闭");
                    sockets[clintNum].Close();
                    timer1.Enabled = false;

                }           
        }
    }
}
 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值