Пример #1
0
        //private static byte _atpUpdateFile;
        //private static byte _atoUpdateFile;
        //private static byte _ccovUpdateFile;
        //private static byte _mmiUpdateFile;
        //private static byte _comUpdateFile;

        #region 打包建链请求信息


        /// <summary>
        /// 打包建链请求
        /// </summary>
        /// <returns>帧字节数组</returns>
        public static byte[] PackBuildLinkRequest(VOBCProduct vobc)
        {
            byte[] pData = new byte[8];
            byte   iter  = 0;

            pData[iter++] = 0x00;
            pData[iter++] = 0x06; //帧长度
            pData[iter++] = 0x09; //帧类型码
            pData[iter++] = 0x55; //请求建立连接

            UInt32 crc32 = CRC.CRC32(pData, (ushort)(pData.Length - 4), 0);

            pData[iter++] = BitConverter.GetBytes(crc32)[3];
            pData[iter++] = BitConverter.GetBytes(crc32)[2];
            pData[iter++] = BitConverter.GetBytes(crc32)[1];
            pData[iter]   = BitConverter.GetBytes(crc32)[0];

            //使用前重置更新标志位
            vobc._atpUpdateFile  = new byte();
            vobc._atoUpdateFile  = new byte();
            vobc._comUpdateFile  = new byte();
            vobc._mmiUpdateFile  = new byte();
            vobc._ccovUpdateFile = new byte();

            return(pData);
            //添加FFFE协议头尾
            //return FFFE.FFFEPack(pData);
        }
Пример #2
0
        /// <summary>
        /// TCPVOBC数据回调
        /// </summary>
        /// <param name="receData">回调数据</param>
        void TcpVobc_EBackData(byte[] receData)
        {
            VOBCProduct pro = CDeviceDataFactory.Instance.GetProductByIpPort(vobcServerIP, vobcServerPort);

            DataAnalysis.VOBCDataAnalysis(receData, pro.CTcpClient);

            //if (pro != null)
            //{
            //    //第一次建链即触发回调,在收到更新结果回复时在这里直接处理
            //    if (receData[2] == 0x06)
            //    {
            //        pro.WaitForUpdateResult();
            //    }
            //}
            //else
            //{
            //    LogManager.InfoLog.LogCommunicationError("VOBCCommand", "TcpVobc_EBackData", pro.ProductID + "未找到接收到的VOBC对象!");
            //}
        }
Пример #3
0
        /// <summary>
        /// 打包文件更新请求信息
        /// </summary>
        /// <returns>帧字节数组</returns>
        public static byte[] PackFileUpdateRequest(VOBCProduct vobc)
        {
            byte[] pData = new byte[16];
            byte   iter  = 0;

            pData[iter++] = 0x00;
            pData[iter++] = 0x0E; //帧长度
            pData[iter++] = 0x01; //帧类型码
            //填入各更新文件类型码
            pData[iter++] = vobc._atpUpdateFile;
            pData[iter++] = vobc._atpUpdateFile;
            pData[iter++] = vobc._atpUpdateFile;
            pData[iter++] = vobc._atoUpdateFile;
            pData[iter++] = vobc._atoUpdateFile;
            pData[iter++] = vobc._comUpdateFile;
            pData[iter++] = vobc._comUpdateFile;
            pData[iter++] = vobc._mmiUpdateFile;
            pData[iter++] = vobc._ccovUpdateFile;

            //pData[iter++] = 0x01;//请求标志置为有效

            UInt32 crc32 = CRC.CRC32(pData, (ushort)(pData.Length - 4), 0);

            pData[iter++] = BitConverter.GetBytes(crc32)[3];
            pData[iter++] = BitConverter.GetBytes(crc32)[2];
            pData[iter++] = BitConverter.GetBytes(crc32)[1];
            pData[iter]   = BitConverter.GetBytes(crc32)[0];

            //使用后重置更新标志位
            vobc._atpUpdateFile  = new byte();
            vobc._atoUpdateFile  = new byte();
            vobc._comUpdateFile  = new byte();
            vobc._mmiUpdateFile  = new byte();
            vobc._ccovUpdateFile = new byte();

            return(pData);
            //添加FFFE协议头尾
            //return FFFE.FFFEPack(pData);
        }
