1# 示例服务器开发指导
2
3## 开发步骤
4
51. 生成SSL证书
6
7	生成serverKey.pemserverCert.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.cmain.cpp
132
133	文件server_process.c主要声明了服务器的返回报文格式respondContent,main.cpp可参考普通SSL协议的服务器编写,注意包含相关头文件,同时加载serverKey.pemserverCert.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.soserverCert.cerserverKey.pem放到同一个目录下,进入该目录,执行以下启动命令即可启动搜包服务器。
191
192	```
193	./testserver ./libserver_process.z.so &
194	```
195
196