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