• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 示例服务器开发指导
2
3## 场景介绍
4
5示例服务器解决了升级服务器实际应用场景中的问题,例如,缺乏相应的搜包服务器来提供查询升级包、获取升级包下载链接等服务。示例服务器支持测试升级服务和二次开发功能验证,为升级服务的应用场景提供尽可能完善的端到端环境搭建。
6
7## 开发步骤
8
91. 生成SSL证书
10
11	生成serverKey.pemserverCert.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.cmain.cpp
136
137	文件server_process.c主要声明了服务器的返回报文格式respondContent,main.cpp可参考普通SSL协议的服务器编写,注意包含相关头文件,同时加载serverKey.pemserverCert.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.soserverCert.cerserverKey.pem放到同一个目录下,进入该目录,执行以下启动命令即可启动搜包服务器。
195
196	```
197	./testserver ./libserver_process.z.so &
198	```
199
200