/// <summary> /// 跳维持超时事件--已超时 将提示故障等信息 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timerHB_Elapsed(object sender, EventArgs e) { //断开TCP连接并释放资源 CTcpClient.Socket_TCPClient_Dispose(); //断链后初始化计时器允许标志 timerEnable = false; //设置当前产品全部设备状态为故障 foreach (IDevice device in CBelongsDevice) { device.State = "故障"; } //设置标志位 //Modified @ 9.10 if (InProcess) { SkipFlag = true; } InProcess = false; timerHB.Dispose(); //StepOne = true; //设置该产品通信状态为中断 CDeviceDataFactory.Instance.VobcContainer.SetProductFailReason(Ip, Convert.ToInt32(Port), "与下位机通信中断"); CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "中断"); //向消息窗口汇报 Report.ReportWindow(ProductID + "超过通信中断判定时间未收到心跳信息,断开连接!请重新开始部署"); //记录日志 LogManager.InfoLog.LogProcInfo("VOBCCommand", "TcpVobc_EBackData", ProductID + "超过通信中断判定时间未收到心跳信息,断开连接!"); }
/// <summary> /// 检查VOBC产品是否全部更新成功 /// </summary> /// <returns></returns> //public bool IsFileUpdateResultChecked() //{ // //记录日志 // LogManager.InfoLog.LogProcInfo("VOBCProduct", "IsFileChecked", "检查VOBC产品:" + m_productID + "的部署文件是否全部更新成功"); // //返回值定义 // bool rtnValue = true; // //计算校验结果 // foreach (string type in base.CSelectedDeviceType) // { // rtnValue &= CheckUpdateResultTypeFile(type); // } // //记录日志 // LogManager.InfoLog.LogProcInfo("VOBCProduct", "IsFileChecked", "VOBC产品" + m_productID + "的部署文件校验结果为" + rtnValue.ToString()); // return rtnValue; //} /// <summary> /// 等待VOBC子子系统烧录结果 /// </summary> public override void WaitForUpdateResult() { //foreach(vobcSystemType type in GetVobcSystemListByType(vobcSystemType sType)) //如有任一子设备更新失败则认为该产品全部更新失败,因此反向判断:回复的VOBC产品下的子子系统更新结果存在失败的,更新失败 Modified @ 4.25 if (this.CSelectedDevice.FindAll(tar => tar.State == "更新失败").Count > 0) { //记录部署失败日志信息 LogManager.InfoLog.LogProcError("VOBCProduct", "WaitForUpdateResult", "接收到VOBC产品:" + m_productID + "的部署更新失败消息"); if (InProcess == true) { //该产品已部署失败就停止并禁用心跳计时器 timerHB.Close(); timerEnable = false; //刷新界面日志信息 Report.ReportWindow("VOBC" + m_productID + "更新失败!请重启车载设备重新开始部署"); SkipFlag = true; InProcess = false; //StepOne = true; CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新失败"); //CDeviceDataFactory.Instance.VobcContainer.dataModify.Color(); //CDeviceDataFactory.Instance.VobcContainer.dataModify.ColorEvent(); //DataModify.ColorEventHandler //断开TCP连接并释放资源 Modified @ 7.7 CTcpClient.Socket_TCPClient_Dispose(); //释放内存 GC.Collect(); } ////记录部署成功日志信息 //LogManager.InfoLog.LogProcError("VOBCProduct", "WaitForUpdateResult", "VOBC产品:" + m_productID + "的部署更新成功,发送重置命令"); ////发送复位指令 //VOBCCommand resetCommand = new VOBCCommand(m_ip, Convert.ToInt32(m_port), m_productID, vobcCommandType.systemReset); //CommandQueue.instance.m_CommandQueue.Enqueue(resetCommand); ////刷新界面日志信息 //Report.ReportWindow("VOBC设备" + m_productID + "更新成功!"); ////跳出循环标志置为true //rev = true; } //VOBC产品下的子子系统跟新结果均为 更新成功 else if ((this.CSelectedDevice.FindAll(tar => tar.State == "更新成功").Count == CSelectedDevice.Count) && (this.CSelectedDevice.FindAll(tar => tar.State == "更新成功").Count != 0)) { //该产品已完成部署就停止并禁用心跳计时器 timerHB.Close(); timerEnable = false; //刷新界面日志信息 Report.ReportWindow("VOBC" + m_productID + "更新成功!"); InProcess = false; //StepOne = true; CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新成功"); CDeviceDataFactory.Instance.VobcContainer.dataModify.Color(); //记录部署成功日志信息 //LogManager.InfoLog.LogProcError("VOBCProduct", "WaitForUpdateResult", "VOBC产品:" + m_productID + "的部署更新成功,发送重置命令"); //发送复位指令 VOBCCommand resetCommand = new VOBCCommand(m_ip, Convert.ToInt32(m_port), m_productID, vobcCommandType.systemReset); CommandQueue.instance.m_CommandQueue.Enqueue(resetCommand); //断开TCP连接并释放资源 Modified @ 7.7 CTcpClient.Socket_TCPClient_Dispose(); //释放内存 GC.Collect(); } else { //需要修改外层等待更新成功开始的时机是更新进度100%后 //Thread.Sleep(1000); } }
/// <summary> /// 实现文件更新执行接口方法 /// </summary> protected override bool FileUpdateExec() { bool result = true; Report.ReportWindow("VOBC" + m_productID + "更新标识已下发至通信控制器,请勿终止部署.如此阶段发生异常情况,请重启车载设备两次再重新开始部署!"); LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "发送VOBC产品" + m_productID + "的文件更新命令"); VOBCCommand fileUpdateCommand = new VOBCCommand(m_ip, Convert.ToInt32(m_port), m_productID, vobcCommandType.startUpdateFile); CommandQueue.instance.m_CommandQueue.Enqueue(fileUpdateCommand); ///等待待重启状态 bool rev = false; int skipCount = 0; do { ///如果文件状态为true if (ProductState == "待重启") { LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "VOBC产品" + m_productID + "处于待重启状态,发送循环建链,已结束部署第一阶段"); rev = true; StepOne = false; } else { //计数15次 未收到允许更新就跳出循环结束 if (skipCount > 30) { SkipFlag = true; InProcess = false; //StepOne = true; skipCount = 0; result = false; Report.ReportWindow("未收到VOBC" + m_productID + "的允许更新回复超时"); //LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "未收到VOBC产品" + m_productID + "的允许更新回复超时"); CDeviceDataFactory.Instance.VobcContainer.SetProductDeviceState(Ip, Convert.ToInt32(Port), "更新失败"); CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新失败"); //Modified @ 7.25 //断开连接 CTcpClient.Socket_TCPClient_Dispose(); timerHB.Dispose(); CDeviceDataFactory.Instance.VobcContainer.dataModify.Color(); return(result); } else { //跳出计数+1 skipCount++; //休眠1秒 Thread.Sleep(1000); } } } while (rev == false); //待重启状态后,等待80秒发送一次建链帧至命令队列 //Thread.Sleep(80000); //从待重启状态开始pingVOBC的IP端口网络,直至ping不通则证明已关机 bool online = true; Ping ping = new Ping(); do { PingReply reply = ping.Send(m_ip); if (reply.Status != IPStatus.Success) { online = false; LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "VOBC产品" + m_productID + "已关闭"); } else { Thread.Sleep(3000); } } while (online == true); //进入重连 do { if (!StepOne) { PingReply reply = ping.Send(m_ip); if (reply.Status == IPStatus.Success) { online = true; LogManager.InfoLog.LogCommunicationInfo("VOBCProduct", "FileUpdateExec", "二次建链ping通,等待5秒开始执行建链"); Report.ReportWindow("VOBC产品" + m_productID + "二次建链ping通,等待5秒开始执行建链"); Thread.Sleep(5000); } else { Thread.Sleep(3000); } } else { result = false; return(result); } } while (online == false); VOBCCommand buildCommand = new VOBCCommand(m_ip, Convert.ToInt32(m_port), m_productID, vobcCommandType.rebuildLink); CommandQueue.instance.m_CommandQueue.Enqueue(buildCommand); skipCount = 0; rev = false; do { ///如果文件状态为true if (ProductState == "正常") { Report.ReportWindow("VOBC产品" + m_productID + "已完成重连,开始执行第二阶段程序"); LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "VOBC产品" + m_productID + "完成第二阶段重连"); rev = true; } else { //重连倒计时 if (skipCount > 15) { //SkipFlag = true; skipCount = 0; //result = false; //Report.ReportWindow("VOBC产品" + m_productID + "第二阶段网络重连超时!继续重连"); //CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip,Convert.ToInt32(Port), "重连失败"); //CDeviceDataFactory.Instance.VobcContainer.dataModify.Modify(); //return result; for (int i = 0; i < 3; i++) { if (ProductState != "正常") { CommandQueue.instance.m_CommandQueue.Enqueue(new VOBCCommand(Ip, Convert.ToInt32(Port), ProductID, vobcCommandType.rebuildLink)); Thread.Sleep(15000); } else { Report.ReportWindow("VOBC产品" + m_productID + "已完成重连,开始执行第二阶段程序"); result = true; return(result); } } if (ProductState != "正常") { Report.ReportWindow("VOBC产品" + m_productID + "第二阶段网络重连超时,更新失败!请重启车载设备两次再重新开始部署"); SkipFlag = true; InProcess = false; //Modified @ 7.24 StepOne = true; result = false; //Modified @ 9.10 CDeviceDataFactory.Instance.VobcContainer.SetProductDeviceState(Ip, Convert.ToInt32(Port), "更新失败"); CDeviceDataFactory.Instance.VobcContainer.SetProductState(Ip, Convert.ToInt32(Port), "更新失败"); return(result); } else { Report.ReportWindow("VOBC产品" + m_productID + "已完成重连,开始执行第二阶段程序"); result = true; return(result); } } else { //跳出计数+1 skipCount++; //休眠1秒 Thread.Sleep(1000); } } } while (rev == false); //记录日志 //LogManager.InfoLog.LogProcInfo("VOBCProduct", "FileUpdateExec", "VOBC产品" + m_productID + "处于正常状态"); ///进入下一个产品的部署过程之前,等待当前产品的更新状态回复结果 //LogManager.InfoLog.LogProcInfo("VOBCProduct", "WaitForUpdateResult", "等待VOBC产品:" + m_productID + "的部署更新结果"); ///WaitForUpdateResult(); return(result); }