随着物联网和嵌入式设备的普及,开发高性能的网络服务变得愈发重要。Restbed是一个用于构建RESTful APIs的轻量级C++框架,因其简洁而强大的特性,成为开发者的热门选择。本文将介绍Restbed框架及其在嵌入式Linux平台上的移植方法。
一、Restbed框架简介
Restbed是一个用C++编写的轻量级RESTful框架,专注于简化和加速RESTful Web服务的开发。其核心特性包括:
- 高性能:Restbed设计优化以确保极低的延迟和高吞吐量,适合处理大量并发请求。
- 简洁易用:提供简单明了的API,使得开发者可以快速上手并实现HTTP服务。
- 支持异步处理:能够高效处理异步请求,适合实时应用。
- 灵活的路由机制:支持将请求路由到不同的处理函数,便于管理和组织代码。
- 跨平台:可以在多种操作系统上运行,包括Linux、Windows和macOS等,适用于多种嵌入式系统。
- JSON 支持:Restbed 内置 JSON 支持,可以轻松处理 JSON 请求和响应。
- TLS/SSL 支持:Restbed 支持 TLS/SSL 加密,确保通信的安全性。
- 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无疑将为开发者提供可靠的支持和便利的开发体验。希望本文能为你的开发过程提供指导和帮助!