Пример #4
0
        /// <summary>
        /// 打包文件校验请求信息
        /// </summary>
        /// <param name="checkFileList">待验证VOBC信息实体类集合</param>
        /// <returns>帧字节数组</returns>
        public static byte[] PackFileVerificationRequest(VobcCheckFile checkFile, VOBCProduct vobc)
        {
            byte[] pData = new byte[111];
            int    iter  = 0;

            pData[iter++] = 0x00;
            pData[iter++] = 0x6D; //帧长度
            pData[iter++] = 0x02; //帧类型码

            //填入各子子系统级校验文件类型码
            pData[iter++] = Convert.ToByte(checkFile.vobcSystemType);                                    //子子系统类型码
            pData[iter++] = Convert.ToByte(checkFile.vobcFileTypeList.Sum(tar => Convert.ToInt32(tar))); //校验文件类型码(多文件类型求和=文件类型码)
            Common.vobcSystemType systemType = checkFile.vobcSystemType;
            switch (systemType)
            {
            case Common.vobcSystemType.ATP_1:
                vobc._atpUpdateFile = Convert.ToByte(checkFile.vobcFileTypeList.Sum(tar => Convert.ToInt32(tar)));
                break;

            case Common.vobcSystemType.ATO_1:
                vobc._atoUpdateFile = Convert.ToByte(checkFile.vobcFileTypeList.Sum(tar => Convert.ToInt32(tar)));
                break;

            case Common.vobcSystemType.COM_1:
                vobc._comUpdateFile = Convert.ToByte(checkFile.vobcFileTypeList.Sum(tar => Convert.ToInt32(tar)));
                break;

            case Common.vobcSystemType.MMI:
                vobc._mmiUpdateFile = Convert.ToByte(checkFile.vobcFileTypeList.Sum(tar => Convert.ToInt32(tar)));
                break;

            case Common.vobcSystemType.CCOV:
                vobc._ccovUpdateFile = Convert.ToByte(checkFile.vobcFileTypeList.Sum(tar => Convert.ToInt32(tar)));
                break;

            default:
                break;
            }
            //MD5有效标志位 默认都重置为无效(0xAA)
            pData[21]  = 0xAA; //内核文件MD5有效标志
            pData[38]  = 0xAA; //数据文件MD5有效标志
            pData[55]  = 0xAA; //配置文件MD5有效标志
            pData[72]  = 0xAA; //引导文件MD5有效标志
            pData[89]  = 0xAA; //CCOV配置文件MD5有效标志
            pData[106] = 0xAA; //预留MD5有效标志

            //针对需要传输的文件,计算MD5值并将MD5写入数据帧
            for (int index = 0; index < checkFile.vobcFileTypeList.Count; index++)
            {
                if (checkFile.vobcFileTypeList[index] != Common.vobcFileType.INVALID)
                {
                    //计算MD5值
                    byte[] md5Value = GetMD5FromFile(checkFile.vobcFilePathList.ElementAt(index).Key);

                    //替换数组的开始索引下标
                    int replaceBeginIndex = -1;

                    //依据传输的文件类型 获取替换数组的索引下标
                    switch (checkFile.vobcFileTypeList[index])
                    {
                    case RemoteDeploy.Common.vobcFileType.CORE:
                        replaceBeginIndex = 5;
                        break;

                    case RemoteDeploy.Common.vobcFileType.DATA:
                        replaceBeginIndex = 22;
                        break;

                    case RemoteDeploy.Common.vobcFileType.NVRAM:
                        replaceBeginIndex = 39;
                        break;

                    case RemoteDeploy.Common.vobcFileType.BootLoader:
                        replaceBeginIndex = 56;
                        break;

                    case RemoteDeploy.Common.vobcFileType.CCOVConfig:
                        replaceBeginIndex = 73;
                        break;

                    default:
                        replaceBeginIndex = -1;
                        break;
                    }
                    string log = string.Empty;
                    log += "文件" + checkFile.vobcFileTypeList[index] + "MD5为:[";
                    foreach (byte item in md5Value)
                    {
                        log += Convert.ToString(item, 16) + " ";
                    }
                    log += "]";
                    LogManager.InfoLog.LogCommunicationInfo("DataPack",
                                                            "PackFileVerificationRequest", log);

                    //追加MD5值
                    ReplaceByteArray(ref pData, replaceBeginIndex, md5Value);

                    //追加MD5有效标志
                    pData[(replaceBeginIndex + md5Value.Length)] = 0x55;
                }
            }

            //跳至CRC起始位
            iter = 107;

            UInt32 crc32 = CRC.CRC32(pData, (ushort)(pData.Length - 4), 0);

            pData[iter++] = BitConverter.GetBytes(crc32)[3];
            pData[iter++] = BitConverter.GetBytes(crc32)[2];
            pData[iter++] = BitConverter.GetBytes(crc32)[1];
            pData[iter]   = BitConverter.GetBytes(crc32)[0];

            return(pData);
            //添加FFFE协议头尾
            //return FFFE.FFFEPack(pData);
        }
