我想将CGI命令发送到IP摄像头。 我发e.a. CGI url接收摄像机名称,函数返回正确的名称,所以我认为我的代码很好。
当我从浏览器发送另一个CGI URL时,它正在工作(相机返回“ok”)但是当我尝试使用我的程序发送它时,我的相机没有返回任何内容,并且参数未设置在相机中。
这是我的代码:
string data; //will hold the url's contents
size_t writeCallback(char* buf, size_t size, size_t nmemb, void* up)
{ for (int c = 0; c<size*nmemb; c++)
{
data.push_back(buf[c]);
}
return size*nmemb; //tell curl how many bytes we handled
}
string send_CGI_command(string username, string password, string port, string URL)
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if(curl) {
curl_global_init(CURL_GLOBAL_ALL); //pretty obvious
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_PORT , stoll (port,0,0) );
curl_easy_setopt(curl, CURLOPT_USERNAME , username.c_str());
curl_easy_setopt(curl, CURLOPT_USERPWD , (username + ":" + password).c_str());
curl_easy_setopt(curl, CURLOPT_HTTPAUTH , CURLAUTH_BASIC);
curl_easy_setopt(curl, CURLOPT_URL, (URL).c_str());
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
curl_global_cleanup();
return data;
}
}
我使用此命令请求CGI:
string result = send_CGI_command(get_video_login_cam1(),get_video_password_cam1(),get_video_port_cam1(),"http://" + get_video_ip_cam1() + "/cgi-bin/configManager.cgi?action=setConfig&Locales.DSTEnable=true&Locales.DSTEnd.Day=0&Locales.DSTEnd.Hour=3&Locales.DSTEnd.Minute=0&Locales.DSTEnd.Month=10&Locales.DSTEnd.Week=-1&Locales.DSTEnd.Year=" + std::to_string(1900 + ltm->tm_year) + "&Locales.DSTStart.Day=0&Locales.DSTStart.Hour=2&Locales.DSTStart.Minute=0&Locales.DSTStart.Month=3&Locales.DSTStart.Week=-1&Locales.DSTStart.Year=" + std::to_string(1900 + ltm->tm_year) + "&Locales.TimeFormat=dd-MM-YYYY HH:mm:ss");
cout << endl << result << endl;
这是调试器信息:
* Trying 192.168.1.14... * Connected to 192.168.1.14 (192.168.1.14) port 80 (#0) * Server auth using Basic with user 'admin' > GET /cgi-bin/configManager.cgi?action=setConfig&Locales.DSTEnable=true&Locales.DSTEnd.Day=0&Locales.DSTEnd.Hour=3&Locales.DSTEnd.Minute=0&Locales.DSTEnd.Month=10&Locales.DSTEnd.Week=-1&Locales.DSTEnd.Year=2016&Locales.DSTStart.Day=0&Locales.DSTStart.Hour=2&Locales.DSTStart.Minute=0&Locales.DSTStart.Month=3&Locales.DSTStart.Week=-1&Locales.DSTStart.Year=2016&Locales.TimeFormat=dd-MM-YYYY HH:mm:ss HTTP/1.1 Host: 192.168.1.14 Authorization: Basic YWRtaW46YWRtaW4= Accept: */* * Empty reply from server * Connection #0 to host 192.168.1.14 left intact
我不知道为什么我的完全相同的CGI在浏览器中工作,并且完全相同的cgi不会使用CURL撤回任何内容。就像我在开始时所说的那样,获取设备名称的另一个CGI命令在浏览器中工作并具有相同的CURL代码。
提前感谢您的建议。