}; //包头字节数组 /// <summary> /// 安全的发送消息,发送时停止巡检,直到返回或者超时 /// 阻塞发送线程直到收到返回的消息或者达到超时。超时:50毫秒×40=2秒 /// </summary> /// <param name="commandType"></param> /// <param name="buffer"></param> /// <returns></returns> public bool Send_Safe(Protocol_Service.CommandType commandType, byte[] buffer) { switch (commandType) { //添加子基站命令 case Protocol_Service.CommandType.AddSon: //暂停巡检 MainForm.LoopKey = false; Global.Result_AddSon = false; this.Send(buffer); int tempNumAddSon = 0; //循环等待命令的成功返回 while (!Global.Result_AddSon) { Thread.Sleep(50); tempNumAddSon++; if (tempNumAddSon >= 40) { //超时,则把开关变量继续置为False后返回失败 Global.Result_AddSon = false; //继续巡检 MainForm.LoopKey = true; return(false); } } //至此,说明成功收到返回,则把开关变量继续置为False后返回成功 Global.Result_AddSon = false; //继续巡检 MainForm.LoopKey = true; break; //删除子基站命令 case Protocol_Service.CommandType.DelSon: //暂停巡检 MainForm.LoopKey = false; Global.Result_DelSon = false; this.Send(buffer); int tempNumDelSon = 0; //循环等待命令的成功返回 while (!Global.Result_DelSon) { Thread.Sleep(50); tempNumDelSon++; if (tempNumDelSon >= 40) { //超时,则把开关变量继续置为False后返回失败 Global.Result_DelSon = false; //继续巡检 MainForm.LoopKey = true; return(false); } } //至此,说明成功收到返回,则把开关变量继续置为False后返回成功 Global.Result_DelSon = false; //继续巡检 MainForm.LoopKey = true; break; //设置时间命令 case Protocol_Service.CommandType.SetTime: //暂停巡检 MainForm.LoopKey = false; Global.Result_SetTime = false; this.Send(buffer); int tempNumSetTime = 0; //循环等待命令的成功返回 while (!Global.Result_SetTime) { Thread.Sleep(50); tempNumSetTime++; if (tempNumSetTime >= 40) { //超时,则把开关变量继续置为False后返回失败 Global.Result_SetTime = false; //继续巡检 MainForm.LoopKey = true; return(false); } } //至此,说明成功收到返回,则把开关变量继续置为False后返回成功 Global.Result_SetTime = false; //继续巡检 MainForm.LoopKey = true; break; //点亮灯命令 case Protocol_Service.CommandType.LightUp: //暂停巡检 MainForm.LoopKey = false; Global.Result_LightUp = false; this.Send(buffer); int tempNumLightUp = 0; //循环等待命令的成功返回 while (!Global.Result_LightUp) { Thread.Sleep(50); tempNumLightUp++; if (tempNumLightUp >= 40) { //超时,则把开关变量继续置为False后返回失败 Global.Result_LightUp = false; //继续巡检 MainForm.LoopKey = true; return(false); } } //至此,说明成功收到返回,则把开关变量继续置为False后返回成功 Global.Result_LightUp = false; //继续巡检 MainForm.LoopKey = true; break; } return(true); }
private static byte[] MakeCommand(Protocol_Service.CommandType CommandType, int SourceStationID, int AimStationID, byte[] ParameterArray) { //最终返回的命令 byte[] ResultCommand = null; //帧控制字 byte control = Convert.ToByte(0x40 + (BagNum & 0x0F)); //自增包序号 BagNum++; //有效数据长度,为:命令字的长度1 + 参数数组的长度 byte length = 1; if (ParameterArray != null) { length = Convert.ToByte(1 + ParameterArray.Length); } //原基站ID byte[] source = new byte[2]; source[0] = Convert.ToByte((SourceStationID >> 8) & 0xFF); //高八位 source[1] = Convert.ToByte(SourceStationID & 0xFF); //低八位 //目标基站ID byte[] aim = new byte[2]; aim[0] = Convert.ToByte((AimStationID >> 8) & 0xFF); //高八位 aim[1] = Convert.ToByte(AimStationID & 0xFF); //低八位 //帧命令字 byte command = 0; //校验字 int check = 0; switch (CommandType) { //巡检命令 case Protocol_Service.CommandType.Loop: command = 0x50; break; //添加子节点命令 case Protocol_Service.CommandType.AddSon: command = 0x54; break; //删除子节点命令 case Protocol_Service.CommandType.DelSon: command = 0x54; break; //设置基站时间 case Protocol_Service.CommandType.SetTime: command = 0x91; break; //发送下行短信 case Protocol_Service.CommandType.DownMessage: command = 0x51; break; //点亮灯命令 case Protocol_Service.CommandType.LightUp: command = 0x74; break; //得到历史数据命令 case Protocol_Service.CommandType.GetHistoryData: command = 0x60; break; //清空历史数据命令 case Protocol_Service.CommandType.DelHistoryData: command = 0x5F; break; //设置考勤基站人数命令 case Protocol_Service.CommandType.SetInMineNum: command = 0x24; break; //设置显示信息命令 case Protocol_Service.CommandType.SetInfo: command = 0x20; break; case Protocol_Service.CommandType.cset_s_num: command = 0x22; break; case Protocol_Service.CommandType.cset_w_num: command = 0x27; break; case Protocol_Service.CommandType.cset_w_no: command = 0x21; break; case Protocol_Service.CommandType.cset_space: command = 0x23; break; case Protocol_Service.CommandType.cset_up_ch: command = 0x1e; break; case Protocol_Service.CommandType.cset_down_ch: command = 0x1f; break; case Protocol_Service.CommandType.cset_reset: command = 0x26; break; } ResultCommand = new byte[9 + length]; ResultCommand[0] = 0xAA; ResultCommand[1] = 0x55; ResultCommand[2] = control; ResultCommand[3] = length; ResultCommand[4] = aim[0]; ResultCommand[5] = aim[1]; ResultCommand[6] = source[0]; ResultCommand[7] = source[1]; ResultCommand[8] = command; if (ParameterArray != null) { for (int i = 0; i < ParameterArray.Length; i++) { ResultCommand[9 + i] = ParameterArray[i]; } } //计算校验位 for (int j = 2; j < ResultCommand.Length - 1; j++) { check = check ^ ResultCommand[j]; } //将校验码放入最后一位 ResultCommand[9 + length - 1] = Convert.ToByte(check); if (Global.Isnew) { return(ResultCommand); } else { byte[] temparr = null; temparr = new byte[7 + length]; for (Int16 i = 0; i < 7 + length; i++) { temparr[i] = ResultCommand[i + 2]; } return(temparr); } }