树莓派通过HTTP/HTTPS协议访问翔云平台
翔云平台是一个专业的智能识别AP研发团队,可提供证件、发票、车牌、VIN等OCR API服务支持 Windows、 Linux主流服务器系统,我是通过该平台进行人脸识别的程序开发。
树莓派环境搭建
由于之前在Linux中已经进行过有关libcurl库的搭建,Linux中libcurl库的编译.但是之前进行单独的libcurl库安装并不能进行https协议的访问,这里我们还需要进行openssl库的安装,等待我们的openssl库编译完成后,再进行libcurl库编译。
openssl库的编译
1、获取openssl安装压缩包
wget https://www.openssl.org/source/openssl-1.1.1a.tar.gz
2、进行openssl压缩包的解压
tar -xzvf openssl-1.1.1a.tar.gz
3、编译步骤
这里我们就直接使用默认的配置方式进行配置,让它安装在默认路径下,具体的步骤和libcurl基本相同,也是三个步骤:
./configure
sudo make
sudo make install
2、libcurl库编译
这里等待openssl库编译完成后,我们即可继续进行libcurl库的编译,主要这里的编译和之前在Linux中有一些不同,因为我们要进行https协议的访问,需要将ssl库链接配置
具体步骤也是三步:
./configure --prefix=$PWD/_install --with-ssl
sudo make
sudo make install
到此为止就已经树莓派的环境搭建就已经准备完毕了。
代码运行
代码思路
这里代码的编写主要是结合翔云平台给出的一些开发方案进行编写。只需要在我之前的笔记Http协议之libcurl库实现.中的访问百度的代码结合起来进行修改即可
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdlib.h>
#include <curl/curl.h>
#include<string.h>
typedef unsigned int bool;
#define true 1
#define false 0
char buf[1024] = {'\0'};
size_t readBuf( void *ptr, size_t size, size_t nmemb, void *stream)
{
strncpy(buf,ptr,1024);
//printf("=======================getBuf========================\n");
//printf("%s\n",buf);
}
char *getPicBase64(char *PicPath)//翔云平台需要将图片进行base64流进行传输
{
char *bufPic;
char cmd[128] = {'\0'};
sprintf(cmd,"base64 %s > tmpfile",PicPath);
system(cmd);
int fd = open("./tmpfile",O_RDWR);
int fileLen = lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_SET);
bufPic = (char *)malloc(fileLen+2);
memset(bufPic,'\0',fileLen+2);
read(fd,bufPic,fileLen);
close(fd);
system("rm -f tmpfile");
return bufPic;
}
bool postUrl()
{
CURL *curl;
CURLcode res;
char *postString;
char *key = "***********************";//翔云平台提供的key和sercret
char *secret = "*************************";
int typeId = 21;
char *format = "xml";
char *bufPic1 = getPicBase64("./pic1.jpg");
char *bufPic2 = getPicBase64("./pic3.jpg");
int len = strlen(key)+strlen(secret)+strlen(bufPic1)+strlen(bufPic2)+124;
postString = (char *)malloc(len);
memset(postString,'\0',len);
sprintf(postString,"&img1=%s&img2=%s&key=%s&secret=%s&typeId=%d&format=%s",bufPic1,bufPic2,key,secret,typeId,format);
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postString); // 指定post内容
//curl_easy_setopt(curl, CURLOPT_PROXY, "10.99.60.201:8080");
curl_easy_setopt(curl, CURLOPT_URL, "https://netocr.com/api/faceliu.do"); // 指定url
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, readBuf);
res = curl_easy_perform(curl);
printf("OK:%d\n",res);
if(strstr(buf,"是") != NULL){
printf("the same person\n");
}else{
printf("the different person\n");
}
curl_easy_cleanup(curl);
}
return true;
}
int main(void)
{
//getUrl("/tmp/get.html");
postUrl();
}
代码编译
这里要注意在Linux中编译使用的指令:
gcc demo5.c -I /home/pi/faceRecognition/curl-7.71.1/_install/include -L /home/pi/faceRecognition/curl-7.71.1/_install/lib -lcurl
在树莓派中编译会提示错误:
pi@raspberrypi:~/faceRecognition $ gcc demo5.c -I /home/pi/faceRecognition/curl-7.71.1/_install/include -L /home/pi/faceRecognition/curl-7.71.1/_install/lib -lcurl
/home/pi/faceRecognition/curl-7.71.1/_install/lib/libcurl.so: undefined reference to `SSL_CTX_set_keylog_callback@OPENSSL_1_1_1'
/home/pi/faceRecognition/curl-7.71.1/_install/lib/libcurl.so: undefined reference to `SSL_CTX_set_post_handshake_auth@OPENSSL_1_1_1'
/home/pi/faceRecognition/curl-7.71.1/_install/lib/libcurl.so: undefined reference to `SSL_CTX_set_ciphersuites@OPENSSL_1_1_1'
这里要使用这条指令进行编译:
gcc demo5.c -I /home/pi/faceRecognition/curl-7.71.1/_install/include -L /home/pi/faceRecognition/curl-7.71.1/_install/lib -lcurl -lssl -lcrypto
然后代码就能编译成功了:
代码运行结果
pi@raspberrypi:~/faceRecognition $ ./a.out
OK:23
the different person
注意图片放的位置和图片的名字。