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;
}
}
}
}