using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using HDL_ON.Entity;
namespace HDL_ON
{
public class Packet
{
///
/// 缓冲区大小
///
public const int Size = 1024 + 200;
///
/// 接收到的数据
///
public byte [] Bytes;
///
/// 远程的套接字
///
public System.Net.EndPoint RemoteEndPoint;
public Packet ()
{
this.Bytes = new byte [Size];
RemoteEndPoint = (System.Net.EndPoint)new System.Net.IPEndPoint (System.Net.IPAddress.Any, 0);
}
public Packet (byte [] data, System.Net.EndPoint remoteEndPoint)
{
this.Bytes = data;
this.RemoteEndPoint = remoteEndPoint;
}
///
/// 记录已经发送数据出去的时间
///
public System.DateTime FlagDateTime;
///
/// 已经发送了多少数
///
public int HaveSendCount;
public delegate void DelegateReceive (byte subnetID, byte deviceID, Command command, byte [] usefullBytes, string revGatewayIP);
public static event DelegateReceive ReceiveEvent;
///
/// 接收到的所有数据
///
public static Action ReceviceAllDadaAction;
///
/// 处理接收到的数据
///
public virtual void Manager ()
{
//对于操作数据库的时间比较长的,可以创建另一个线程处理
if (!"HDLMIRACLE".Equals (System.Text.Encoding.ASCII.GetString (Bytes, 4, 10))) {
return;
}
byte subnetID = this.Bytes [17]; //源子网号
byte deviceID = this.Bytes [18]; //源设备号
//源设备类型
int deviceType = this.Bytes [19] * 256 + this.Bytes [20];
Command command = (Command)(Bytes [21] * 256 + Bytes [22]); //操作码控制命令
byte targetSubnetID = this.Bytes [23];
byte targetDeviceID = this.Bytes [24];
//不是要接收的指令就返回
if (!((targetSubnetID == 252 && targetDeviceID == 252) || (targetSubnetID == 0xff && targetDeviceID == 0xff))) {
return;
}
byte [] usefulBytes = null;
if (this.Bytes [16] == 0xFF) {
usefulBytes = new byte [Bytes.Length - 16 - 11];
System.Array.Copy (Bytes, 27, usefulBytes, 0, usefulBytes.Length);
} else {
//有用的附加数据
usefulBytes = new byte [this.Bytes [16] - 11];
Array.Copy (Bytes, 25, usefulBytes, 0, usefulBytes.Length);
}
if (ReceiveEvent != null) {
ReceiveEvent (subnetID, deviceID, command, usefulBytes, $"{Bytes [0]}.{Bytes [1]}.{Bytes [2]}.{Bytes [3]}");
}
//if (command == Command.SuperGatewayAgentACK) {
// SuperGateWay.SendAndReceiveDatas.Recevice (subnetID, deviceID, usefulBytes);
//}
if (ReceviceAllDadaAction != null) {
ReceviceAllDadaAction (subnetID, deviceID, deviceType, command, targetSubnetID, targetDeviceID, usefulBytes, (System.Net.IPEndPoint)RemoteEndPoint);
}
//处理是否要重发数据
Control.ManagerReceive (subnetID, deviceID, command, targetSubnetID, targetDeviceID, usefulBytes, RemoteEndPoint);
}
}
}