嵌入式Linux系统基于libevent&openssl的https服务

1 重新交叉编译libevent

首先我们需要修改configure文件:

嵌入式Linux系统基于libevent&openssl的https服务

给OPENSSL_INCS指定为openssl库的绝对路径/相对路径:

嵌入式Linux系统基于libevent&openssl的https服务

然后运行命令:

./configure OPENSSL_LIBADD="-L../../openssl/openssl-1.0.2d -lssl -lcrypto" --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc

这里-L后面加的路径需要根据实际情况而定,可以是相对路径,也可以是绝对路径!

嵌入式Linux系统基于libevent&openssl的https服务

没有提示error就是成功了,接着我们进行编译,直接运行命令即可: make

嵌入式Linux系统基于libevent&openssl的https服务

编译成功生成对应的动态库。

查看文件属性,如果是ARM平台就说明编程没有问题了:

嵌入式Linux系统基于libevent&openssl的https服务

2  httpd

libevent库中包含了http的组件API,我们可以基于这些API实现http的server,API的头文件主要在 libevent-2.1.12-stable/include/event2/http.h 中。

httpd是我们基于libevent针对http封装出来的类,将其中API调用的细节进行了统一处理,因此借助httpd可以非常容易搭建出http(s)服务器出来,主要接口如下:

嵌入式Linux系统基于libevent&openssl的https服务

两个构造函数,第一个是搭建http服务器,第二个需要证书和私钥用于搭建https服务器;参数需要给ev_proxy的对象指针还有port,port是网络端口。收到数据后会回调on_request给上层应用,上层应用处理完需要调用on_response进行响应。

首先我们看看如何基于httpd构建一个https服务器:

嵌入式Linux系统基于libevent&openssl的https服务

非常简单,定义一个类继承httpd,然后把必须的参数给到httpd,有数据了就会调用到on_request函数中,我们调用on_response进行响应即可;主函数就更简单了,实例化shttpd就可以。

核心源码在于httpd.cpp中,有几个地方需要说明下:

a、构造函数

嵌入式Linux系统基于libevent&openssl的https服务

构造函数中会初始化ssl_,true表示https,false表示http,然后在builder中启动服务器,builder根据ssl_确定是否要初始ssl:

嵌入式Linux系统基于libevent&openssl的https服务

evhttp_new是实例化一个http对象;

evhttp_set_cb可以根据URI来设置回调函数,比如”/app”;

ssl_init 实际上是和openssl有关系:

嵌入式Linux系统基于libevent&openssl的https服务

基本就是初始化,设置证书,设置**等操作。

HTTP是一个请求/响应的逻辑,httpd中设置了响应的超时时间3500ms,如果超时了,那么会自动回复客户端一个错误,这个时间可以在on_request中进行修改:

void httpd::on_request(struct evhttp_request *req, const char *tag)

中有一句代码: session->ticks = 35; // 35 * 100ms

3  应用实例

代码树如下:

嵌入式Linux系统基于libevent&openssl的https服务

Makefile 需要链接libevent和openssl:

嵌入式Linux系统基于libevent&openssl的https服务

直接编译即可:

嵌入式Linux系统基于libevent&openssl的https服务

编译成功会生成shttpd,由于是交叉编译,因此需要copy到板子上运行,我们也可以编译出X86下的应用做测试;http调试的客户端很多,可以手机下载一个http client,也可以用curl工具。

测试如下,客户端使用curl,发送:curl -H "Content-Type:application/json" -X GET --connect-timeout 4 -m 2 -k -g -d '{"info":"hello"}' https://127.0.0.1:8080/app

嵌入式Linux系统基于libevent&openssl的https服务

服务端接收后调用on_responsed进行响应,客户端接收后打印出来;补充说明一下,由于https需要证书和**,我们放在pem目录中:

嵌入式Linux系统基于libevent&openssl的https服务

大家根据代码设置所在路径即可。

 

============================================================================================================================================================

如果觉得对您有帮助并想进一步深入学习交流可以扫描以下微信二维码或加入QQ群:928840648

欢迎共同学习成长,有一群爱学习的小伙伴一起勉励!!一起加油!!也可点击

嵌入式Linux系统基于libevent&openssl的https服务

 

笔者基于嵌入式系统框架内容如下整理编辑:

嵌入式Linux系统基于libevent&openssl的https服务