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
 | 
						||
``` |