当前位置: 首页 > article >正文

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无疑将为开发者提供可靠的支持和便利的开发体验。希望本文能为你的开发过程提供指导和帮助!


http://www.kler.cn/a/349076.html

相关文章:

  • 代码随想录(七) —— 二叉树部分
  • 前端性能优化全面指南
  • 一次Fegin CPU占用过高导致的事故
  • QT QML 练习5-平铺btn按键
  • 5G NR UE初始接入信令流程
  • Vulnhub:Me-and-My-Girlfriend-1
  • 深度学习-22-基于keras的十大经典算法之深度神经网络DNN
  • 慢慢来才是最快的方式
  • 住房公积金 计算器-java方法
  • 【Python语言进阶(二)】
  • Ofcms-(java代码审计学习)
  • 红外超声波雷达测距
  • [含文档+PPT+源码等]精品基于Python实现的django图书自助借还系统设计与实现
  • 跨境电商独立站的本地化
  • 遨游智能终端赋能“危急特”场景,力推北斗技术规模化应用!
  • Linux——文件夹文件
  • leetcode二叉树(五)-二叉树层序遍历
  • 基于DCGM+Prometheus+Grafana的GPU监控方案
  • 前端布局与响应式设计综合指南(二)
  • 在线培训知识库+帮助中心:教育行业智慧学习的创新桥梁