wxr
2020-06-08 b71dfb3ca100340005d56e1298292807da82322d
HDL_ON/DriverLayer/Packet.cs
@@ -16,19 +16,19 @@
        /// <summary>
        /// 接收到的数据
        /// </summary>
        public byte [] Bytes;
        public byte[] Bytes;
        /// <summary>
        /// 远程的套接字
        /// </summary>
        public System.Net.EndPoint RemoteEndPoint;
        public Packet ()
        public Packet()
        {
            this.Bytes = new byte [Size];
            RemoteEndPoint = (System.Net.EndPoint)new System.Net.IPEndPoint (System.Net.IPAddress.Any, 0);
            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)
        public Packet(byte[] data, System.Net.EndPoint remoteEndPoint)
        {
            this.Bytes = data;
            this.RemoteEndPoint = remoteEndPoint;
@@ -44,60 +44,80 @@
        /// </summary>
        public int HaveSendCount;
        public delegate void DelegateReceive (byte subnetID, byte deviceID, Command command, byte [] usefullBytes, string revGatewayIP);
        public delegate void DelegateReceive(byte subnetID, byte deviceID, Command command, byte[] usefullBytes, string revGatewayIP);
        public static event DelegateReceive ReceiveEvent;
        /// <summary>
        /// 接收到的所有数据
        /// </summary>
        public static Action<byte, byte, int, Command, byte, byte, byte [], System.Net.IPEndPoint> ReceviceAllDadaAction;
        public static Action<byte, byte, int, Command, byte, byte, byte[], System.Net.IPEndPoint> ReceviceAllDadaAction;
        /// <summary>
        /// 处理接收到的数据
        /// </summary>
        public virtual void Manager ()
        public virtual void Manager()
        {
            //对于操作数据库的时间比较长的,可以创建另一个线程处理
            if (!"HDLMIRACLE".Equals (System.Text.Encoding.ASCII.GetString (Bytes, 4, 10))) {
                return;
            if (((System.Net.IPEndPoint)RemoteEndPoint).Port == 6688)
            {
                ReceviceAllDadaAction?.Invoke(0, 0, 0, 0, 0, 0, Bytes, (System.Net.IPEndPoint)RemoteEndPoint);
                Control.ManagerReceive(0, 0, 0, 0, 0, Bytes, (System.Net.IPEndPoint)RemoteEndPoint);
            }
            else
            {
                //对于操作数据库的时间比较长的,可以创建另一个线程处理
                if (!"HDLMIRACLE".Equals(System.Text.Encoding.ASCII.GetString(Bytes, 4, 10)))
                {
                    return;
                }
            byte subnetID = this.Bytes [17]; //源子网号
            byte deviceID = this.Bytes [18]; //源设备号
                byte subnetID = this.Bytes[17]; //源子网号
                byte deviceID = this.Bytes[18]; //源设备号
            //源设备类型
            int deviceType = this.Bytes [19] * 256 + this.Bytes [20];
                //源设备类型
                int deviceType = this.Bytes[19] * 256 + this.Bytes[20];
            Command command = (Command)(Bytes [21] * 256 + Bytes [22]); //操作码控制命令
                Command command = (Command)(Bytes[21] * 256 + Bytes[22]); //操作码控制命令
            byte targetSubnetID = this.Bytes [23];
            byte targetDeviceID = this.Bytes [24];
                byte targetSubnetID = this.Bytes[23];
                byte targetDeviceID = this.Bytes[24];
            //不是要接收的指令就返回
            if (!((targetSubnetID == 252 && targetDeviceID == 252) || (targetSubnetID == 0xff && targetDeviceID == 0xff))) {
                return;
                //不是要接收的指令就返回
                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)
                {
                    string revIp = $"{Bytes[0]}.{Bytes[1]}.{Bytes[2]}.{Bytes[3]}";
                    if (revIp == "172.16.2.237")
                    {
                    }
                    ReceiveEvent(subnetID, deviceID, command, usefulBytes, revIp);
                }
                //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);
            }
            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);
        }
    }
}