c++的web框架Restbed介绍及在嵌入式Linux下的移植详解

随着物联网和嵌入式设备的普及,开发高性能的网络服务变得愈发重要。Restbed是一个用于构建RESTful APIs的轻量级C++框架,因其简洁而强大的特性,成为开发者的热门选择。本文将介绍Restbed框架及其在嵌入式Linux平台上的移植方法。

一、Restbed框架简介

Restbed是一个用C++编写的轻量级RESTful框架,专注于简化和加速RESTful Web服务的开发。其核心特性包括:

  1. 高性能:Restbed设计优化以确保极低的延迟和高吞吐量,适合处理大量并发请求。
  2. 简洁易用:提供简单明了的API,使得开发者可以快速上手并实现HTTP服务。
  3. 支持异步处理:能够高效处理异步请求,适合实时应用。
  4. 灵活的路由机制:支持将请求路由到不同的处理函数,便于管理和组织代码。
  5. 跨平台:可以在多种操作系统上运行,包括Linux、Windows和macOS等,适用于多种嵌入式系统。
  6. JSON 支持:Restbed 内置 JSON 支持,可以轻松处理 JSON 请求和响应。
  7. TLS/SSL 支持:Restbed 支持 TLS/SSL 加密,确保通信的安全性。
  8. WebSocket支持:通过单个TCP连接的全双工通信信道。

项目开源地址:GitHub - Corvusoft/restbed: Corvusoft's Restbed framework brings asynchronous RESTful functionality to C++14 applications. 

二、Restbed框架的核心概念

1. 资源(Resource)

在Restbed中,资源是处理HTTP请求的核心。例如,可以为每个API端点定义一个资源。资源可以处理GET、POST、PUT等多种HTTP方法。

2. 会话(Session)

会话负责管理每个HTTP请求和响应的状态信息。开发者可以在会话中设置响应状态、头部以及响应体等。

3. 服务(Service)

服务用于初始化和启动HTTP服务器,注册资源,并处理传入的请求。

三、在嵌入式Linux下的移植步骤

在嵌入式Linux平台上移植Restbed框架,常见的步骤如下:

1. 安装交叉编译工具链

对于大多数嵌入式环境,使用交叉编译工具链至关重要。工具链应与目标平台匹配,例如,ARM架构使用的工具链。

2. 获取Restbed源代码

从Restbed的GitHub仓库或官方网站获取源代码。可以使用Git克隆:

git clone --recursive https://github.com/corvusoft/restbed.git

3. 设置交叉编译环境

在编译前,设置交叉编译相关的环境变量。例如,对于ARM架构:

export CC=/path/to/toolchain/bin/arm-linux-gnueabi-gcc
export CXX=/path/to/toolchain/bin/arm-linux-gnueabi-g++

4. 创建构建目录

在源代码目录中创建一个构建目录:

mkdir restbed/build
cd restbed/build
cmake [-DBUILD_SSL=NO] [-DBUILD_TESTS=NO] ..
make install
make test

5. 配置CMake

使用CMake配置项目,确保指定交叉编译工具链文件。例如创建一个toolchain.cmake文件:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)

set(CMAKE_C_COMPILER /path/to/toolchain/bin/arm-linux-gnueabi-gcc)
set(CMAKE_CXX_COMPILER /path/to/toolchain/bin/arm-linux-gnueabi-g++)

然后运行CMake:

cmake .. -DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake

6. 编译和部署

执行以下命令进行编译:

make

完成后,将生成的二进制文件和库拷贝到目标嵌入式设备中进行部署。

7. 测试

在嵌入式设备上运行编译好的Restbed服务,并使用curl或浏览器测试是否能够成功返回期望的响应。

#include <memory>
#include <cstdlib>
#include <restbed>

using namespace std;
using namespace restbed;

