根据对通讯协议的抓包模拟回复内容

This commit is contained in:
zhengxuan.zhang
2024-02-22 11:12:44 +08:00
parent c16c4b0fb3
commit cee64af0af
4 changed files with 117 additions and 88 deletions
+41 -24
View File
@@ -27,12 +27,12 @@ namespace HexcalMC.Hexcal
private readonly Dictionary<string, Socket> _dictSocket = new Dictionary<string, Socket>();
private readonly Dictionary<string, Thread> _dictThread = new Dictionary<string, Thread>();
private Socket _mWatchSocket;
private Thread _mWatchThread; // 负责监听客户端连接请求的线程;
private readonly string _strServerIp = "127.0.0.1"; //服务器的IP地址
private readonly string _strServerPort = "8080"; //端口号
private Socket _mWatchSocket;
private Thread _mWatchThread; // 负责监听客户端连接请求的线程;
/// <summary>
/// 使用模式,默认=1,接收任意数据显示;2=前两个字节为数据长度
@@ -134,7 +134,7 @@ namespace HexcalMC.Hexcal
{
if (_dictSocket.Values.ToArray()[i].Poll(10, SelectMode.SelectRead))
{
//DictSocket.Remove(DictSocket.Keys.ToArray()[i]);
RemoveSocketClient(_dictSocket.Keys.ToArray()[i]);
}
}
@@ -159,6 +159,12 @@ namespace HexcalMC.Hexcal
}
}
public event EventHandler<byte[]> DataReceived;
protected virtual void OnDataReceivedByte(byte[] data)
{
// 触发事件
DataReceived?.Invoke(this, data);
}
//接收线程
private void ReceiveThread(object sokObj)
{
@@ -188,28 +194,39 @@ namespace HexcalMC.Hexcal
try
{
if (UseMode == 1)
switch (UseMode)
{
if (length > 0)
{
// TcpIpDfn.SongLiang_arrMsgRec = arrMsgRec; //510
string strData = Encoding.Default.GetString(arrMsgRec); // 将接受到的字节数据转化成字符串;
//strData = strData.Substring(0, length);
//RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData.Replace("\0", "<0>"));
RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData.Replace("\0", "."));
}
}
else if (UseMode == 2)
{
if (length > 0 && arrMsgRec.Length > 2)
{
// TcpIpDfn.SongLiang_arrMsgRec = arrMsgRec; //510
string strData =
Encoding.Default.GetString(arrMsgRec, 2,
arrMsgRec.Length - 2); // 将接受到的字节数据转化成字符串;
case 1:
if (length > 0)
{
string strData = Encoding.Default.GetString(arrMsgRec); // 将接受到的字节数据转化成字符串;
//strData = strData.Substring(0, length);
//RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData.Replace("\0", "<0>"));
RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData.Replace("\0", "."));
}
RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData);
}
;
break;
case 2:
if (length > 0 && arrMsgRec.Length > 2)
{
string strData =
Encoding.Default.GetString(arrMsgRec, 2,
arrMsgRec.Length - 2); // 将接受到的字节数据转化成字符串;
RaisedMessage(sokClient.RemoteEndPoint.ToString(), strData);
}
break;
case 3:
if (length > 0)
{
OnDataReceivedByte(arrMsgRec);
}
break;
}
}
catch (Exception ex)
+76 -64
View File
@@ -1,6 +1,7 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Windows.Forms;
using ACS.SPiiPlusNET;
using HexcalMC.Base;
@@ -98,6 +99,7 @@ namespace HexcalMC
{
//启动服务器,并获取数据,解析
_mTcpIpServer = new TcpIpServer("100.0.0.1", Convert.ToString(1234));
_mTcpIpServer.UseMode = 1; //
try
{
//启动监听
@@ -106,6 +108,7 @@ namespace HexcalMC
//绑定两个事件 OnRaisedStatus 和OnRaisedMessage
_mTcpIpServer.OnRaisedMessage += ReceiveMessage;
_mTcpIpServer.OnRaisedStatus += ReceiveStatus;
_mTcpIpServer.DataReceived += ReceiveByte;
DebugDfn.AddLogText("TCP服务端启动成功 ");
}
else
@@ -119,156 +122,164 @@ namespace HexcalMC
}
}
private void ReceiveByte(object sender, byte[] e)
{
DebugDfn.AddLogText("接收到" + BitConverter.ToString(e));
}
private void ReceiveMessage(string clientIp, string msg) //接收的内容
{
//打印ClientIP 和 Msg
DebugDfn.AddLogText("接收到" + clientIp + ": " + msg);
//根据源地址的不同,执行不同处理
//如果 ClientIP 来自L2系统的话,执行解析
switch (clientIp)
string sourceIp = clientIp.Split(':')[0];
switch (sourceIp)
{
case "172.19.153.80": //L2系统
case "100.0.0.1": //L2系统
//解析处理数据
ParseHexcalPacket(msg);
break;
case "127.0.0.1": //模拟长宽系统
break;
}
}
private void ParseHexcalPacket(string msg) //编写一个Hexcal协议解析函数
{
//根据不同的指令进行解析,3个层次,不合法,故障,最后是正常
//判断Msg的长度,如果不是指定长度,直接返回
if (msg.Length != 8) return;
DebugDfn.AddLogText("正在解析" + msg);
//判断是否含有故障ERROR字样
if (msg.Contains("ERROR")) return;
//指令解析
//去除Msg中\r\n
msg = msg.Replace("\r\n", "");
string[] tokens = msg.Split(',');
foreach (string token in tokens)
if (msg.Contains("\x02") || msg.Contains("\u0002"))
{
Console.WriteLine(token);
// 发送 "READY" 字符串作为响应
byte[] response = Encoding.ASCII.GetBytes("READY");
SendMsgToHexcal("READY");
}
//可能涉及到 将指令提取并单独处理的问题
if (string.Equals("CMMTYP", msg))
if (msg.Contains("\x03") || msg.Contains("\u0003"))
{
// 发送 "READY" 字符串作为响应
byte[] response = Encoding.ASCII.GetBytes("READY");
SendMsgToHexcal("READY");
}
else if (msg.Contains("CMMTYP"))
{
SendMsgToHexcal("CMMTYP MA 19617, FDC V15.00, 6 6 2 , 0");
}
else if (string.Equals("VERSION", msg)) //版本号
else if (msg.Contains("VERSION")) //版本号
{
SendMsgToHexcal("00-000-000-00000 FDC V51.04.0000 DATE: 12/21/22 TIME: 12:50:55");
}
else if (string.Equals("^B", msg)) //查询状态
else if (msg.Contains("^B")) //查询状态, READY或BUSY
{
//todo 启动指令
SendMsgToHexcal("READY");
}
else if (string.Equals("SHOW MAXSTROKESW", msg)) //最大行程
else if (msg.Contains("SHOW MAXSTROKESW")) //最大行程
{
SendMsgToHexcal("MAXSTROKESW 233.200000,346.500000,15.100000,0.000000,0.000000,0.000000,0.000000");
}
else if (string.Equals("00000003", msg)) //最小行程
else if (msg.Contains("SHOW MINSTROKESW")) //最小行程
{
SendMsgToHexcal("MINSTROKESW -68.800000,-55.500000,-286.900000,0.000000,0.000000,0.000000,0.000000");
}
else if (string.Equals("SHOW MAXVEL", msg)) //最大速度
else if (msg.Contains("SHOW MAXVEL")) //最大速度
{
SendMsgToHexcal("MAXVEL 300.000000,300.000000,300.000000,0.000000,0.000000,0.000000,0.000000,0.000000");
}
else if (string.Equals("SHOW MAXACC", msg)) //最大加速度
else if (msg.Contains("SHOW MAXACC")) //最大加速度
{
SendMsgToHexcal(
"MAXACC 300.000000,300.000000,300.000000,0.000000,0.000000,0.000000,0.000000,0.000000");
}
else if (string.Equals("SHOW TEMPCOMPTYPE", msg)) //温度补偿,温度补偿 >1 表示支持温度补偿
else if (msg.Contains("SHOW TEMPCOMPTYPE")) //温度补偿,温度补偿 >1 表示支持温度补偿
{
SendMsgToHexcal("TEMPCOMPTYPE 1");
}
else if (string.Equals("READTP", msg))
else if (msg.Contains("READTP"))
{
SendMsgToHexcal("READTP 0.000000");
}
else if (string.Equals("SHOW SENSWKP", msg))
else if (msg.Contains("SHOW SENSWKP"))
{
SendMsgToHexcal("X_ SENSWKP 4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");
}
else if (string.Equals("SHOW X_SENSAXIS", msg))
else if (msg.Contains("SHOW X_SENSAXIS"))
{
SendMsgToHexcal("X_SENSAXIS 6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");
}
else if (string.Equals("SHOW Y_SENSAXIS", msg))
else if (msg.Contains("SHOW Y_SENSAXIS")) //查询Y轴行程
{
SendMsgToHexcal("Y_SENSAXIS 2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");
}
else if (string.Equals("SHOW Z_SENSAXIS", msg))
else if (msg.Contains("SHOW Z_SENSAXIS")) //查询Z轴行程
{
SendMsgToHexcal("Z_SENSAXIS 7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0");
}
else if (string.Equals("SHOW MOVPAR", msg)) //获取速度
else if (msg.Contains("SHOW ESTOP")) //查询急停状态
{
SendMsgToHexcal("ESTOP FALSE");
}
else if (msg.Contains("CMHWST"))
{
SendMsgToHexcal("CMHWST 8257,0,1792,0");
}
else if (msg.Contains("SHOW MOVPAR")) //查询速度
{
SendMsgToHexcal(
"MOVPAR 300.000000,300.000000,300.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.00000 0,0.000000");
}
else if (string.Equals("MOVPAR 300.0,300.0,300.0,0.0,0.0,0.0", msg)) //设置速度 xyz 轴的速度
{
SendMsgToHexcal("%");
}
else if (string.Equals("SHOW MAXVEL", msg))
else if (msg.Contains("SHOW MAXVEL")) //查询最大速度
{
SendMsgToHexcal("MAXVEL 300.000000,300.000000,300.000000,0.000000,0.000000,0.000000,0.000000,0.000000");
}
else if (string.Equals("SHOW ACCEL", msg)) //获取加速
else if (msg.Contains("SHOW ACCEL")) //查询加速
{
SendMsgToHexcal(
"ACCEL 1000.000000,1000.000000,1000.000000,0.000000,0.000000,0.000000,0.000000,0.000000");
}
else if (string.Equals("ACCEL 1000.0,1000.0,1000.0", msg)) //设置加速度
else if (msg.Contains("MOVPAR 300.0,300.0,300.0,0.0,0.0,0.0")) //设置速度 xyz 轴的速度
{
SendMsgToHexcal("%");
}
else if (string.Equals(
"PRBPIN 0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000,0.000000,0.000000,0.000000,0.000000,0.000000, 0.000000",
msg))
else if (msg.Contains("ACCEL")) //设置加速度
{
SendMsgToHexcal("%");
}
else if (string.Equals("ENABLE TEMP", msg))
{
SendMsgToHexcal("");
}
else if (string.Equals("WKPPAR 20,0.0000115,20", msg))
{
SendMsgToHexcal("");
}
else if (string.Equals("SCLTMP", msg))
{
SendMsgToHexcal("");
}
else if (string.Equals("MOVABS 167.553848,-55.400002,-208.548203,0.000000", msg)) //移动指令
else if (msg.Contains("PRBPIN")) //设置侧头偏置
{
SendMsgToHexcal("%");
}
else if (string.Equals("GETPOS", msg)) //获取位置
else if (msg.Contains("ENABLE TEMP")) //设置温度补偿
{
SendMsgToHexcal("%");
}
else if (msg.Contains("WKPPAR"))
{
SendMsgToHexcal("%");
}
else if (msg.Contains("SCLTMP"))
{
SendMsgToHexcal("%");
}
else if (msg.Contains("MOVABS")) //移动指令
{
SendMsgToHexcal("%");
}
else if (msg.Contains("GETPOS")) //获取位置
{
SendMsgToHexcal("POS 167.553898,-55.400421,-208.548678,0.000000,0.000000,0.000000,0.000000");
}
else if (string.Equals("SHOW ESTOP", msg))
{
SendMsgToHexcal("ESTOP FALSE");
}
else if (string.Equals("", msg))
{
}
//todo 未知指令
}
private void ReceiveStatus(TcpIpServer.EnumTcpIpServer iType, string msg)
@@ -280,7 +291,8 @@ namespace HexcalMC
private void SendMsgToHexcal(string msg)
{
//发送数据
_mTcpIpServer.SendMessageToAllClients(msg);
DebugDfn.AddLogText("回复" + msg);
_mTcpIpServer.SendMessageToAllClients(msg += "\r\n");
}
#endregion hexcal软件相关
Binary file not shown.
Binary file not shown.