using System; using System.Collections.Generic; using System.Text; using System.Data; using ICommLayer; using DBFactory; using System.Net; namespace SocketsUDP { /// /// 使用SocketsUDP的客户端进行通讯 /// 获得设备状态 /// 创建者:Richard.Liu /// public class CGetDeviceState:IGetDeviceState { string _commLayerError; public string CommLayerError { get { return _commLayerError; } set { _commLayerError = value; } } //CClientUDP ccuR = new CClientUDP(); DBOperator dbo = new DBOperator(); public CGetDeviceState() { dbo.Open(); } public int [] GetDeviceState(int DeviceIndex,int TaskIndex) { try { //根据DeviceIndex,得到Sockets通讯的初始设置 DataSet ds = dbo.ExceSQL("SELECT F_DeviceIndex,F_DeviceKindIndex, F_LocalIP, F_LocalPort, F_RemoteIP, F_RemotePort FROM T_Base_Device where F_DeviceIndex=" + DeviceIndex); DataView dv = ds.Tables[0].DefaultView; if (ds.Tables[0].DefaultView.Count > 0) { CClientUDP.RemoteServer = (EndPoint)new IPEndPoint(IPAddress.Parse(dv[0]["F_RemoteIP"].ToString()), Convert.ToInt32(dv[0]["F_RemotePort"])); CClientUDP.LocalServer = (EndPoint)new IPEndPoint(IPAddress.Parse(dv[0]["F_LocalIP"].ToString()), Convert.ToInt32(dv[0]["F_LocalPort"])); CClientUDP.ReceiveUdp(dv[0]["F_LocalIP"].ToString(), Convert.ToInt32(dv[0]["F_LocalPort"])); } else { return null; } int[] _IntData = new int[14]; byte[] _GetData = new byte[16]; int[] _sIntdata = new int[8]; int wIntXor = 0; byte[] _temp = new byte[2]; //对接收到的数据进行检查核实处理,考虑循环接收 CClientUDP.ReceiveUdp(); System.Threading.Thread.Sleep(300); _GetData = CClientUDP.ByteData; if (_GetData != null) { //对接收到的数据进行检查核实处理,考虑循环接收 //把两个字节转换成一个字 for (int i = 0; i <= 6; i++) { _temp[0] = _GetData[(2 * i)]; _temp[1] = _GetData[(2 * i + 1)]; _sIntdata[i] = CommonClassLib.CCarryConvert.GetInt16FromBytes(_temp); } //0字到5字(0--11字节)异或值放入第7个字(14和15字节);第六字(12和13字节)默认值0不参与异或 wIntXor = _sIntdata[0]; for (int i = 1; i <= 5; i++) { wIntXor = wIntXor ^ _sIntdata[i]; } _sIntdata[7] = wIntXor; _temp[0] =_GetData[14] ; _temp[1]=_GetData[15] ; wIntXor=CommonClassLib.CCarryConvert.GetInt16FromBytes(_temp); if (wIntXor != _sIntdata[7])//检验不对,等于没收到 { CClientUDP.CloseUDP(); _commLayerError = this.ToString() + ":GetDeviceState---" + CClientUDP.UdpError; return null; } _IntData[0] = Convert.ToInt16(_GetData[6]);//实际值 _IntData[1] = Convert.ToInt16(_GetData[4]);//消息:1-任务完成 2-报告坐标(对于堆垛机) 3-检测开关状态 其它值故障代码 _IntData[2] = Convert.ToUInt16(_GetData[3] + (_GetData[2] * 256)); ;//任务号TaskIndex _IntData[3] = Convert.ToInt16(_GetData[6]);//堆垛机x坐标 _IntData[4] = Convert.ToInt16(_GetData[7]);//堆垛机y坐标 _IntData[5] = DeviceIndex;// 设备号 CClientUDP.CloseUDP(); return _IntData; } else { CClientUDP.CloseUDP(); _commLayerError = this.ToString() + ":GetDeviceState---" + CClientUDP.UdpError; return null; } } catch (Exception ex) { CClientUDP.CloseUDP(); _commLayerError = this.ToString() + ":GetDeviceState---" + ex.Message; return null; } } } }