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