1.交叉编译curl
1.下载 openssl https://www.openssl.org/source/
$ ./configure CPPFLAGS="-I/opt/xm_toolchain/arm-xmv2-linux/usr/include" LDFLAGS="-L/opt/xm_toolchain/arm-xmv2-linux/usr/lib -lssl -lcrypto" --host=arm-xmv2-linux-uclibcgnueabi CC=/opt/xm_toolchain/arm-xmv2-linux/usr/bin/arm-xmv2-linux-uclibcgnueabi-gcc --with-ssl --enable-static --enable-shared --prefix=$PWD/__install
$ make
$ make install
2.post
/*******************************************************************************
* Function Name : SendPostData
* Create Date : 2020-2-23
* Description :
* Param :
* data
*
* Return Code : None
*******************************************************************************/
int SendPostData(char *data)
{
CURL *curl;
CURLcode res;
char sign[33] = {0};
char h_detector[50] = "detector:";
char h_sign[50] = "sign:";
char h_timestamp[50]= "timestamp:";
get_header_sign(Detector ,"25B1CA679B7C2283",sign);
strcat(h_timestamp,Timestamp);//"timestamp:1611540682"
strcat(h_detector ,Detector );//detector:RF_50_00000004
strcat(h_sign ,"93E562D1242373FC3D0C00F955A4307F" );//sign:93E562D1242373FC3D0C00F955A4307F
// printf("%s\r\n",h_sign);
// printf("%s\r\n",h_detector);
// printf("%s\r\n",h_timestamp);
struct curl_slist *headerlist = NULL;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
// 设置http发送的内容类型为JSON
headerlist = curl_slist_append(headerlist, "Accept:application/json");
headerlist = curl_slist_append(headerlist, "Content-Type:application/json");
headerlist = curl_slist_append(headerlist, "charset:utf-8");
headerlist = curl_slist_append(headerlist, h_detector);
headerlist = curl_slist_append(headerlist, h_sign);
headerlist = curl_slist_append(headerlist, "timestamp:1611540682");
if (curl)
{
// 设置超时时间
curl_easy_setopt(curl, CURLOPT_TIMEOUT, REV_TIME);
//连接超时,这个数值如果设置太短可能导致数据请求不到就断开了
curl_easy_setopt( curl, CURLOPT_CONNECTTIMEOUT,CON_TIME);
/* what URL that receives this POST */
curl_easy_setopt(curl, CURLOPT_URL, STATIC);// 设置url
// 设置http发送的内容类型为JSON
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
// 设置要POST的JSON数据
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, data);
//设置接收到的数据的缓存地址,
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void*)recv);
//setpost 请求
curl_easy_setopt(curl, CURLOPT_POST, 1);
//set 回调函数接受的数据不包含消息头
curl_easy_setopt(curl, CURLOPT_HEADER, false);
//设置回调函数,用来接受数据
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
printf("data = %s\r\n",data);
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
{
printf("curl url_easy_perform() failed:%s \n",curl_easy_strerror(res));
return -1;
}
/* always cleanup */
curl_easy_cleanup(curl);
/* then cleanup the formpost chain */
//curl_formfree(formpost);
/* free slist */
curl_slist_free_all (headerlist);
}
curl_global_cleanup();
return 0;
}
3.form post
int SendPostMeassage(char *new, char *fileName, uint formtype){
CURL *curl;
CURLM *multi_handle;
struct curl_slist *headerlist = NULL;
struct curl_httppost *formpost = NULL;
struct curl_httppost *lastptr = NULL;
int still_running = 0;
printf("data = %s\r\n",new);
curl = curl_easy_init();
multi_handle = curl_multi_init();
/* Fill in the file upload field. This makes libcurl load data from
the given file name when curl_easy_perform() is called. */
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "meta_data",
CURLFORM_COPYCONTENTS, new,
CURLFORM_END);
if(formtype == PARK_IMG){
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "full_image",
CURLFORM_FILE,fileName,
CURLFORM_END);
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "feature_image",
CURLFORM_FILE,fileName,
CURLFORM_END);
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "plate_image",
CURLFORM_FILE,fileName,
CURLFORM_END);
}
else if (formtype == PARK_MDF)
{
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "feature_image",
CURLFORM_FILE,fileName,
CURLFORM_END);
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "plate_image",
CURLFORM_FILE,fileName,
CURLFORM_END);
}
else if (formtype == SNAPSHOT_IMG)
{
curl_formadd(&formpost,
&lastptr,
CURLFORM_COPYNAME, "snapshot_image",
CURLFORM_FILE,fileName,
CURLFORM_END);
}
// 设置http发送的内容类型为JSON
headerlist = curl_slist_append(headerlist, "detector:RF_50_00000004");
headerlist = curl_slist_append(headerlist, "sign:93E562D1242373FC3D0C00F955A4307F");
headerlist = curl_slist_append(headerlist, "timestamp:1611540682");
if(curl && multi_handle) {
// 设置超时时间
curl_easy_setopt(curl, CURLOPT_TIMEOUT, REV_TIME);
//连接超时,这个数值如果设置太短可能导致数据请求不到就断开了
curl_easy_setopt( curl, CURLOPT_CONNECTTIMEOUT,CON_TIME);
/* what URL that receives this POST */
if(formtype == PARK_IMG){
curl_easy_setopt(curl, CURLOPT_URL, IN_OUTIMAGEURL);
}
else if (formtype == PARK_MDF)
{
curl_easy_setopt(curl, CURLOPT_URL, CHACKURL);
}
else if (formtype == SNAPSHOT_IMG)
{
curl_easy_setopt(curl, CURLOPT_URL, TIMEUPURL);
}
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
//set 回调函数接受的数据不包含消息头
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
curl_easy_setopt(curl, CURLOPT_HEADER, false);
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
//设置回调函数,用来接受数据
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_multi_add_handle(multi_handle, curl);
curl_multi_perform(multi_handle, &still_running);
while(still_running) {
struct timeval timeout;
int rc; /* select() return code */
CURLMcode mc; /* curl_multi_fdset() return code */
fd_set fdread;
fd_set fdwrite;
fd_set fdexcep;
int maxfd = -1;
long curl_timeo = -1;
FD_ZERO(&fdread);
FD_ZERO(&fdwrite);
FD_ZERO(&fdexcep);
/* set a suitable timeout to play around with */
timeout.tv_sec = 1;
timeout.tv_usec = 0;
curl_multi_timeout(multi_handle, &curl_timeo);
if(curl_timeo >= 0) {
timeout.tv_sec = curl_timeo / 1000;
if(timeout.tv_sec > 1)
timeout.tv_sec = 1;
else
timeout.tv_usec = (curl_timeo % 1000) * 1000;
}
/* get file descriptors from the transfers */
mc = curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
if(mc != CURLM_OK) {
fprintf(stderr, "curl_multi_fdset() failed, code %d.\n", mc);
break;
}
/* On success the value of maxfd is guaranteed to be >= -1. We call
select(maxfd + 1, ...); specially in case of (maxfd == -1) there are
no fds ready yet so we call select(0, ...) --or Sleep() on Windows--
to sleep 100ms, which is the minimum suggested value in the
curl_multi_fdset() doc. */
if(maxfd == -1) {
#ifdef _WIN32
Sleep(100);
rc = 0;
#else
/* Portable sleep for platforms other than Windows. */
struct timeval wait = { 0, 100 * 1000 }; /* 100ms */
rc = select(0, NULL, NULL, NULL, &wait);
#endif
}
else {
/* Note that on some platforms 'timeout' may be modified by select().
If you need access to the original value save a copy beforehand. */
rc = select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout);
}
switch(rc) {
case -1:
/* select error */
break;
case 0:
default:
/* timeout or readable/writable sockets */
//printf("perform!\n");
curl_multi_perform(multi_handle, &still_running);
//printf("running: %d!\n", still_running);
break;
}
}
curl_multi_cleanup(multi_handle);
/* always cleanup */
curl_easy_cleanup(curl);
/* then cleanup the formpost chain */
curl_formfree(formpost);
/* free slist */
curl_slist_free_all(headerlist);
}
curl_global_cleanup();
return 0;
}