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