sample-server-guidelines.md 5.4 KB
Newer Older
W
wangqi 已提交
1 2 3 4
# 示例服务器开发指导

## 场景介绍

5
示例服务器解决了升级服务器实际应用场景中的问题,例如,缺乏相应的搜包服务器来提供查询升级包、获取升级包下载链接等服务。示例服务器支持测试升级服务和二次开发功能验证,为升级服务的应用场景提供尽可能完善的端到端环境搭建。
W
wangqi 已提交
6 7 8

## 开发步骤

W
wangqi 已提交
9
1. 生成SSL证书
W
wangqi 已提交
10

W
wangqi 已提交
11
	生成serverKey.pem和serverCert.cer两个文件,用于示例服务器的SSL协议通信。
W
wangqi 已提交
12

W
wangqi 已提交
13
	```
W
wangqi 已提交
14 15
	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"
	```
W
wangqi 已提交
16 17 18



W
wangqi 已提交
19
2. 修改bundle.json
W
wangqi 已提交
20

W
wangqi 已提交
21
	在build字段新增一个sub_component。
W
wangqi 已提交
22

W
wangqi 已提交
23
	```
W
wangqi 已提交
24 25 26 27 28
	"sub_component": [
		"//base/update/updateservice/server_sample:testserver",
		...
	],
	```
W
wangqi 已提交
29

W
wangqi 已提交
30
3. 建立代码目录
W
wangqi 已提交
31

W
wangqi 已提交
32
	进入到update_updateservice目录下,执行以下命令,建立代码目录。
W
wangqi 已提交
33

W
wangqi 已提交
34
	```
W
wangqi 已提交
35
	mkdir server_sample                            // 建立示例服务器server_sample目录
36 37 38
	touch server_sample/BUILD.gn                   // 创建BUILD.gn编译文件
	mkdir server_sample/include                    // 建立示例服务器头文件include目录
	touch server_process.h                         // 创建server_process.h头文件
W
wangqi 已提交
39
	mkdir server_sample/src                        // 建立示例服务器c/c++文件src目录
40 41
	touch server_sample/src/server_process.c       // 创建server_process.c文件
	touch server_sample/src/main.cpp               // 创建main.cpp文件
W
wangqi 已提交
42
	```
W
wangqi 已提交
43

W
wangqi 已提交
44
4. 编写编译文件BUILD.gn
W
wangqi 已提交
45

W
wangqi 已提交
46
	文件BUILD.gn一共编译两个ohos组件,一个是ohos_shared_library库文件libserver_process.z.so,另一个是ohos_executable可执行文件testserver。
W
wangqi 已提交
47

W
wangqi 已提交
48
	```
W
wangqi 已提交
49
	import("//build/ohos.gni")
W
wangqi 已提交
50

W
wangqi 已提交
51 52
	ohos_shared_library("server_process") {
		sources = [
W
wangqi 已提交
53
			"//base/update/updateservice/server_sample/src/server_process.c",
W
wangqi 已提交
54
		]
W
wangqi 已提交
55

W
wangqi 已提交
56 57 58 59
		include_dirs = [
			"//base/update/updateservice/server_sample/include",
			"//third_party/openssl/include",
		]
W
wangqi 已提交
60

W
wangqi 已提交
61 62 63 64 65 66 67
		deps = [
			"//base/update/updater/services/log:libupdaterlog",
			"//third_party/bounds_checking_function:libsec_static",
			"//third_party/openssl:crypto_source",
			"//third_party/openssl:ssl_source",
			"//utils/native/base:utils",
		]
W
wangqi 已提交
68

W
wangqi 已提交
69 70
		part_name = "update_service"
	}
W
wangqi 已提交
71

W
wangqi 已提交
72
	ohos_executable("testserver") {
W
wangqi 已提交
73
		sources = [
W
wangqi 已提交
74 75
			"//base/update/updateservice/server_sample/src/main.cpp",
		]
W
wangqi 已提交
76

W
wangqi 已提交
77 78 79
		include_dirs = [
			"//base/update/updateservice/server_sample/include",
		]
W
wangqi 已提交
80

W
wangqi 已提交
81 82 83
		deps = [
			"//base/update/updateservice/server_sample:server_process",
		]
W
wangqi 已提交
84

W
wangqi 已提交
85 86 87
		part_name = "update_service"
	}
	```
W
wangqi 已提交
88

W
wangqi 已提交
89
5. 编写头文件server_process.h
W
wangqi 已提交
90

W
wangqi 已提交
91
	文件server_process.h声明了示例服务器的接口。
W
wangqi 已提交
92

