样例介绍
本样例基于rk3568开发板,通过封装openharmony安全子系统deviceauth组件提供的能力,实现了一组可用于设备间快速建立可信认证和连接的接口,通过预先定义关系网,在设备初始化阶段完成端端设备间的认证,构建安全的数据传输通道。
场景介绍
本样例可以作为一个SDK集成到设备版本中,供上层业务APP或IOT SDK使用,具体应用场景可参考下图:
场景1:在城市鸿蒙的智慧管廊场景中,可以通过近端安全互联组件进行设备间可信认证与连接,当燃气监测仪监测到燃气泄漏时,及时对现场进行有效处理。例如:场景内甲烷浓度超标,但是风机没有正常启动,容易造成火灾,导致人员伤亡。在集成近端安全互联组件后,近端设备间可以建立安全的连接,当发生燃气泄漏时,可以实现电磁阀自动关闭、风机自动开启,避免管廊内发生火灾。
场景2:在交通鸿蒙的智慧隧道场景中,可以通过近端安全互联组件进行设备间可信认证与连接,当气体检测仪检测到浓度超标时,近端设备可以自动运行,及时处理现场,避免人工处理错过最佳时间,产生二次伤害。例如:隧道内的气体检测仪检测到浓度超标,但是风机未启动,导致有毒有害气体无法排出,造成人员伤亡。在集成近端安全互联组件后,近端设备间可以组建安全的通信网络,当隧道内气体浓度超标时,检测仪可以直接发送指令给风机,通知风机启动,及时将有毒有害气体排出隧道。
基于上述场景,产生了如下需求:近端设备间实现安全的组网和通信,能够自发进行联动。
本样例以rk3568开发板作为载体,实现设备的近端安全互联与通信,可以应用于上述场景,有效解决该场景中存在的问题。
样例实现的功能包括:
-
同局域网设备间的互联
-
获取设备预置的PIN码
-
基于PIN码和deviceauth模块实现设备互信认证
-
点对点设备间数据安全传输
本样例可以配合IOT SDK一起使用,IOT SDK主要承担设备注册与PIN码管理的功能,使用者也可以根据自身的实际情况选择用业务APP代替。
IOT SDK源码可以从如下地址获取:https://github.com/huaweicloud/huaweicloud-iot-device-sdk-c
约束与限制
特别说明
-
本样例仅适用于端端设备间需要保持长连接的场景,除非本端业务主动断开与对端设备的连接,样例本身不会自动超时断开。
-
设备间连接断开后,当再次连接时会重新进行设备认证,因此会获得新的会话密钥。
-
保持长连接可以保障设备间数据传输的及时性,但也存在一些安全隐患,比如会话密钥不会进行更新,时间太长就存在泄露的风险,如果对该安全风险比较敏感,请勿使用本样例。
硬件说明
通过测试,rk3568开发板在作为服务端时,最多可连接100台客户端,在作为客户端时,最多可连接100台服务端。
本样例仅选取两块rk3568开发板进行介绍与演示,其中一块作为服务端,一块作为客户端。
环境准备
硬件准备
安装windows 10及以上操作系统的PC主机
两台rk3568开发板
构建环境
首先需要在PC主机上安装Ubuntu操作系统,以提供基础的编译环境,安装方法可参考:https://developer.huawei.com/consumer/cn/training/course/video/C101639987816176315
然后完成Ubuntu基础环境的配置,可参考:https://developer.huawei.com/consumer/cn/training/course/video/C101639988048536240
在Ubuntu系统中下载源码前请先执行如下指令安装所需的工具:
sudo apt-get update && sudo apt-get install binutils git git-lfs gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip m4 bc gnutls-bin python3.8 python3-pip ruby genext2fs liblz4-tool libssl-dev libtinfo-dev libtinfo5 openjdk-17-jre-headless libc6 libstdc++6 default-jdk u-boot-tools mtools mtd-utils scons gcc-arm-linux-gnueabi
该样例适配的源码版本为:Openharmony-3.1-Release,请确保下载代码时分支选择正确。
源码获取方式可参考开源社区文档 http://www.openharmony.cn/download ,选择第一种获取方式,并使用以下命令替换文档中的下载命令:
repo init -u https://gitee.com/openharmony/manifest.git -b refs/tags/OpenHarmony-v3.1-Release --no-repo-verify
repo sync -c
repo forall -c 'git lfs pull'
编译验证
下载源码后,需要先编译rk3568版本通过,以确保编译环境正常可用。
切换到源码根目录,执行如下命令,安装编译器及二进制工具:
bash build/prebuilts\_download.sh
接着执行如下命令进行版本编译:
./build.sh --product-name rk3568 --ccache
编译完成后,日志中显示如下,则表示编译成功:
\=====build rk3568 successful.
编译生成的镜像文件在 out/rk3568/packages/phone/images/ 目录下。
集成样例
样例源码介绍
样例源码存放在00_src目录下,各个目录中的文件功能如下表:
目录 | 功能说明 |
---|---|
dconnectcaseone | 基于openharmony安全子系统deviceauth组件开发的分布式安全通信样例,可用于多个设备间基于预先定义的关系网完成可信认证与连接,构建安全的数据传输通道 |
test | 用于验证样例功能可用的业务程序示例代码,使用者可以参考该代码定制自己的业务程序 |
figures | 用于存放readme文件中的图片资源 |
修改社区源码
基于rk3568设备集成编译该样例时,需要按照如下步骤修改源码(+表示增加行,-表示删除行):
- 修改base/security/deviceauth/common_lib/impl/src/clib_types.c文件内容:
void *ClibMalloc(uint32_t size, char val)
{
- if (size == 0 || size > CLIB_MAX_MALLOC_SIZE) {
+ if (size == 0) {
return NULL;
}
void* addr = malloc(size);
- 修改base/security/deviceauth/common_lib/interfaces/clib_types.h文件内容:
#define NULL 0
#endif
-#define CLIB_MAX_MALLOC_SIZE 4096 /* 4K */
-
#ifdef __cplusplus
extern "C" {
#endif
- 修改build/prebuilts_download.sh文件内容:
-node_js_ver=v12.18.4
+node_js_ver='v12.18.4'
node_js_name=node-${node_js_ver}-${host_platform}-x64
node_js_pkg=${node_js_name}.tar.gz
- 修改third_party/jsframework/package.json文件内容:
"sinon": "^9.2.2",
"ts-node": "^9.0.0",
"tslib": "^2.0.3",
- "typescript": "^4.1.2"
+ "typescript": "4.1.3"
}
}
接着按照如下流程将样例集成到rk3568产品版本中:
-
在社区源码的vendor目录下新建目录kits,并将00_src目录下的所有文件放到kits目录下。
-
修改build/subsystem_config.json文件,增加如下内容,新增一个subsystem:
"kits": {
"path": "vendor/kits",
"name": "kits"
},
- 修改productdefine/common/products/rk3568.json文件,在parts中新增kits中的两个部件:
"type": "standard",
"product_build_path": "device/hihope/build",
"parts":{
"kits:dconnectcaseone":{},
"kits:test":{},
"ace:ace_engine_standard":{},
编译镜像
切换到源码根目录,执行如下命令,进行编译构建:
./build.sh --product-name rk3568 --ccache
编译成功后,在 /out/rk3568 目录中通过如下指令检查是否包含本样例:
find ./out/rk3568 -name "libdconnectcaseone.z.so"
通过如下指令检查是否包含测试用业务程序:
find ./out/rk3568/kits -name "demo"
如果找不到样例对应的so文件,请检查00_src目录下的文件是否全部放到了kits目录下(请注意:ohos.build文件也是必需的)。
烧录镜像
环境准备
从 out/rk3568/packages/phone/images/ 目录下复制编译成功的rk3568镜像文件到PC的windows环境中。
然后按照如下流程配置PC的HDC环境:
- 切换到Ubuntu环境中的源码根目录,执行如下命令,编译ohos-sdk包:
./build.sh --product-name ohos-sdk --ccache
-
编译完成后,从out/sdk/ohos-sdk/windows/ 目录下将toolchains目录整个复制出来,放到D盘根目录下。
-
将toolchains目录中的hdc_std.exe文件重命名为hdc.exe,方便后续使用,如下图所示:
- 在环境变量-系统变量-Path中新建一项,值设置为D:\toolchains,之后可以在cmd窗口中直接使用HDC指令:
烧录指导
请参考如下链接进行烧录:
https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/docs/%E7%83%A7%E5%BD%95%E6%8C%87%E5%AF%BC%E6%96%87%E6%A1%A3.md
烧录验证
烧录完成后,开发板正常启动进入桌面(若未正常启动,需检查烧录是否失败)。
保持USB线仍为连接状态,在PC上开启一个cmd窗口,执行 hdc list targets,可以看到对应设备的序列号,如下图:
接着按下图所示指令执行,可以看到输出libdconnectcaseone.z.so的详细信息,则表示烧录成功:
另外,业务程序对应的可执行文件可通过如下方式找到:
使用说明
开发板烧录镜像完成后,可以通过HDC指令进入设备的shell界面,切换到/system/bin目录下,通过ls -l demo指令可以看到可执行文件demo,就是我们的测试用业务程序。
将两台设备连接网络,通过ifconfig指令查看设备的IP地址,按照下图所示的操作将其中一台设备初始化为服务端,另一台初始化为客户端,在执行客户端初始化时两端设备会自动进行绑定和认证,可以新开一个shell窗口查看认证过程中的日志。
服务端初始化(上边为初始化操作指令,下边为样例打印的日志):
客户端初始化(上边为初始化操作指令,下边为样例打印的日志):
可信认证(左侧为服务端,右侧为客户端,认证会在初始化客户端时自动触发):
收发数据(左侧为服务端,右侧为客户端):
接口列表
本样例将枚举及宏定义、回调函数、对外接口的定义内容放置于下面的头文件中:
dconnectcaseone/interface/include/dconncaseone_interface.h
回调函数
接口名 | 描述 |
---|---|
typedef void (*SendDataCallback)(const char *device, uint32_t result) | 数据发送回调函数 |
typedef void (*ReceiveDataCallback)(const char *deviceId, const char *receiveData, uint32_t datelen) | 数据接收回调函数 |
typedef bool (*IsValidIP)(const char *ip) | 校验当前连接服务端的 |
客户端IP地址是否合法 | |
typedef bool (*IsValidDeviceID)(const char *deviceID) | 校验当前连接服务端的 |
客户端的设备ID是否合法 | |
typedef char *( *GetAuthKey)(const char *targetDeviceID) | 获取对应设备的PIN码 |
typedef char *( *GetDeviceID)() | 获取本设备ID |
样例接口
接口名 | 描述 |
---|---|
DCONN_API_PUBLIC uint32_t InitDConnCaseOne(uint32_t type, const char *ipAry, char *errorIp); | 初始化样例。初始化类型:INIT_SERVICE/INIT_CLIENT |
ipAry:IP地址字符串 | |
初始化服务端时仅可传入一个 IP 地址 | |
初始化客户端时可传入多个,以半角逗号分隔 | |
DCONN_API_PUBLIC void RegisterCallback(const CallbackParam *callback); | 注册回调函数 |
DCONN_API_PUBLIC uint32_t DConnSendData(const char *targetDeviceId, const char *data, uint32_t dataLen); | 发送数据 |
DCONN_API_PUBLIC void UnRegisterCallback(); | 取消注册回调函数 |
DCONN_API_PUBLIC void CloseDConnCaseOne(); | 关闭样例 |
DCONN_API_PUBLIC const char *GetDConnVersion(); | 获取样例版本号 |
为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05
《鸿蒙开发学习手册》:
如何快速入门:https://qr21.cn/FV7h05
- 基本概念
- 构建第一个ArkTS应用
- ……
开发基础知识:https://qr21.cn/FV7h05
- 应用基础知识
- 配置文件
- 应用数据管理
- 应用安全管理
- 应用隐私保护
- 三方应用调用管控机制
- 资源分类与访问
- 学习ArkTS语言
- ……
基于ArkTS 开发:https://qr21.cn/FV7h05
- Ability开发
- UI开发
- 公共事件与通知
- 窗口管理
- 媒体
- 安全
- 网络与链接
- 电话服务
- 数据管理
- 后台任务(Background Task)管理
- 设备管理
- 设备使用信息统计
- DFX
- 国际化开发
- 折叠屏系列
- ……
鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH
鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH
1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向