109 lines
4.0 KiB
Markdown
109 lines
4.0 KiB
Markdown
# 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<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/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
|
||
``` |