You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
2.7 KiB

using System.Text;
namespace JiLinApp.Docking.VibrateAlarm;
public class DataMessage
{
private byte HeadA = 0xAA;
private byte HeadB = 0xAA; //(1)帧头
public int DeviceId { get; set; } //(2)设备ID
public string SendIp { get; set; } //(3)原地址
public int SendPort { get; set; }//(3)原地址
public string ReceiveIp { get; set; }//(4)目标地址
public int ReceivePort { get; set; }//(4)目标地址
public byte FrameNum { get; set; }//(5)帧编号
public byte FunctionNum { get; set; }//(6)功能码
public byte DataLen { get; set; }//(7)传输数据长度
public byte[] Data { get; set; }//(8)传输数据
public byte CRC { get; set; }//(9)CRC8
public void Decode(byte[] bytes)
{
DeviceId = bytes[2];
SendIp = bytes[3].ToString() + "." + bytes[4].ToString() + "." + bytes[5].ToString() + "." + bytes[6].ToString();
SendPort = bytes[8] * 256 + bytes[7];
ReceiveIp = bytes[9].ToString() + "." + bytes[10].ToString() + "." + bytes[11].ToString() + "." + bytes[12].ToString();
ReceivePort = bytes[14] * 256 + bytes[13];
FrameNum = bytes[15];
FunctionNum = bytes[16];
DataLen = bytes[17];
Data = new byte[DataLen];
for (int i = 0; i < DataLen; i++)
{
Data[i] = bytes[18 + i];
}
CRC = bytes[18 + DataLen];
}
public byte[] Encode()
{
byte[] bytes = new byte[19 + DataLen];
bytes[0] = bytes[1] = 0xAA;
bytes[2] = (byte)DeviceId;
string[] strs = SendIp.Split('.');
bytes[3] = byte.Parse(strs[0]);
bytes[4] = byte.Parse(strs[1]);
bytes[5] = byte.Parse(strs[2]);
bytes[6] = byte.Parse(strs[3]);
bytes[7] = (byte)(SendPort % 256);
bytes[8] = (byte)(SendPort / 256);
string[] strs2 = ReceiveIp.Split('.');
bytes[9] = byte.Parse(strs2[0]);
bytes[10] = byte.Parse(strs2[1]);
bytes[11] = byte.Parse(strs2[2]);
bytes[12] = byte.Parse(strs2[3]);
bytes[13] = (byte)(ReceivePort % 256);
bytes[14] = (byte)(ReceivePort / 256);
bytes[15] = FrameNum;
bytes[16] = FunctionNum;
bytes[17] = DataLen;
for (int i = 0; i < DataLen; i++)
{
bytes[18 + i] = Data[i];
}
bytes[bytes.Length - 1] = CRC8.CRC(bytes, 0, bytes.Length - 1);
return bytes;
}
public static string ToHexString(byte[] bytes)
{
if (bytes == null) return string.Empty;
StringBuilder builder = new();
for (int i = 0; i < bytes.Length; i++)
{
builder.Append(bytes[i].ToString("X2") + " ");
}
return builder.ToString();
}
}