Пример #5
0
        /// <summary>
        /// 执行主函数
        /// </summary>
        /// <returns>返回执行结果</returns>
        public override bool Exec()
        {
            //执行结果
            bool execResult = false;

            #region TCP代码 正式环境使用

            VOBCProduct pro = CDeviceDataFactory.Instance.GetProductByIpPort(vobcServerIP, vobcServerPort);
            if (pro != null)
            {
                //根据指令类型 传输不同指令
                //建链
                if (vobcCommandT == vobcCommandType.buildLink)
                {
                    //Modified @ 7.7
                    if ((pro.CTcpClient == null) || (pro.CTcpClient.IsSocketEnable != true) || (pro.CTcpClient.clientSocket == null))
                    {
                        //实例化TCP客户端类
                        pro.CTcpClient = new Socket_TCPClient(vobcServerIP, vobcServerPort);
                        //TCP客户端代码 正式环境使用
                        pro.CTcpClient.EBackData += new Socket_TCPClient.BackData(TcpVobc_EBackData);
                    }
                    else
                    {
                        //Modified @ 7.7
                        //释放原对象
                        //pro.CTcpClient.Socket_TCPClient_Dispose();
                        //实例化TCP客户端类
                        //pro.CTcpClient = new Socket_TCPClient(vobcServerIP, vobcServerPort);
                        //TCP客户端代码 正式环境使用
                        //pro.CTcpClient.EBackData += new Socket_TCPClient.BackData(TcpVobc_EBackData);
                    }
                    Thread.Sleep(500);
                    execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackBuildLinkRequest(pro));
                    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "发送建链帧");
                }
                //重建链
                else if (vobcCommandT == vobcCommandType.rebuildLink)
                {
                    //实例化TCP客户端类
                    pro.CTcpClient = new Socket_TCPClient(vobcServerIP, vobcServerPort);
                    //TCP客户端代码 正式环境使用
                    pro.CTcpClient.EBackData += new Socket_TCPClient.BackData(TcpVobc_EBackData);
                    Thread.Sleep(500);
                    execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackBuildLinkRequest(pro));
                    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "发送建链帧");
                }
                //VOBC状态获取
                else if (vobcCommandT == vobcCommandType.vobcInfoRequest)
                {
                    execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackVOBCInfoRequest());
                    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "VOBC状态获取发送");
                }
                //文件传输请求
                else if (vobcCommandT == vobcCommandType.fileTransRequest)
                {
                    execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackFileTransferRequest());
                    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "发送传输文件请求!");
                }
                //执行文件发送
                else if (vobcCommandT == vobcCommandType.sendFile)
                {
                    foreach (KeyValuePair <string, string> path in m_checkFile.vobcFilePathList)
                    {
                        LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", "待更新的文件:[" + path + "]");
                        if (File.Exists(path.Key))
                        {
                            try
                            {
                                LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", "开始执行文件[" + path + "]的FTP发送!目标地址:" + vobcServerIP);

                                //TFTP.TFTP_Client.UpLoad(vobcServerIP, path);
                                ////设置烧录子子系统在界面中的显示状态--文件上传中 放到SendFile里执行刷新界面,节约command执行时间 Modified @ 9.13
                                //CDeviceDataFactory.Instance.VobcContainer.SetProductDeviceState(vobcServerIP, vobcServerPort,
                                //CommonMethod.GetVobcSystemListByType(m_checkFile.vobcSystemType),
                                //Convert.ToString(CommonMethod.GetVobcDeployNameByType(vobcSystemDeployState.FileUploading)));

                                ////通知界面刷新
                                //CDeviceDataFactory.Instance.VobcContainer.dataModify.Modify();

                                //Modified @ 9.13
                                //string th = Convert.ToString(pro.ProductID);
                                Thread th = new Thread(new ThreadStart(delegate { FTPHelper.FtpUploadBroken(vobcServerIP, path.Key, path.Value); }));
                                th.Start();
                                ////FTP上传文件
                                //bool ret = FTPHelper.FtpUploadBroken(vobcServerIP, path.Key, path.Value);


                                //if (ret == false)
                                //{
                                //    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", "Ftp send file ERROR[" + path + "]的FTP发送!目标地址:" + vobcServerIP);
                                //}
                                //else
                                //{
                                //    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", "文件[" + path + "]的FTP发送完成!");
                                //}
                            }
                            catch (Exception)
                            {
                                LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", "Error ");
                            }
                        }
                        else
                        {
                            //TODO
                            LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", "本地文件未找到[" + path + "]!");
                        }
                        Thread.Sleep(10);
                    }
                }
                //文件校验请求帧
                else if (vobcCommandT == vobcCommandType.checkFile)
                {
                    ////设置烧录子子系统在界面中的显示状态--文件校验中 放到CheckFile里执行刷新界面,节约command执行时间 Modified @ 9.13
                    //CDeviceDataFactory.Instance.VobcContainer.SetProductDeviceState(vobcServerIP, vobcServerPort,
                    //CommonMethod.GetVobcSystemListByType(m_checkFile.vobcSystemType),
                    //Convert.ToString(CommonMethod.GetVobcDeployNameByType(vobcSystemDeployState.FileCheck)));
                    ////通知界面刷新
                    //CDeviceDataFactory.Instance.VobcContainer.dataModify.Modify();

                    execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackFileVerificationRequest(m_checkFile, pro));
                    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "文件校验请求发送!");
                }
                //文件更新请求帧
                else if (vobcCommandT == vobcCommandType.startUpdateFile)
                {
                    //设置烧录子子系统在界面中的显示状态--文件更新中
                    //CDeviceDataFactory.Instance.VobcContainer.SetProductDeviceState(vobcServerIP,
                    //CommonMethod.GetVobcSystemListByType(m_checkFile.vobcSystemType),
                    //Convert.ToString(CommonMethod.GetVobcDeployNameByType(vobcSystemDeployState.FileUpdating)));
                    //通知界面刷新
                    //CDeviceDataFactory.Instance.VobcContainer.dataModify.Modify();

                    execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackFileUpdateRequest(pro));
                    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "文件更新请求发送!");
                }
                //远程重启帧
                else if (vobcCommandT == vobcCommandType.systemRestart)
                {
                    //TODO:暂时不处理,下位机硬件暂不支持
                }
                //停止更新请求帧
                else if (vobcCommandT == vobcCommandType.stopUpdateFile)
                {
                    execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackStopUpdateRequest());
                    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "文件停止更新请求发送!");
                }
                //远程复位帧
                else if (vobcCommandT == vobcCommandType.systemReset)
                {
                    execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackResetRequest());
                    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "远程复位请求发送!");
                }
                //断链请求帧
                else if (vobcCommandT == vobcCommandType.cutLink)
                {
                    try
                    {
                        if (pro != null)
                        {
                            execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackDisconnectRequest());
                            pro.CTcpClient.Socket_TCPClient_Dispose();
                        }
                        LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "断链请求发送!");
                    }
                    catch
                    {
                    }
                }
                //CCOV向上位机获取MD5指令
                else if (vobcCommandT == vobcCommandType.CcovGetMD5)
                {
                    execResult = pro.CTcpClient.Me_SendMessage(DataPack.DataPack.PackFileVerificationRequest(m_checkFile, pro));
                    LogManager.InfoLog.LogCommunicationInfo("VOBCCommand", "Exec", vobcDevID + "CCOV获取MD5,向下发送!");
                }
                else
                {
                    //TODO:暂时不处理
                }
            }
            else
            {
                execResult = false;
            }

            #endregion

            //返回执行结果
            return(execResult);
        }