//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); }
/// <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对象!"); //} }
/// <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); }
/// <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); }
/// <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); }