W
wangqi 已提交
93 94 95
	```c++
	#ifndef __SERVER_PROCESS_H__
	#define __SERVER_PROCESS_H__
W
wangqi 已提交
96

W
wangqi 已提交
97 98 99 100
	/*
	Init函数:用于创建socket环境,并预设置一些属性
	*/
	int Init();
W
wangqi 已提交
101

W
wangqi 已提交
102 103 104 105
	/*
	SetParam函数:所有插件参数设置的统一接口
	*/
	int SetParam(const char *key, const char *value);
W
wangqi 已提交
106

W
wangqi 已提交
107 108 109 110
	/*
	GetParam函数:所有插件参数获取的统一接口
	*/
	int GetParam(const char *key, char *value);
W
wangqi 已提交
111

W
wangqi 已提交
112 113 114 115
	/*
	ReverseSetParamCallback函数:回调
	*/
	int ReverseSetParamCallback(int(*setParam)(const char *key, const char *value));
W
wangqi 已提交
116

W
wangqi 已提交
117 118 119 120
	/*
	Open函数:用于服务打开的接口
	*/
	int Open();
W
wangqi 已提交
121

W
wangqi 已提交
122 123 124 125
	/*
	MainLoop函数:每隔100ms调用一次
	*/
	int MainLoop();
W
wangqi 已提交
126

W
wangqi 已提交
127 128 129 130
	/*
	Close函数,用于关闭服务并释放资源
	*/
	int Close();
W
wangqi 已提交
131

W
wangqi 已提交
132 133
	#endif //__SERVER_PROCESS_H__
	```
W
wangqi 已提交
134

W
wangqi 已提交
135
6. 编写server_process.c、main.cpp
W
wangqi 已提交
136

W
wangqi 已提交
137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174
	文件server_process.c主要声明了服务器的返回报文格式respondContent,main.cpp可参考普通SSL协议的服务器编写,注意包含相关头文件,同时加载serverKey.pem和serverCert.cer两个证书。

	```c
	#include "server_process.h"

	#include <netinet/in.h>
	#include <sys/types.h>
	#include <sys/socket.h>
	#include <arpa/inet.h>
	#include <unistd.h>
	#include <stdlib.h>
	#include <string.h>
	#include <stdio.h>

	#include "openssl/err.h"
	#include "openssl/ssl.h"

	#define SERVER_PEM "/data/sdcard/serverKey.pem"  //使用绝对路径
	#define SERVER_CER "/data/sdcard/serverCert.cer" //使用绝对路径

	#define LOG_PRINT(fmt, ...) printf("[ServerProcess][%s:%d] " fmt "\n", __func__, __LINE__, ##__VA_ARGS__)
	#define DO_CHECK(cond, log, ...) \
		if (!(cond)) {\
			LOG_PRINT(log);\
			__VA_ARGS__;\
			return -1;\
		}

	// 请参考server_process.h的接口予以实现,注意服务器返回的内容格式。
	respondContent = "{"
		"\"searchStatus\": 0,"
		"\"errMsg\": \"success\","
		"\"checkResults\": [{"
			"\"versionName\": \"sampleVersionName\","
			"\"versionCode\": \"sampleVersionCode\","
			"\"verifyInfo\": \"sampleVerifyInfoSha256Value\","
			"\"size\": 1234567,"
			"\"packageType\": 1,"
W
wangqi 已提交
175
			"\"descriptPackageId\": \"abcdefg1234567ABCDEFG\","
W
wangqi 已提交
176 177
		"}],"
		"\"descriptInfo\": [{"
178
			"\"descriptionType\": 0,"
W
wangqi 已提交
179 180
			"\"content\": \"This package message is used for sampleContent\""
		"}]"
W
wangqi 已提交
181
	"}";
W
wangqi 已提交
182
	```
W
wangqi 已提交
183

W
wangqi 已提交
184
7. 编译输出产物
W
wangqi 已提交
185

W
wangqi 已提交
186
	编译输出目录会新增testserver和libserver_process.z.so两个文件。
W
wangqi 已提交
187

W
wangqi 已提交
188
8. 升级包制作
W
wangqi 已提交
189

W
wangqi 已提交
190
	参考[update_packaging_tools仓](https://gitee.com/openharmony/update_packaging_tools)制作升级包。
W
wangqi 已提交
191

W
wangqi 已提交
192
9. 启动搜包服务器
W
wangqi 已提交
193

W
wangqi 已提交
194
	建议在开发板上新建一个纯英文路径,然后将testserver、libserver_process.z.so、serverCert.cer和serverKey.pem放到同一个目录下,进入该目录,执行以下启动命令即可启动搜包服务器。
W
wangqi 已提交
195

W
wangqi 已提交
196
	```
W
wangqi 已提交
197 198
	./testserver ./libserver_process.z.so &
	```
W
wangqi 已提交
199