hunting/utils/Servers/README.md
2024-06-15 08:36:44 +08:00

4.0 KiB
Raw Blame History

1. 服务器协议接口

1.1. 概述

提供HTTP/FTP/SMTP协议的接口数据使用curl+openssl开源库二次封装。

1.2. 开发过程记录

  1. 先编译openssl再编译curlcurl的构建配置需要指定openssl的输出文件目录否则curl将会构建失败
  2. http协议指定url指定post数据curl即可按照POST发送请求
  3. ftp/ftps协议对应不同的服务器IP必须一一对应
  4. curl配置了忽略证书校验未知有什么实际影响
  5. 分别对openssl和curl进行了裁剪

1.3. 关于MQTT

curl源码包里并未提供MQTT相关的example网上搜索编码示例未找到。

1.4. Servers协议栈模块构建

使用SifarSDK的构建体系进行编译编译curl时自动关联openssl进行编译。

  • 配置文件(此处以/build/cmake/toolchain/linux.toolchain.cmake为示例
# ------------ build curl + openssl ------------ start
# 工具链前缀
set(CROSS_COMPILE_PREFIX      "") 
# 是否启动动态库(预留,暂未支持)
set(CURL_OPENSSL_LIB_SHARED_ENABLE         "false")
# ------------ build curl + openssl ------------ end
  • 项目根目录编译
make cmake
cd cmake-shell-linux/
make curl // 由于curl属于三方构建的开源库首次需要先编译curl + openssl
make Servers

1.5. Example

头文件servser.h 链接库libServers.a,libLog.a 三方依赖库(依次按序) libcurl.a,libssl.a,libcrypto.a

下述以FTP为例子

TEST(ServersTest, FtpsUpload)
    {
        const char *url = "ftp://150.109.112.64/ServersTest";test/bin/ServersTest";
        const char *uploadFile = "./ServersTest";
        const char *user_password = "ftp_user:Sifar%123456";
        ServerParam init = {
            .logFlag = LOG_FLAG_ENABLE, // 开启curl日志
            .sslVerifyFlag = SSL_VERIFY_DISABLE, //关闭ssl的证书校验功能
        };
        InitLog(LOG_EASYLOGGING, nullptr); // 初始化自研log库
        ServersInit(init); // 初始化Servers模块
        LogInfo("servers test start.\n");
        ServerFtp *ftp = NewServersFtp(url, FTPS_FLAG_ENABLE); // 创建ftp的参数“句柄”
        if (ftp)
        {
            ftp->user_password = (char *)user_password;
            ftp->filePath = (char *)uploadFile;
            FtpUpload(ftp); // 使用FTP上传文件
            if (SERVERS_CODE_OK == ftp->code)
            {
                LogInfo("ftp succeed.\n");
            }
            else
            {
                LogError("ftp failed, code = %d.\n", static_cast<int>(ftp->code));
            }
            DeleteServersFtp(ftp); // 释放ftp“句柄”
        }
        UnInitLog();
    }

注意:

  • 必须调用servers_init()函数初始化Servers协议栈库
  • 必须使用模块接口创建对应的协议参数“句柄”示例为new_servers_ftp();
  • 必须释放协议参数“句柄”;

更多示例详见:/test/component/Servers/src/ServersTest.cpp

1.6. 测试

libServers.a自研代码通过asan测试未存在内存安全相关漏洞。 测试用例详见:/test/component/Servers/src/ServersTest.cpp

  • 测试用例编译
make cmake
cd cmake-shell-linux/
make ServersTest

1.7. 总结

  • 实现http/https/ftp/ftps/smtp/smtps接口
  • 交叉编译测试ftp/ftps上传下载速率大概为1M/s333DE芯片平台
  • 裁剪openssl和curl后编译的demo大小 < 1.2M

1.8. S530项目配置

  • 工具链
set(CMAKE_C_COMPILER /opt/arm-ca9-linux-uclibcgnueabihf-8.4.01/usr/bin/arm-linux-gcc)
set(CMAKE_CXX_COMPILER /opt/arm-ca9-linux-uclibcgnueabihf-8.4.01/usr/bin/arm-linux-g++)
  • curl + openssl
# ------------ build curl + openssl ------------ start
set(CROSS_COMPILE_PREFIX      "/opt/arm-ca9-linux-uclibcgnueabihf-8.4.01/usr/bin/arm-linux-")
set(CURL_OPENSSL_LIB_SHARED_ENABLE         "false")
set(CURL_SHARED_LIBS_PATH                  "/mnt/mmc")
# ------------ build curl + openssl ------------ end