#include "httpclient.h" #include "netcamera.h" #include #include static size_t OnWriteData(void* buffer, size_t size, size_t nmemb, void* lpVoid) { std::vector* data = (std::vector*)lpVoid; if( NULL == data || NULL == buffer ) { XYLOG(XYLOG_SEVERITY_ERROR,"OnWriteData callback -1"); return -1; } uint8_t* begin = (uint8_t *)buffer; uint8_t* end = begin + size * nmemb; data->insert(data->end(), begin, end); return nmemb; } static int SockOptCallback(void *clientp, curl_socket_t curlfd, curlsocktype purpose) { net_handle_t netHandle = *((net_handle_t *)clientp); int res = android_setsocknetwork(netHandle, curlfd); if (res == -1) { int errcode = errno; printf("android_setsocknetwork errno=%d", errcode); XYLOG(XYLOG_SEVERITY_ERROR,"setsocknetwork -1, errcode=%d",errcode); } return res == 0 ? CURL_SOCKOPT_OK : CURL_SOCKOPT_ERROR; } int DoGetRequest(const char* url, int authType, const char* userName, const char* password, net_handle_t netHandle, std::vector& data) { CURLcode nRet; std::string auth; CURL *curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "GET"); curl_easy_setopt(curl, CURLOPT_URL, url); if (authType != HTTP_AUTH_TYPE_NONE) { if (userName != NULL && password != NULL && strlen(userName) > 0) { auth = userName; auth += ":"; auth += password; curl_easy_setopt(curl, CURLOPT_USERPWD, auth.c_str()); // DIGEST Auth if (authType == HTTP_AUTH_TYPE_BASIC) { curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); } else if (authType == HTTP_AUTH_TYPE_DIGEST) { curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); } } } if (netHandle != NETWORK_UNSPECIFIED) { curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, SockOptCallback); curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, &netHandle); } curl_easy_setopt(curl, CURLOPT_FAILONERROR, 1); curl_easy_setopt(curl, CURLOPT_USERAGENT , "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36"); // curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); // 设置回调函数的参数,获取反馈信息 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); // 接收数据时超时设置,如果5秒内数据未接收完,直接退出 #ifndef NDEBUG curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); #else curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); #endif // 设置重定向次数,防止重定向次数太多 curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 4); // 连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); nRet = curl_easy_perform(curl); long responseCode = 0; if (CURLE_OK == nRet) { curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode); if (responseCode != 200) { // #ifdef _DEBUG char * log = new char[data.size() + 16]; memset(&log[0], 0, data.size()); snprintf(log, data.size() + 16, "%d", (int)responseCode); if (!data.empty()) { strcat(log, " "); memcpy(&log[strlen(log)], &data[0], data.size()); } // printf("%s", log); XYLOG(XYLOG_SEVERITY_ERROR, log); delete[] log; // #endif } } else { curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &responseCode); XYLOG(XYLOG_SEVERITY_WARNING, "Net Photo failure, nRet=%d, code=%d", (int)nRet, (int)responseCode); // printf("GET err=%d", nRet); } curl_easy_cleanup(curl); return ((0 == nRet) && (responseCode == 200)) ? 0 : 1; } int DoPutRequest(const char* url, int authType, const char* userName, const char* password, net_handle_t netHandle, const char* contents, std::vector& data) { std::string auth; CURL *curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT"); curl_easy_setopt(curl, CURLOPT_URL, url); if (authType != HTTP_AUTH_TYPE_NONE) { if (userName != NULL && password != NULL && strlen(userName) > 0) { auth = userName; auth += ":"; auth += password; curl_easy_setopt(curl, CURLOPT_USERPWD, auth.c_str()); // DIGEST Auth if (authType == HTTP_AUTH_TYPE_BASIC) { curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); } else if (authType == HTTP_AUTH_TYPE_DIGEST) { curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST); } } } if (netHandle != NETWORK_UNSPECIFIED) { curl_easy_setopt(curl, CURLOPT_SOCKOPTFUNCTION, SockOptCallback); curl_easy_setopt(curl, CURLOPT_SOCKOPTDATA, &netHandle); } if(contents != NULL) curl_easy_setopt(curl, CURLOPT_POSTFIELDS, contents); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, OnWriteData); // 设置回调函数的参数,获取反馈信息 curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data); // 接收数据时超时设置,如果5秒内数据未接收完,直接退出 curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60); // 设置重定向次数,防止重定向次数太多 curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 4); // 连接超时,这个数值如果设置太短可能导致数据请求不到就断开了 curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10); CURLcode nRet = curl_easy_perform(curl); if (CURLE_OK != nRet) { printf("GET err=%d", nRet); } curl_easy_cleanup(curl); return (0 == nRet) ? 0 : 1; } bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo) { bool res = false; std::vector data; const char* userName = NULL; const char* password = NULL; if (photoInfo.authType != 0) { userName = photoInfo.userName; password = photoInfo.password; } std::string url = "http://"; url += photoInfo.ip; url += photoInfo.url; int nRet = DoGetRequest(url.c_str(), photoInfo.authType, userName, password, photoInfo.netHandle, data); if (0 == nRet) { if (!data.empty()) { FILE *fp = fopen(photoInfo.outputPath, "wb"); if (fp != NULL) { fwrite(&data[0], data.size(), 1, fp); fdatasync(fileno(fp)); fclose(fp); res = true; } } } return res; } bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img) { bool res = false; const char* userName = NULL; const char* password = NULL; // if (photoInfo.authType != 0) { userName = photoInfo.userName; password = photoInfo.password; } std::string url = "http://"; url += photoInfo.ip; url += photoInfo.url; int nRet = DoGetRequest(url.c_str(), photoInfo.authType, userName, password, photoInfo.netHandle, img); return (0 == nRet); } int UniviewResolutionSet(const NET_PHOTO_INFO& photoInfo, int channel, unsigned int cmd) { std::string path = "/LAPI/V1.0/Channels/" + std::to_string(channel) + "/Media/Capture"; Json::Value outdata; // 创建 Json::Value 对象来存储 JSON 数据 uniview_resolution_jsoncpp_file_info(outdata, cmd); Json::StreamWriterBuilder writer; std::string sendbuf = Json::writeString(writer, outdata); std::vector respContent; DoPutRequest(path.c_str(), photoInfo.authType, photoInfo.userName, photoInfo.password, photoInfo.netHandle, sendbuf.c_str(), respContent); // respContent.push_back(0); // XYLOG(XYLOG_SEVERITY_DEBUG, "Sendlen= %zu, respContent=%s", sendbuf.size(), (const char*)&respContent[0]); return 0; } int uniview_resolution_jsoncpp_file_info(Json::Value &outdata, unsigned int cmd) { PIC_RESOLUTION pic_resol[] = { {352,288},{640,360},{720,576},{1280,720},{1920,1080},{2688,1520},{3072,2048},{3840,2160},{2560,1440},{704,288} }; outdata["Enable"] = 1; Json::Value Resolution; outdata["Resolution"] = Resolution; if ((cmd < 1) || (cmd > 10)) { cmd = 5; } Resolution["Width"] = pic_resol[cmd-1].width; Resolution["Height"] = pic_resol[cmd-1].height; outdata["Picturesize"] = 900; return 0; } namespace nc_hk { bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img) { bool res = false; const char* userName = NULL; const char* password = NULL; if (photoInfo.authType != 0) { userName = photoInfo.userName; password = photoInfo.password; } std::string url = "http://"; url += photoInfo.ip; url += photoInfo.url; int nRet = DoGetRequest(url.c_str(), photoInfo.authType, userName, password, photoInfo.netHandle, img); #ifdef _DEBUG if (0 == nRet) { FILE *fp = fopen("/sdcard/com.xypower.mpapp/tmp/netimg.jpg", "wb"); if (fp != NULL) { fwrite(&img[0], img.size(), 1, fp); fclose(fp); } } #endif return (0 == nRet); } } namespace nc_ys { bool requestCapture(uint8_t channel, uint8_t preset, const NET_PHOTO_INFO& photoInfo, std::vector& img) { bool res = false; const char* userName = NULL; const char* password = NULL; if (photoInfo.authType != 0) { userName = photoInfo.userName; password = photoInfo.password; } std::string url = "http://"; url += photoInfo.ip; url += photoInfo.url; int nRet = DoGetRequest(url.c_str(), photoInfo.authType, userName, password, photoInfo.netHandle, img); #ifdef _DEBUG if (0 == nRet) { FILE *fp = fopen("/sdcard/com.xypower.mpapp/tmp/netimg.jpg", "wb"); if (fp != NULL) { fwrite(&img[0], img.size(), 1, fp); fclose(fp); } } #endif return (0 == nRet); } }