1# 示例服务器开发指导 2 3## 场景介绍 4 5示例服务器解决了升级服务器实际应用场景中的问题,例如,缺乏相应的搜包服务器来提供查询升级包、获取升级包下载链接等服务。示例服务器支持测试升级服务和二次开发功能验证,为升级服务的应用场景提供尽可能完善的端到端环境搭建。 6 7## 开发步骤 8 91. 生成SSL证书 10 11 生成serverKey.pem和serverCert.cer两个文件,用于示例服务器的SSL协议通信。 12 13 ``` 14 openssl req -newkey rsa:2048 -nodes -keyout serverKey.pem -x509 -days 365 -out serverCert.cer -subj "/C=CN/ST=GD/L=GZ/O=abc/OU=defg/CN=hijk/emailAddress=test.com" 15 ``` 16 17 18 192. 修改bundle.json 20 21 在build字段新增一个sub_component。 22 23 ``` 24 "sub_component": [ 25 "//base/update/updateservice/server_sample:testserver", 26 ... 27 ], 28 ``` 29 303. 建立代码目录 31 32 进入到update_updateservice目录下,执行以下命令,建立代码目录。 33 34 ``` 35 mkdir server_sample // 建立示例服务器server_sample目录 36 touch server_sample/BUILD.gn // 创建BUILD.gn编译文件 37 mkdir server_sample/include // 建立示例服务器头文件include目录 38 touch server_process.h // 创建server_process.h头文件 39 mkdir server_sample/src // 建立示例服务器c/c++文件src目录 40 touch server_sample/src/server_process.c // 创建server_process.c文件 41 touch server_sample/src/main.cpp // 创建main.cpp文件 42 ``` 43 444. 编写编译文件BUILD.gn 45 46 文件BUILD.gn一共编译两个ohos组件,一个是ohos_shared_library库文件libserver_process.z.so,另一个是ohos_executable可执行文件testserver。 47 48 ``` 49 import("//build/ohos.gni") 50 51 ohos_shared_library("server_process") { 52 sources = [ 53 "//base/update/updateservice/server_sample/src/server_process.c", 54 ] 55 56 include_dirs = [ 57 "//base/update/updateservice/server_sample/include", 58 "//third_party/openssl/include", 59 ] 60 61 deps = [ 62 "//base/update/updater/services/log:libupdaterlog", 63 "//third_party/bounds_checking_function:libsec_static", 64 "//third_party/openssl:crypto_source", 65 "//third_party/openssl:ssl_source", 66 "//utils/native/base:utils", 67 ] 68 69 part_name = "update_service" 70 } 71 72 ohos_executable("testserver") { 73 sources = [ 74 "//base/update/updateservice/server_sample/src/main.cpp", 75 ] 76 77 include_dirs = [ 78 "//base/update/updateservice/server_sample/include", 79 ] 80 81 deps = [ 82 "//base/update/updateservice/server_sample:server_process", 83 ] 84 85 part_name = "update_service" 86 } 87 ``` 88 895. 编写头文件server_process.h 90 91 文件server_process.h声明了示例服务器的接口。 92 93 ```c++ 94 #ifndef __SERVER_PROCESS_H__ 95 #define __SERVER_PROCESS_H__ 96 97 /* 98 Init函数:用于创建socket环境,并预设置一些属性 99 */ 100 int Init(); 101 102 /* 103 SetParam函数:所有插件参数设置的统一接口 104 */ 105 int SetParam(const char *key, const char *value); 106 107 /* 108 GetParam函数:所有插件参数获取的统一接口 109 */ 110 int GetParam(const char *key, char *value); 111 112 /* 113 ReverseSetParamCallback函数:回调 114 */ 115 int ReverseSetParamCallback(int(*setParam)(const char *key, const char *value)); 116 117 /* 118 Open函数:用于服务打开的接口 119 */ 120 int Open(); 121 122 /* 123 MainLoop函数:每隔100ms调用一次 124 */ 125 int MainLoop(); 126 127 /* 128 Close函数,用于关闭服务并释放资源 129 */ 130 int Close(); 131 132 #endif //__SERVER_PROCESS_H__ 133 ``` 134 1356. 编写server_process.c、main.cpp 136 137 文件server_process.c主要声明了服务器的返回报文格式respondContent,main.cpp可参考普通SSL协议的服务器编写,注意包含相关头文件,同时加载serverKey.pem和serverCert.cer两个证书。 138 139 ```c 140 #include "server_process.h" 141 142 #include <netinet/in.h> 143 #include <sys/types.h> 144 #include <sys/socket.h> 145 #include <arpa/inet.h> 146 #include <unistd.h> 147 #include <stdlib.h> 148 #include <string.h> 149 #include <stdio.h> 150 151 #include "openssl/err.h" 152 #include "openssl/ssl.h" 153 154 #define SERVER_PEM "/data/sdcard/serverKey.pem" //使用绝对路径 155 #define SERVER_CER "/data/sdcard/serverCert.cer" //使用绝对路径 156 157 #define LOG_PRINT(fmt, ...) printf("[ServerProcess][%s:%d] " fmt "\n", __func__, __LINE__, ##__VA_ARGS__) 158 #define DO_CHECK(cond, log, ...) \ 159 if (!(cond)) {\ 160 LOG_PRINT(log);\ 161 __VA_ARGS__;\ 162 return -1;\ 163 } 164 165 // 请参考server_process.h的接口予以实现,注意服务器返回的内容格式。 166 respondContent = "{" 167 "\"searchStatus\": 0," 168 "\"errMsg\": \"success\"," 169 "\"checkResults\": [{" 170 "\"versionName\": \"sampleVersionName\"," 171 "\"versionCode\": \"sampleVersionCode\"," 172 "\"verifyInfo\": \"sampleVerifyInfoSha256Value\"," 173 "\"size\": 1234567," 174 "\"packageType\": 1," 175 "\"descriptPackageId\": \"abcdefg1234567ABCDEFG\"," 176 "}]," 177 "\"descriptInfo\": [{" 178 "\"descriptionType\": 0," 179 "\"content\": \"This package message is used for sampleContent\"" 180 "}]" 181 "}"; 182 ``` 183 1847. 编译输出产物 185 186 编译输出目录会新增testserver和libserver_process.z.so两个文件。 187 1888. 升级包制作 189 190 参考[update_packaging_tools仓](https://gitee.com/openharmony/update_packaging_tools)制作升级包。 191 1929. 启动搜包服务器 193 194 建议在开发板上新建一个纯英文路径,然后将testserver、libserver_process.z.so、serverCert.cer和serverKey.pem放到同一个目录下,进入该目录,执行以下启动命令即可启动搜包服务器。 195 196 ``` 197 ./testserver ./libserver_process.z.so & 198 ``` 199 200