# 1. 服务器协议接口 ## 1.1. 概述    提供HTTP/FTP/SMTP协议的接口数据,使用**curl+openssl开源库**二次封装。 ## 1.2. 开发过程记录 1. 先编译openssl,再编译curl,curl的构建配置需要指定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(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/s(333DE芯片平台); * 裁剪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 ```