using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Shared { 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, int deviceType, System.Net.IPEndPoint remoteIp); public static event DelegateReceive ReceiveEvent; /// /// 接收到的所有数据 /// public static Action ReceviceAllDadaAction; /// /// 处理接收到的数据 /// public virtual void Manager () { //对于操作数据库的时间比较长的,可以创建另一个线程处理 var str = System.Text.Encoding.ASCII.GetString (Bytes, 4, 10); if (!"HDLMIRACLE".Equals (str)) { 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 == Global.LocalSubnetID && targetDeviceID == Global.LocalDeviceID) || (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) { try { ReceiveEvent (subnetID, deviceID, command, usefulBytes, deviceType,(System.Net.IPEndPoint)RemoteEndPoint); } catch (Exception ex) { Console.WriteLine (ex.Message); } } if (ReceviceAllDadaAction != null) { ReceviceAllDadaAction (subnetID, deviceID, deviceType, command, targetSubnetID, targetDeviceID, usefulBytes, (System.Net.IPEndPoint)RemoteEndPoint); } //处理是否要重发数据 Control.ManagerReceive (subnetID, deviceID, command, targetSubnetID, targetDeviceID, usefulBytes, RemoteEndPoint); } public static string byteToHex16 (byte b) { string s = Convert.ToString (b, 16).ToUpper (); if (s.Length <= 1) { return "0" + s; } return s;// } } }