| | |
| | | std::bind(&devHttpServer_c::editDevId, this, |
| | | std::placeholders::_1, std::placeholders::_2, |
| | | std::placeholders::_3, std::placeholders::_4)); |
| | | _HttpSrvRetRecieve.setInfo("^/findSdkRule$", "POST", |
| | | std::bind(&devHttpServer_c::findSdkRule, this, |
| | | std::placeholders::_1, std::placeholders::_2, |
| | | std::placeholders::_3, std::placeholders::_4)); |
| | | _HttpSrvRetRecieve.setInfo("^/editSdkRule$", "POST", |
| | | std::bind(&devHttpServer_c::editSdkRule, this, |
| | | std::placeholders::_1, std::placeholders::_2, |
| | | std::placeholders::_3, std::placeholders::_4)); |
| | | _HttpSrvRetRecieve.setInfo("^/getSnapshot$", "POST", |
| | | std::bind(&devHttpServer_c::getSnapshot, this, |
| | | std::placeholders::_1, std::placeholders::_2, |
| | | std::placeholders::_3, std::placeholders::_4)); |
| | | |
| | | |
| | | _HttpSrvRetRecieve.start(); |
| | | _HttpSrvRetRecieve.waitForShutDown(); |
| | | } |
| | |
| | | /*sdk login*/ |
| | | ulRet = IMOS_MW_Login(username, passwd, ip, 0, szUserID); |
| | | if (ERR_COMMON_SUCCEED != ulRet) { |
| | | (VOID) IMOS_MW_Cleanup(); |
| | | printf("Login error ulRet[%lu]", ulRet); |
| | | return false; |
| | | } |
| | |
| | | pstBasicInfo = (IMOS_MW_BASIC_DEVICE_INFO_S *) malloc(sizeof(IMOS_MW_BASIC_DEVICE_INFO_S)); |
| | | ulRet = IMOS_MW_GetDeviceStatus(szUserID, 0, IMOS_MW_STATUS_BASIC_INFO, (void *) pstBasicInfo); |
| | | if (ERR_COMMON_SUCCEED != ulRet) { |
| | | (VOID) IMOS_MW_Logout(szUserID); |
| | | (VOID) IMOS_MW_Cleanup(); |
| | | printf("GetDeviceStatus Error[%lu]\n", ulRet); |
| | | return false; |
| | | } |
| | |
| | | elem["str_brand"] = iter->str_brand.toStdString(); |
| | | elem["str_reserved"] = iter->str_reserved.toStdString(); |
| | | |
| | | Record_Cam_Sdk rec_sdk = db_c.searchCamSdkTableByCamId(iter->str_cam_dev_id); |
| | | elem["str_sdks"] = rec_sdk.str_sdks.toStdString(); |
| | | elem["str_det_thr"] = rec_sdk.str_det_thr.toStdString(); |
| | | elem["str_cmp_thr"] = rec_sdk.str_cmp_thr.toStdString(); |
| | | // Record_Cam_Sdk rec_sdk = db_c.searchCamSdkTableByCamId(iter->str_cam_dev_id); |
| | | // elem["str_sdks"] = rec_sdk.str_sdks.toStdString(); |
| | | // elem["str_det_thr"] = rec_sdk.str_det_thr.toStdString(); |
| | | // elem["str_cmp_thr"] = rec_sdk.str_cmp_thr.toStdString(); |
| | | |
| | | cout << elem.toStyledString() << endl; |
| | | |
| | |
| | | std::string out = value.size() > 0 ? value.toStyledString() : "[]"; |
| | | return out; |
| | | } |
| | | |
| | | #define ADD_CAMERA 0 |
| | | #define EDIT_CAMERA 1 |
| | | //编辑摄像机 |
| | | std::string devHttpServer_c::cam_edit(std::string ip, unsigned int port, std::string content, PResponse &response) { |
| | | DBG("ip:" << ip << "; port:" << port); |
| | |
| | | Record_Cam_Dev rec; |
| | | Record_Cam_Sdk rec_sdk_old; |
| | | Record_Cam_Sdk rec_sdk; |
| | | |
| | | int type=-1; |
| | | int dev_type = db_c.searchDevTypeFromConfigTable(); |
| | | if (DEV_STORAGE == dev_type) { |
| | | return "{\"ret_status\": \"内容有误,请检查!\"}"; |
| | | } |
| | | |
| | | if (reader.parse(content, value)) { |
| | | |
| | | unsigned char serialnumber[SERIALNO_LEN] = {0}; |
| | | ret = getDevSerialNumber(value["str_ip"].asCString(), value["n_port"].asInt(), |
| | | value["str_username"].asCString(), \ |
| | |
| | | rec.str_username = QString::fromStdString(value["str_username"].asString()); |
| | | rec.str_password = QString::fromStdString(value["str_password"].asString()); |
| | | rec.str_brand = QString::fromStdString(value["str_brand"].asString()); |
| | | type=value["n_type"].asInt(); |
| | | // rec_sdk_old = db_c.searchCamSdkTableByCamId(rec.str_cam_dev_id); |
| | | |
| | | rec_sdk_old = db_c.searchCamSdkTableByCamId(rec.str_cam_dev_id); |
| | | |
| | | rec_sdk.str_cam_dev_id = rec.str_cam_dev_id; |
| | | rec_sdk.str_sdks = QString::fromStdString(value["str_sdks"].asString()); |
| | | rec_sdk.str_det_thr = QString::fromStdString(value["str_det_thr"].asString()); |
| | | rec_sdk.str_cmp_thr = QString::fromStdString(value["str_cmp_thr"].asString()); |
| | | |
| | | ret = db_c.updateCamAndSdkTable(rec, rec_sdk); |
| | | if (!ret) { |
| | | return "err_db_content"; |
| | | // rec_sdk.str_cam_dev_id = rec.str_cam_dev_id; |
| | | // rec_sdk.str_sdks = QString::fromStdString(value["str_sdks"].asString()); |
| | | // rec_sdk.str_det_thr = QString::fromStdString(value["str_det_thr"].asString()); |
| | | // rec_sdk.str_cmp_thr = QString::fromStdString(value["str_cmp_thr"].asString()); |
| | | bool is_exist=db_c.searchCamDevByCamId(rec.str_cam_dev_id); |
| | | if(ADD_CAMERA == type ) |
| | | { |
| | | if(is_exist) |
| | | { |
| | | return "{\"ret_status\": \"请勿重复添加!\"}"; |
| | | } |
| | | else |
| | | { |
| | | ret =db_c.insertCamDevTable(rec); |
| | | if (!ret) { |
| | | return "err_db_content"; |
| | | } |
| | | } |
| | | } |
| | | else if(EDIT_CAMERA == type ) |
| | | { |
| | | if(is_exist) |
| | | { |
| | | ret = db_c.updateCamDevTable(rec); |
| | | if (!ret) { |
| | | return "err_db_content"; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | return "{\"ret_status\": \"内容有误,请检查!\"}"; |
| | | } |
| | | } |
| | | else |
| | | { |
| | | return "{\"ret_status\": \"内容有误,请检查!\"}"; |
| | | } |
| | | |
| | | |
| | | } else { |
| | | return "{\"ret_status\": \"传输错误,请检查!\"}"; |
| | | } |
| | |
| | | db_c.updateConfigTableByDevType(DEV_CAMERA); |
| | | runAllApp(); |
| | | } |
| | | //edit camera's sdks |
| | | //edit camera's sdks |
| | | else/* if ((rec_sdk_old.str_sdks != rec_sdk.str_sdks) || |
| | | (rec_sdk_old.str_det_thr != rec_sdk.str_det_thr) || |
| | | (rec_sdk_old.str_cmp_thr != rec_sdk.str_cmp_thr)) */{ |
| | | (rec_sdk_old.str_cmp_thr != rec_sdk.str_cmp_thr)) */ |
| | | { |
| | | killVideoAnalysFromHCApp(); |
| | | sleep(1); |
| | | runAllApp(); |
| | |
| | | |
| | | if (reader.parse(content, value)) { |
| | | int cut_max_duration = value["cut_max_duration"].asInt(); |
| | | |
| | | ret = db_c.updateConfigTableByCutDuration(cut_max_duration); |
| | | int cut_min_duration = value["cut_min_duration"].asInt(); |
| | | ret = db_c.updateConfigTableByCutDuration(cut_max_duration, cut_min_duration); |
| | | |
| | | } else { |
| | | return "{\"ret_status\": \"传输错误,请检查!\"}"; |
| | |
| | | |
| | | Json::Value value; |
| | | |
| | | int cut_max_duration = db_c.searchConfigTableWithinCutDuration(); |
| | | |
| | | value["cut_max_duration"] = cut_max_duration; |
| | | Record_Config rec = db_c.searchConfigTableWithinServerInfo(); |
| | | |
| | | value["cut_max_duration"] = rec.n_cut_max_duration; |
| | | value["cut_min_duration"] = rec.n_cut_min_duration; |
| | | std::string out = value.toStyledString(); |
| | | |
| | | return out; |
| | |
| | | appConfig.setStringProperty("erlCookie", cookie); |
| | | appConfig.setStringProperty("erlPath", path); |
| | | appConfig.setStringProperty("erlFatherNode", FatherNodeName); |
| | | appConfig.setStringProperty("clusterID", clusterID); |
| | | appConfig.save(); |
| | | // erlangDbTool->findAllNode(); |
| | | //face search server reboot |
| | |
| | | appConfig.setStringProperty("erlCookie", ""); |
| | | appConfig.setStringProperty("erlPath", ""); |
| | | appConfig.setStringProperty("erlFatherNode", ""); |
| | | appConfig.setStringProperty("clusterID", ""); |
| | | appConfig.save(); |
| | | delete erlangDbTool; |
| | | erlangDbTool = nullptr; |
| | |
| | | std::string img_base64 = value["img_base64"].asString(); |
| | | std::string idcard = value["idcard"].asString(); |
| | | std::string strUUID = value["uuid"].asString(); |
| | | // if (strUUID.size() > 0) { |
| | | // bool ret_addPerson = false; |
| | | // if (TableName.find("lt_") == 0) { |
| | | // FieldValues fieldValues; |
| | | // AddFaceData addFaceData; |
| | | // //#todo update table |
| | | // addFaceData.uuid = strUUID; |
| | | // addFaceData.faceUrl = img_url; |
| | | // |
| | | // fieldValues.insert(std::make_pair("uuid", strUUID)); |
| | | // fieldValues.insert(std::make_pair("idCard", idcard)); |
| | | // m_SqliteFaceEncap.updateFace(TableName, addFaceData, fieldValues); |
| | | // } else { |
| | | // ret_addPerson = erlangDbTool->addPerson(strUUID, TableName, feature_base64, img_url, idcard); |
| | | // } |
| | | // } |
| | | |
| | | cv::Mat image; |
| | | if (img_url.size() > 0) { |
| | | |
| | | if (img_url.find("ManCarAnaly") != string::npos && img_url.find("group") != string::npos) { |
| | | auto pos = img_url.find("group"); |
| | | auto img_tmp = img_url.substr(pos); |
| | | std::string img_str = "http://"; |
| | | if (fdfsClient.fastFds != nullptr) { |
| | | img_str.append(fdfsClient.fastFds->getIp() + "/").append(img_tmp); |
| | | img_url.swap(img_str); |
| | | } |
| | | } |
| | | |
| | | auto t_results = m_curlDownloadImg.download_jpeg(const_cast<char *>(img_url.c_str())); |
| | | DBG(img_url << "t_results size is " << t_results.all << " : " << t_results.buffer.size()); |
| | | cvutil.buffer2CvMat(t_results.buffer, image); |
| | | } else if (img_base64.size() > 0) { |
| | | auto str_img = base64.Decode(img_base64.c_str(), img_base64.size()); |
| | |
| | | |
| | | if (faceResults.size() <= 0) { |
| | | response->write(SimpleWeb::StatusCode::server_error_not_implemented, "{\"error\":\"not found face\"}"); |
| | | // string str_path = "./img/"; |
| | | // str_path.append(AppUtil::getTimeString() + ".jpg"); |
| | | // cv::imwrite(str_path, image); |
| | | system("mkdir -p img"); |
| | | string str_path = "./img/"; |
| | | str_path.append(AppUtil::getTimeString() + ".jpg"); |
| | | cv::imwrite(str_path, image); |
| | | return ""; |
| | | // return "{\"error\":\"not found face\"}"; |
| | | } else if (faceResults.size() > 1) { |
| | |
| | | } |
| | | } |
| | | fdfsClient.rwLock.unlock(); |
| | | |
| | | } |
| | | auto size = feature_base64.size(); |
| | | // std::string uuid = ""; |
| | |
| | | std::string str_tmpTime = AppUtil::getCmdResult(cmd_getVideoFileTime); |
| | | |
| | | |
| | | |
| | | if (str_time > str_tmpTime) { |
| | | |
| | | //str_time = str_tmpTime.size() > 0 ? str_tmpTime : str_time; |
| | | qint64 v_time=getVideoTime(str_tmpTime)-1000; |
| | | int haomiao = (v_time % 1000) > 50 ? ((v_time % 1000) - 50) : 0; |
| | | v_time /= 1000; |
| | | int m = v_time; |
| | | int shi, fen, miao; |
| | | char ch_time[128]; |
| | | if (m / 3600 < 24) { |
| | | shi = m / 3600; |
| | | fen = m / 60 % 60; |
| | | miao = m % 60; |
| | | sprintf(ch_time, "%02d:%02d:%02d.%02d", shi, fen, miao, haomiao / 10); |
| | | qint64 v_time = getVideoTime(str_tmpTime) - 1000; |
| | | int haomiao = (v_time % 1000) > 50 ? ((v_time % 1000) - 50) : 0; |
| | | v_time /= 1000; |
| | | int m = v_time; |
| | | int shi, fen, miao; |
| | | char ch_time[128]; |
| | | if (m / 3600 < 24) { |
| | | shi = m / 3600; |
| | | fen = m / 60 % 60; |
| | | miao = m % 60; |
| | | sprintf(ch_time, "%02d:%02d:%02d.%02d", shi, fen, miao, haomiao / 10); |
| | | |
| | | } else printf("输入数值太大"); |
| | | } else printf("输入数值太大"); |
| | | |
| | | str_time=ch_time; |
| | | ERR("{\"error\":\"Time error\"}" << str_time << " str_tmpTime " << str_tmpTime<<" ch_time="<<ch_time); |
| | | str_time = ch_time; |
| | | ERR("{\"error\":\"Time error\"}" << str_time << " str_tmpTime " << str_tmpTime << " ch_time=" |
| | | << ch_time); |
| | | // return "{\"error\":\"Time error\"}"; |
| | | } |
| | | |
| | |
| | | std::string devHttpServer_c::getVideoPathByTime(const std::string &time, const std::string &camId, qint64 &sub) { |
| | | std::string t_FilePath = appConfig.getStringProperty("cutPath"); |
| | | |
| | | bool find = false;; |
| | | bool find = false; |
| | | if (t_FilePath.back() != '/') { |
| | | t_FilePath.push_back('/'); |
| | | } |
| | |
| | | |
| | | } |
| | | |
| | | qint64 devHttpServer_c::getVideoTime(/*const std::string &videoPath,*/std::string& str_tmpTime) { |
| | | qint64 devHttpServer_c::getVideoTime(/*const std::string &videoPath,*/std::string &str_tmpTime) { |
| | | // std::string cmd_getVideoFileTime( |
| | | // " ffmpeg -i '" + videoPath + "' 2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//"); |
| | | |
| | |
| | | // return "{\"error\":\"传输错误,请检查!\"}"; |
| | | } |
| | | } |
| | | |
| | | std::string devHttpServer_c::editSdkRule(std::string ip, unsigned int port, std::string content, PResponse &response) { |
| | | Json::Reader reader; |
| | | Json::Value value; |
| | | Json::FastWriter writer; |
| | | if (reader.parse(content, value)) { |
| | | SdkRule rule; |
| | | rule.nSdkType = value["nSdkType"].asInt(); |
| | | rule.nAlarmNumLowerLimit = value["nAlarmNumLowerLimit"].asInt(); |
| | | rule.nAlarmNumUpperLimit = value["nAlarmNumUpperLimit"].asInt(); |
| | | rule.nTriggerDelay = value["nTriggerDelay"].asInt(); |
| | | rule.nTriggerTolerance = value["nTriggerTolerance"].asInt(); |
| | | rule.nThreshold = value["nThreshold"].asInt(); |
| | | rule.nQuality = value["nQuality"].asInt(); |
| | | rule.nIsRun = value["nIsRun"].asInt(); |
| | | rule.strBroadcast = value["nIsBroadcast"].asCString(); |
| | | rule.strAreas = value["strAreas"].asCString(); |
| | | rule.strCamId = value["strCamId"].asCString(); |
| | | rule.strExAreas = value["strExAreas"].asCString(); |
| | | rule.strLine = value["strLine"].asCString(); |
| | | rule.strExLine = value["strExLine"].asCString(); |
| | | if (rule.strCamId.isEmpty()) { |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | if (rule.nSdkType <= SdkTypeStart || rule.nSdkType >= SdkTypeEnd) { |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | |
| | | for (int i = 0; i < value["weekRuleArray"].size(); ++i) { |
| | | Json::Value item = value["weekRuleArray"][i]; |
| | | LActRuleWeekRecord weekRule; |
| | | weekRule.m_nSdkType = rule.nSdkType; |
| | | weekRule.m_nType = item["nType"].asInt(); |
| | | weekRule.m_strCamId = rule.strCamId; |
| | | weekRule.m_strBegin = item["strBegin"].asCString(); |
| | | weekRule.m_strEnd = item["strEnd"].asCString(); |
| | | //rule.weekRuleVec.push_back(weekRule); |
| | | db_c.updateCameraWeekRule(weekRule); |
| | | } |
| | | |
| | | |
| | | if (db_c.updateSdkRule(rule)) { |
| | | // if(rule.nIsRun==1) |
| | | |
| | | killVideoAnalysFromHCApp(); |
| | | sleep(1); |
| | | runAllApp(); |
| | | |
| | | |
| | | return "{\"ret_status\": \"ok_ack\"}"; |
| | | } else { |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | } else { |
| | | return "{\"error\":\"传输错误,请检查!\"}"; |
| | | } |
| | | } |
| | | |
| | | std::string devHttpServer_c::findSdkRule(std::string ip, unsigned int port, std::string content, PResponse &response) { |
| | | Json::Reader reader; |
| | | Json::Value value; |
| | | |
| | | if (reader.parse(content, value)) { |
| | | |
| | | QString strCamId = value["strCamId"].asCString(); |
| | | |
| | | SdkRuleMap ruleMap = db_c.searchSdkRuleByCamId(strCamId); |
| | | |
| | | int count = ruleMap.size(); |
| | | |
| | | if (count > 0) { |
| | | Json::Value objs; |
| | | Json::Value obj; |
| | | |
| | | for (auto rule:ruleMap) { |
| | | obj["nSdkType"] = rule.second.nSdkType; |
| | | obj["nAlarmNumLowerLimit"] = rule.second.nAlarmNumLowerLimit; |
| | | obj["nAlarmNumUpperLimit"] = rule.second.nAlarmNumUpperLimit; |
| | | obj["nTriggerDelay"] = rule.second.nTriggerDelay; |
| | | obj["nTriggerTolerance"] = rule.second.nTriggerTolerance; |
| | | obj["nThreshold"] = rule.second.nThreshold; |
| | | obj["nQuality"] = rule.second.nQuality; |
| | | obj["nIsRun"] = rule.second.nIsRun; |
| | | obj["nIsBroadcast"] = rule.second.strBroadcast.toStdString(); |
| | | obj["strAreas"] = rule.second.strAreas.toStdString(); |
| | | obj["strCamId"] = rule.second.strCamId.toStdString(); |
| | | obj["strExAreas"] = rule.second.strExAreas.toStdString(); |
| | | obj["strLine"] = rule.second.strLine.toStdString(); |
| | | obj["strExLine"] = rule.second.strExLine.toStdString(); |
| | | Json::Value weekRuleArray; |
| | | |
| | | |
| | | Json::Value weekRule; |
| | | std::vector<LActRuleWeekRecord> weekRuleVec = db_c.searchCameraWeekRuleByCamId(strCamId, rule.first); |
| | | for (int k = 0; k < weekRuleVec.size(); ++k) { |
| | | Json::Value weekRuleObj; |
| | | weekRuleObj["nSdkType"] = weekRuleVec[k].m_nSdkType; |
| | | weekRuleObj["strCamId"] = weekRuleVec[k].m_strCamId.toStdString(); |
| | | weekRuleObj["strBegin"] = weekRuleVec[k].m_strBegin.toStdString(); |
| | | weekRuleObj["strEnd"] = weekRuleVec[k].m_strEnd.toStdString(); |
| | | weekRuleObj["nType"] = weekRuleVec[k].m_nType; |
| | | weekRule.append(weekRuleObj); |
| | | } |
| | | //weekRuleArray[j]=weekRule; |
| | | |
| | | |
| | | obj["weekRuleArray"] = weekRule; |
| | | objs.append(obj); |
| | | } |
| | | return objs.toStyledString(); |
| | | } else { |
| | | // return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | return "[]"; |
| | | } |
| | | } else { |
| | | return "{\"error\":\"传输错误,请检查!\"}"; |
| | | } |
| | | } |
| | | |
| | | std::string devHttpServer_c::getSnapshot(std::string ip, unsigned int port, std::string content, PResponse &response) { |
| | | Json::Reader reader; |
| | | Json::Value value; |
| | | |
| | | if (reader.parse(content, value)) { |
| | | |
| | | std::string ip = value["str_ip"].asString(); |
| | | // int port= value["n_port"].asInt(); |
| | | int port = 554; |
| | | std::string username = value["str_username"].asString(); |
| | | std::string pass = value["str_password"].asString(); |
| | | std::string brand = value["str_brand"].asString(); |
| | | std::string rtsp_url = rtspAddrBuild(ip, port, username, pass, brand); |
| | | if (rtsp_url.empty() ) |
| | | { |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | // unsigned char serialnumber[SERIALNO_LEN] = {0}; |
| | | // int ret = getDevSerialNumber(ip.c_str(), port,username.c_str(),pass.c_str(),brand.c_str(),serialnumber); |
| | | |
| | | |
| | | // if ((!ret) || (serialnumber[0] == 0)) |
| | | // { |
| | | // return "{\"ret_status\": \"内容有误,请检查!\"}"; |
| | | // } |
| | | |
| | | // std::string str_cam_dev_id = std::string((char *) serialnumber);//摄像机id cam_mac |
| | | |
| | | std::string str_imgName = appConfig.getStringProperty("cutPath"); |
| | | if (str_imgName.back() != '/') { |
| | | str_imgName.push_back('/'); |
| | | } |
| | | str_imgName +=ip; |
| | | str_imgName +="-"; |
| | | str_imgName += "snapshot.jpg"; |
| | | //admin:a1234567@192.168.1.201:554/h264/ch1/main/av_stream -r 1/25 -f image2 -s 1920*1080 /home/basic/work_src/a.jpg |
| | | std::string cmd("ffmpeg -i " + rtsp_url + " -r 1/25 -f image2 -s 1920*1080 -y " + str_imgName); |
| | | DBG(cmd); |
| | | system(cmd.c_str()); |
| | | |
| | | cv::Mat img = cv::imread(str_imgName); |
| | | |
| | | if (img.empty()) { |
| | | |
| | | return "{\"ret_status\":\"内容有误,请检查!\"}"; |
| | | } |
| | | fdfsClient.rwLock.rdlock(); |
| | | std::string strImgUrl = "http://"; |
| | | if (fdfsClient.fastFds != nullptr) { |
| | | std::vector<unsigned char> buffer; |
| | | CvUtil::cvMat2Buffer(img, buffer); |
| | | std::string strImgUrlTmp = ""; |
| | | fdfsClient.fastFds->uploadFile(buffer, strImgUrlTmp, "jpg"); |
| | | strImgUrl.append(fdfsClient.fastFds->getIp() + "/" + strImgUrlTmp); |
| | | strImgUrl.clear(); |
| | | strImgUrl = strImgUrlTmp; |
| | | } |
| | | fdfsClient.rwLock.unlock(); |
| | | Json::Value result; |
| | | result["imgUrl"] = strImgUrl; |
| | | |
| | | return result.toStyledString(); |
| | | |
| | | |
| | | } else { |
| | | return "{\"error\":\"传输错误,请检查!\"}"; |
| | | } |
| | | } |
| | | |