|
|
@ -60,20 +60,20 @@ void ExportDataThread::stop()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
bool ExportDataThread::ConnectFtp() {
|
|
|
|
bool ExportDataThread::ConnectFtp() {
|
|
|
|
// FTP地址
|
|
|
|
// FTP地址
|
|
|
|
string ftpServer = "192.168.1.170";
|
|
|
|
string ftpServer = "192.168.1.170";
|
|
|
|
/* 端口号,一般为21 */
|
|
|
|
/* 端口号,一般为21 */
|
|
|
|
int port = 666;
|
|
|
|
int port = 666;
|
|
|
|
/* 用户名 */
|
|
|
|
/* 用户名 */
|
|
|
|
string userName = "FTP2";
|
|
|
|
string userName = "FTP2";
|
|
|
|
/* 密码 */
|
|
|
|
/* 密码 */
|
|
|
|
string pwd = "123";
|
|
|
|
string pwd = "123";
|
|
|
|
|
|
|
|
|
|
|
|
if (hftp != NULL) {
|
|
|
|
if (hftp != NULL) {
|
|
|
|
InternetCloseHandle(hftp);
|
|
|
|
InternetCloseHandle(hftp);
|
|
|
|
hftp = NULL;
|
|
|
|
hftp = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 创建ftp连接
|
|
|
|
// 创建ftp连接
|
|
|
|
hftp = InternetConnectA(hint, ftpServer.c_str(), port, userName.c_str(), pwd.c_str(), INTERNET_SERVICE_FTP, 0, 0);
|
|
|
|
hftp = InternetConnectA(hint, ftpServer.c_str(), port, userName.c_str(), pwd.c_str(), INTERNET_SERVICE_FTP, 0, 0);
|
|
|
|
if (hftp == NULL) {
|
|
|
|
if (hftp == NULL) {
|
|
|
|
qDebug() << "ftp connect failed because " << GetLastError();
|
|
|
|
qDebug() << "ftp connect failed because " << GetLastError();
|
|
|
@ -121,7 +121,7 @@ bool _ExportDataInfo::getAverageData(map<string, float> &averageData, int index)
|
|
|
|
XMLElement* TimeCostNode = userNode->FirstChildElement("TimeCost");
|
|
|
|
XMLElement* TimeCostNode = userNode->FirstChildElement("TimeCost");
|
|
|
|
data["TimeCost"] += stof(TimeCostNode->GetText());
|
|
|
|
data["TimeCost"] += stof(TimeCostNode->GetText());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
userNode = userNode->NextSiblingElement();//下一个兄弟节点
|
|
|
|
userNode = userNode->NextSiblingElement();//下一个兄弟节点
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (data["Total"] == 0)
|
|
|
|
if (data["Total"] == 0)
|
|
|
|
return false;
|
|
|
|
return false;
|
|
|
@ -143,8 +143,8 @@ int ExportDataThread::insertXMLNode(const char* xmlPath, _XMLExportDataInfo& dat
|
|
|
|
//return 0;
|
|
|
|
//return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// 总统计数据
|
|
|
|
/// 总统计数据
|
|
|
|
// 总检测数量
|
|
|
|
// 总检测数量
|
|
|
|
XMLElement* Total = pDocument[data.cameraId]->NewElement("TotalDatas");
|
|
|
|
XMLElement* Total = pDocument[data.cameraId]->NewElement("TotalDatas");
|
|
|
|
|
|
|
|
|
|
|
|
XMLElement* time = pDocument[data.cameraId]->NewElement("CurrentTime");
|
|
|
|
XMLElement* time = pDocument[data.cameraId]->NewElement("CurrentTime");
|
|
|
@ -157,52 +157,52 @@ int ExportDataThread::insertXMLNode(const char* xmlPath, _XMLExportDataInfo& dat
|
|
|
|
TotalCheckNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.TotalCheckNum, s, 10)));
|
|
|
|
TotalCheckNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.TotalCheckNum, s, 10)));
|
|
|
|
Total->InsertEndChild(TotalCheckNum);
|
|
|
|
Total->InsertEndChild(TotalCheckNum);
|
|
|
|
|
|
|
|
|
|
|
|
// 总剔除数量
|
|
|
|
// 总剔除数量
|
|
|
|
XMLElement* TotalKickNum = pDocument[data.cameraId]->NewElement("TotalKickNum");
|
|
|
|
XMLElement* TotalKickNum = pDocument[data.cameraId]->NewElement("TotalKickNum");
|
|
|
|
TotalKickNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.TotalKickNum, s, 10)));
|
|
|
|
TotalKickNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.TotalKickNum, s, 10)));
|
|
|
|
Total->InsertEndChild(TotalKickNum);
|
|
|
|
Total->InsertEndChild(TotalKickNum);
|
|
|
|
|
|
|
|
|
|
|
|
root->InsertEndChild(Total);
|
|
|
|
root->InsertEndChild(Total);
|
|
|
|
|
|
|
|
|
|
|
|
/// 各相机数据
|
|
|
|
/// 各相机数据
|
|
|
|
// 相机id & 总数
|
|
|
|
// 相机id & 总数
|
|
|
|
XMLElement* CameraNode = pDocument[data.cameraId]->NewElement("Camera");
|
|
|
|
XMLElement* CameraNode = pDocument[data.cameraId]->NewElement("Camera");
|
|
|
|
CameraNode->SetAttribute("Count ", data.cameraTotal);
|
|
|
|
CameraNode->SetAttribute("Count ", data.cameraTotal);
|
|
|
|
CameraNode->SetAttribute("Id", data.cameraId);
|
|
|
|
CameraNode->SetAttribute("Id", data.cameraId);
|
|
|
|
|
|
|
|
|
|
|
|
XMLElement* JudgeNum = pDocument[data.cameraId]->NewElement("JudgeNum");
|
|
|
|
XMLElement* JudgeNum = pDocument[data.cameraId]->NewElement("JudgeNum");
|
|
|
|
// 各相机检测数量
|
|
|
|
// 各相机检测数量
|
|
|
|
XMLElement* checkNum = pDocument[data.cameraId]->NewElement("CheckNum");
|
|
|
|
XMLElement* checkNum = pDocument[data.cameraId]->NewElement("CheckNum");
|
|
|
|
checkNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.checkNum, s, 10)));
|
|
|
|
checkNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.checkNum, s, 10)));
|
|
|
|
JudgeNum->InsertEndChild(checkNum);
|
|
|
|
JudgeNum->InsertEndChild(checkNum);
|
|
|
|
// 各相机ok数量
|
|
|
|
// 各相机ok数量
|
|
|
|
XMLElement* okNum = pDocument[data.cameraId]->NewElement("OkNum");
|
|
|
|
XMLElement* okNum = pDocument[data.cameraId]->NewElement("OkNum");
|
|
|
|
okNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.okNum, s, 10)));
|
|
|
|
okNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.okNum, s, 10)));
|
|
|
|
JudgeNum->InsertEndChild(okNum);
|
|
|
|
JudgeNum->InsertEndChild(okNum);
|
|
|
|
// 各相机ng数量
|
|
|
|
// 各相机ng数量
|
|
|
|
XMLElement* ngNum = pDocument[data.cameraId]->NewElement("NgNum");
|
|
|
|
XMLElement* ngNum = pDocument[data.cameraId]->NewElement("NgNum");
|
|
|
|
ngNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.ngNum, s, 10)));
|
|
|
|
ngNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.ngNum, s, 10)));
|
|
|
|
JudgeNum->InsertEndChild(ngNum);
|
|
|
|
JudgeNum->InsertEndChild(ngNum);
|
|
|
|
// 各相机实际剔除数量(单通道剔除时为总剔除数量)
|
|
|
|
// 各相机实际剔除数量(单通道剔除时为总剔除数量)
|
|
|
|
XMLElement* kickNum = pDocument[data.cameraId]->NewElement("KickNum");
|
|
|
|
XMLElement* kickNum = pDocument[data.cameraId]->NewElement("KickNum");
|
|
|
|
kickNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.kickNum, s, 10)));
|
|
|
|
kickNum->InsertEndChild(pDocument[data.cameraId]->NewText(itoa(data.kickNum, s, 10)));
|
|
|
|
JudgeNum->InsertEndChild(kickNum);
|
|
|
|
JudgeNum->InsertEndChild(kickNum);
|
|
|
|
|
|
|
|
|
|
|
|
// 合格率
|
|
|
|
// 合格率
|
|
|
|
XMLElement* PassRate = pDocument[data.cameraId]->NewElement("PassRate");
|
|
|
|
XMLElement* PassRate = pDocument[data.cameraId]->NewElement("PassRate");
|
|
|
|
std::string temp_str = std::to_string(data.PassRate * 100) + "%";
|
|
|
|
std::string temp_str = std::to_string(data.PassRate * 100) + "%";
|
|
|
|
const char* temp_char = temp_str.c_str();
|
|
|
|
const char* temp_char = temp_str.c_str();
|
|
|
|
PassRate->InsertEndChild(pDocument[data.cameraId]->NewText(temp_char));
|
|
|
|
PassRate->InsertEndChild(pDocument[data.cameraId]->NewText(temp_char));
|
|
|
|
JudgeNum->InsertEndChild(PassRate);
|
|
|
|
JudgeNum->InsertEndChild(PassRate);
|
|
|
|
|
|
|
|
|
|
|
|
// 剔除率
|
|
|
|
// 剔除率
|
|
|
|
XMLElement* KickRate = pDocument[data.cameraId]->NewElement("KickRate");
|
|
|
|
XMLElement* KickRate = pDocument[data.cameraId]->NewElement("KickRate");
|
|
|
|
temp_str = std::to_string(data.KickRate * 100) + "%";
|
|
|
|
temp_str = std::to_string(data.KickRate * 100) + "%";
|
|
|
|
temp_char = temp_str.c_str();
|
|
|
|
temp_char = temp_str.c_str();
|
|
|
|
KickRate->InsertEndChild(pDocument[data.cameraId]->NewText(temp_char));
|
|
|
|
KickRate->InsertEndChild(pDocument[data.cameraId]->NewText(temp_char));
|
|
|
|
JudgeNum->InsertEndChild(KickRate);
|
|
|
|
JudgeNum->InsertEndChild(KickRate);
|
|
|
|
|
|
|
|
|
|
|
|
// 各相机胶点识别个数
|
|
|
|
// 各相机胶点识别个数
|
|
|
|
XMLElement* JdNum = pDocument[data.cameraId]->NewElement("JdNum");
|
|
|
|
XMLElement* JdNum = pDocument[data.cameraId]->NewElement("JdNum");
|
|
|
|
JdNum->InsertEndChild(pDocument[data.cameraId]->NewText(data.jdNum.toStdString().c_str()));
|
|
|
|
JdNum->InsertEndChild(pDocument[data.cameraId]->NewText(data.jdNum.toStdString().c_str()));
|
|
|
|
JudgeNum->InsertEndChild(JdNum);
|
|
|
|
JudgeNum->InsertEndChild(JdNum);
|
|
|
@ -213,13 +213,13 @@ int ExportDataThread::insertXMLNode(const char* xmlPath, _XMLExportDataInfo& dat
|
|
|
|
|
|
|
|
|
|
|
|
CameraNode->InsertEndChild(JudgeNum);
|
|
|
|
CameraNode->InsertEndChild(JudgeNum);
|
|
|
|
|
|
|
|
|
|
|
|
// 各相机采集速度
|
|
|
|
// 各相机采集速度
|
|
|
|
XMLElement* speed = pDocument[data.cameraId]->NewElement("Speed");
|
|
|
|
XMLElement* speed = pDocument[data.cameraId]->NewElement("Speed");
|
|
|
|
|
|
|
|
|
|
|
|
XMLElement* AcquisitionSpeed = pDocument[data.cameraId]->NewElement("AcquisitionSpeed");
|
|
|
|
XMLElement* AcquisitionSpeed = pDocument[data.cameraId]->NewElement("AcquisitionSpeed");
|
|
|
|
AcquisitionSpeed->InsertEndChild(pDocument[data.cameraId]->NewText(data.AcquisitionSpeed.toStdString().c_str()));
|
|
|
|
AcquisitionSpeed->InsertEndChild(pDocument[data.cameraId]->NewText(data.AcquisitionSpeed.toStdString().c_str()));
|
|
|
|
speed->InsertEndChild(AcquisitionSpeed);
|
|
|
|
speed->InsertEndChild(AcquisitionSpeed);
|
|
|
|
// 各相机检测速度
|
|
|
|
// 各相机检测速度
|
|
|
|
XMLElement* DetectSpeed = pDocument[data.cameraId]->NewElement("DetectSpeed");
|
|
|
|
XMLElement* DetectSpeed = pDocument[data.cameraId]->NewElement("DetectSpeed");
|
|
|
|
DetectSpeed->InsertEndChild(pDocument[data.cameraId]->NewText(data.DetectSpeed.toStdString().c_str()));
|
|
|
|
DetectSpeed->InsertEndChild(pDocument[data.cameraId]->NewText(data.DetectSpeed.toStdString().c_str()));
|
|
|
|
speed->InsertEndChild(DetectSpeed);
|
|
|
|
speed->InsertEndChild(DetectSpeed);
|
|
|
@ -254,17 +254,17 @@ void ExportDataThread::run()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//*****************************************已经调试好,没有理清逻辑前不要动**********************
|
|
|
|
//*****************************************已经调试好,没有理清逻辑前不要动**********************
|
|
|
|
void ExportDataThread::check_save_dir(std::string dir_path)
|
|
|
|
void ExportDataThread::check_save_dir(std::string dir_path)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// 如果目的路径不存在,一级一级创建
|
|
|
|
// 如果目的路径不存在,一级一级创建
|
|
|
|
// 目的路径格式为:"./dir/dir1/.../"
|
|
|
|
// 目的路径格式为:"./dir/dir1/.../"
|
|
|
|
|
|
|
|
|
|
|
|
if (FALSE == FtpSetCurrentDirectoryA(hftp, dir_path.c_str())) {
|
|
|
|
if (FALSE == FtpSetCurrentDirectoryA(hftp, dir_path.c_str())) {
|
|
|
|
FtpSetCurrentDirectoryA(hftp, "/");
|
|
|
|
FtpSetCurrentDirectoryA(hftp, "/");
|
|
|
|
int pos = 1;
|
|
|
|
int pos = 1;
|
|
|
|
while (pos > 0) {
|
|
|
|
while (pos > 0) {
|
|
|
|
// 从第二个“/”开始依次找到目的路径中的“/”位置
|
|
|
|
// 从第二个“/”开始依次找到目的路径中的“/”位置
|
|
|
|
pos = dir_path.find_first_of('/', pos + 1);
|
|
|
|
pos = dir_path.find_first_of('/', pos + 1);
|
|
|
|
if (pos == -1)
|
|
|
|
if (pos == -1)
|
|
|
|
break;
|
|
|
|
break;
|
|
|
@ -284,18 +284,18 @@ void ExportDataThread::ConnectServer(QString srcPath, QString destPath) {
|
|
|
|
string remotePath = destPath.toLocal8Bit().constData();
|
|
|
|
string remotePath = destPath.toLocal8Bit().constData();
|
|
|
|
|
|
|
|
|
|
|
|
std::vector<string> files;
|
|
|
|
std::vector<string> files;
|
|
|
|
// 判断上传的是文件还是文件夹标识
|
|
|
|
// 判断上传的是文件还是文件夹标识
|
|
|
|
int size = 0;
|
|
|
|
int size = 0;
|
|
|
|
struct stat st;
|
|
|
|
struct stat st;
|
|
|
|
stat(filePath.c_str(), &st);
|
|
|
|
stat(filePath.c_str(), &st);
|
|
|
|
if (st.st_mode & S_IFDIR) {
|
|
|
|
if (st.st_mode & S_IFDIR) {
|
|
|
|
//qDebug() << "filePath is Directory";
|
|
|
|
//qDebug() << "filePath is Directory";
|
|
|
|
// 获取文件夹下所有文件名
|
|
|
|
// 获取文件夹下所有文件名
|
|
|
|
GetFiles(filePath, files);
|
|
|
|
GetFiles(filePath, files);
|
|
|
|
size = files.size();
|
|
|
|
size = files.size();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 上传文件源为一个文件
|
|
|
|
// 上传文件源为一个文件
|
|
|
|
if (size == 0) {
|
|
|
|
if (size == 0) {
|
|
|
|
int pos = remotePath.find_last_of('/');
|
|
|
|
int pos = remotePath.find_last_of('/');
|
|
|
|
string destFileName = remotePath.substr(pos + 1);
|
|
|
|
string destFileName = remotePath.substr(pos + 1);
|
|
|
@ -303,7 +303,7 @@ void ExportDataThread::ConnectServer(QString srcPath, QString destPath) {
|
|
|
|
check_save_dir(tempPath);
|
|
|
|
check_save_dir(tempPath);
|
|
|
|
|
|
|
|
|
|
|
|
if (!InternetGetConnectedState(NULL, 0)) {
|
|
|
|
if (!InternetGetConnectedState(NULL, 0)) {
|
|
|
|
qDebug() << "计算机未连接到互联网";
|
|
|
|
qDebug() << "计算机未连接到互联网";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
while (!FtpPutFileA(hftp, filePath.c_str(), remotePath.c_str(), FTP_TRANSFER_TYPE_BINARY, 0)) {
|
|
|
|
while (!FtpPutFileA(hftp, filePath.c_str(), remotePath.c_str(), FTP_TRANSFER_TYPE_BINARY, 0)) {
|
|
|
@ -313,11 +313,11 @@ void ExportDataThread::ConnectServer(QString srcPath, QString destPath) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// 上传源为一个文件夹
|
|
|
|
// 上传源为一个文件夹
|
|
|
|
else {
|
|
|
|
else {
|
|
|
|
for (int i = 0; i < size; i++) {
|
|
|
|
for (int i = 0; i < size; i++) {
|
|
|
|
string tempFilePath = (string(files[i]).erase(0, filePath.length() + 1)).c_str();
|
|
|
|
string tempFilePath = (string(files[i]).erase(0, filePath.length() + 1)).c_str();
|
|
|
|
// 获取上传路径中的文件名
|
|
|
|
// 获取上传路径中的文件名
|
|
|
|
int pos = tempFilePath.find_last_of('/');
|
|
|
|
int pos = tempFilePath.find_last_of('/');
|
|
|
|
string destFileName = tempFilePath.substr(pos + 1);
|
|
|
|
string destFileName = tempFilePath.substr(pos + 1);
|
|
|
|
check_save_dir(remotePath + tempFilePath.substr(0, pos + 1));
|
|
|
|
check_save_dir(remotePath + tempFilePath.substr(0, pos + 1));
|
|
|
@ -333,20 +333,20 @@ void ExportDataThread::GetDataFromSaveThread(QString filePath) {
|
|
|
|
ConnectServer(filePath, remotePath);
|
|
|
|
ConnectServer(filePath, remotePath);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//*****************************************已经调试好,没有理清逻辑前不要动**********************
|
|
|
|
//*****************************************已经调试好,没有理清逻辑前不要动**********************
|
|
|
|
void ExportDataThread::GetFiles(string path, std::vector<string>& files) {
|
|
|
|
void ExportDataThread::GetFiles(string path, std::vector<string>& files) {
|
|
|
|
//文件句柄
|
|
|
|
//文件句柄
|
|
|
|
intptr_t hFile = 0;
|
|
|
|
intptr_t hFile = 0;
|
|
|
|
//文件信息的结构体
|
|
|
|
//文件信息的结构体
|
|
|
|
struct _finddata_t fileinfo;
|
|
|
|
struct _finddata_t fileinfo;
|
|
|
|
string p;
|
|
|
|
string p;
|
|
|
|
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
|
|
|
|
if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
// "\\*"是指读取文件夹下的所有类型的文件
|
|
|
|
// "\\*"是指读取文件夹下的所有类型的文件
|
|
|
|
do
|
|
|
|
do
|
|
|
|
{
|
|
|
|
{
|
|
|
|
//如果是目录,迭代之
|
|
|
|
//如果是目录,迭代之
|
|
|
|
//如果不是,加入列表
|
|
|
|
//如果不是,加入列表
|
|
|
|
if ((fileinfo.attrib & _A_SUBDIR))
|
|
|
|
if ((fileinfo.attrib & _A_SUBDIR))
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
|
|
|
|
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
|
|
|
|