void post_method_handler( const shared_ptr< Session > session )
{
    const auto request = session->get_request( );

    int content_length = request->get_header( "Content-Length", 0 );

    session->fetch( content_length, [ ]( const shared_ptr< Session > session, const Bytes & body )
    {
        fprintf( stdout, "%.*s\n", ( int ) body.size( ), body.data( ) );
        session->close( OK, "Hello, World!", { { "Content-Length", "13" } } );
    } );
}

int main( const int, const char** )
{
    auto resource = make_shared< Resource >( );
    resource->set_path( "/resource" );
    resource->set_method_handler( "POST", post_method_handler );

    auto settings = make_shared< Settings >( );
    settings->set_port( 1984 );
    settings->set_default_header( "Connection", "close" );

    Service service;
    service.publish( resource );
    service.start( settings );

    return EXIT_SUCCESS;
}

 四、移植实战

在嵌入式平台iMX6ULL 下的移植使用:

指定cmake使用的交叉编译工具链(选项:DCMAKE_TOOLCHAIN_FILE)。

在项目根目录下新建个toolchains目录,在此目录下,参照其它开发板的配置文件,添加一个该开发板的配置文件arm-poky-linux-gnueabi.cmake。

内容如下:

set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(CMAKE_C_COMPILER "arm-poky-linux-gnueabi-gcc")
set(CMAKE_CXX_COMPILER "arm-poky-linux-gnueabi-g++")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)

set(CMAKE_C_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi")
set(CMAKE_CXX_FLAGS "-march=armv7-a -mfloat-abi=hard -mfpu=neon --sysroot=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi")

# cache flags
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")

编译构建

在项目根目录下创建build目录,然后cd build,先进入build目录。注意,需要指定-DCMAKE_TOOLCHAIN_FILE。

#先加载环境变量
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi 
 
#在项目根目录,cd build,先进入build目录
ubuntu@VM-8-2-ubuntu:~/test/imax6ul/restbed/build$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE                      _TOOLCHAIN_FILE=../toolchains/arm-poky-linux-gnueabi.cmake -DCMAKE_PREFIX_PATH=/opt/fsl-imx                      -x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/cmake  -DBUILD_SSL=NO                       ../

编译成功,生成在嵌入式linux板子上可以使用的库: 

如何支持SSL

上述构建过程,由于指定了-DBUILD_SSL=NO,没有开启SSL支持。其实如果不指定这个选项,默认就是开启了SSL选项支持。但是直接编译的话,肯定会报错:

CMake Error at cmake/Findopenssl.cmake:16 (message):
  Failed to locate OpenSSL dependency.  see restbed/dependency/openssl
Call Stack (most recent call first):
  CMakeLists.txt:64 (find_package)

如何解决呢?

闭坑指南

接下来就是重要的闭坑指南啦,这点网上少有提及!解决办法就是,需要提前交叉编译好openssl。

进入源码restbed/dependency/openssl/目录,执行以下内容:

(前提执行过这步骤:先加载环境变量:source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi )

--cross-compile-prefix含义为指定你的工具链前缀的,由于加载过环境变量,以下把其留空即可。

#加载环境变量,如果没加载过的话
source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi

#配置,用来生成makefile
./config linux-armv4 no-asm shared --prefix=$(pwd)/__install --cross-compile-prefix=

#编译
make
#安装
make insall

顺利的话,成功生成openssl。

这之后,再在build目录下执行以下就可以啦:

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=../toolchains/arm-poky-linux-gnueabi.cmake -DCMAKE_PREFIX_PATH=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/usr/lib/cmake ../

四、总结

Restbed是一个灵活、易用且高效的C++框架,非常适合构建RESTful API服务。通过上述步骤,开发者可以轻松将Restbed移植到嵌入式Linux环境中,满足各种物联网应用的需求。随着物联网技术的不断发展,Restbed无疑将为开发者提供可靠的支持和便利的开发体验。希望本文能为你的开发过程提供指导和帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

特立独行的猫a

您的鼓励是我的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值