Пример #1
0
        /// <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 + "超过通信中断判定时间未收到心跳信息,断开连接!");
        }
Пример #2
0
        /// <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);
            }
        }
Пример #3
0
        /// <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);
        }