基于分布式软总线扩展生态互联
背景简介
openEuler秉承着打造“数字化基础设施操作系统”的愿景,为促进与OpenHarmony生态的合作与互通,实现端边领域的互通和协同,首次在嵌入式领域引入分布式软总线技术。
分布式软总线是OpenHarmony社区开源的分布式设备通信基座,为设备之间的互通互联提供统一的分布式协同能力,实现设备无感发现和高效传输。OpenHarmony主要面向有强交互需求的智能终端、物联网终端和工业终端。openEuler主要面向有高可靠、高性能等需求的服务器、边缘计算、云和嵌入式设备,二者各有侧重。通过以分布式软总线为代表的技术进行生态互通,一起实现“1+1>2”的效果,支撑社区用户开拓更广阔的行业空间。
分布式软总线工作原理和流程介绍可参考:openEuler分布式软总线
环境准备
硬件设备:
设备名称 | 操作系统 | 说明 |
---|---|---|
树莓派 4B | openEuler22.03-LTS-SP1 | 安装openEuler操作系统的树莓派 |
DAYU200 rk3568开发板 | OpenHarmony 3.1 Release | 安装OpenHarmony操作系统的开发板 |
软件环境:
配置项 | 下载路径 | 使用说明 |
---|---|---|
openEuler22.03-LTS-SP1 | https://www.openeuler.org/zh/download/ | openEuler操作系统,下载raspi_img路径中对应的image,用于烧录到树莓派,烧录可参考:树莓派openEuler的安装。 |
OpenHarmony 3.1 Release | https://gitee.com/openharmony/manifest.git | OpenHarmony操作系统,下载、编译、烧录指导:标准系统入门。 |
HUAWEI DevEco Studio | https://developer.harmonyos.com/cn/develop/deveco-studio#download | OpenHarmony应用开发编辑器,使用指导:DevEco Studio使用指南(OpenHarmony),本文档中代码需使用OpenHarmony SDK 9。 |
代码获取
该文档使用两台设备进行生态互联演示:一台树莓派(openEuler)和一台RK3568开发板(OpenHarmony)。
openEuler侧(树莓派)代码获取:
# openEuler侧(树莓派)操作均在树莓派中进行,下同。
# 服务端软件包已集成至openEuler22.03-LTS-SP1系统中,所以可直接使用如下命令进行安装:
dnf install dsoftbus -y
# 客户端代码可使用“项目简介”中“openEuler分布式软总线”中的“softbus_client_main.c”
OpenHarmony侧(RK3568开发板)代码获取:
# OpenHarmony侧(RK3568开发板)操作均在windows机器上进行,下同。
# 分布式软总线服务端能力已集成到OpenHarmony 3.1 Release镜像中,所以无需手动获取服务端代码。
# 客户端代码使用“Native C++”工程编写,可使用git命令下载参考代码。代码说明在仓库的README.md中。
git clone https://gitee.com/liheavy/softbus_client_app.git
代码编译
openEuler侧(树莓派)代码编译:
# 安装dsoftbus后,将softbus_client_main.c保存到任意路径下,使用如下gcc命令进行编译,编译成功后会在路径下生成softbus_client_main可执行文件,添加执行权限:
gcc softbus_client_main.c -I/usr/include/dsoftbus/ -L /usr/lib64 -lsoftbus_client.z -lboundscheck -o softbus_client_main
chmod u+x softbus_client_main
OpenHarmony侧(RK3568开发板)代码编译:
首先需要根据“环境准备”中 HUAWEI DevEco Studio 配置指导将 IDE 环境配置完成。
使用 DevEco 将下载的"softbus_client_app/softbus_client_sample"参考代码打开,DevEco 将会根据配置文件自动完成项目初始化。
初始化完成后需要生成项目的签名文件:File -->Project Structure --> Project --> Signing Configs -->Automatically generate signature。
由于 OpenHarmony SDK 9 暂未提供分布式软总线的应用 API,所以该项目直接在应用中使用分布式软总线服务的 API ,需要将依赖的 so文件(libsoftbus_client.z.so、libsec_shared.z.so)拷贝到本地OpenHarmony SDK 的动态库路径中。so 文件会随源码一起下载到本地(required_so文件夹中);也可通过hdc_std工具拷贝RK3568中的两个 so 文件,so 文件路径/lib/xxx.so。
本地OpenHarmony SDK安装路径可通过File --> Settings --> OpenHarmony SDK查看。
将libsoftbus_client.z.so、libsec_shared.z.so拷贝到 “OpenHarmony SDK安装路径/native/x.x.x.x/sysroot/usr/lib/arm-linux-ohos/"路径中。
完成后便可在DevEco中进行代码编译 Build --> Build Hap(s)/App(s) --> Build Hap(s) 。
代码运行
前置准备
配置设备ID
openEuler侧(树莓派):
由于当前openEuler版本的分布式软总线暂时去除了对设备管理模块的依赖,为适配和简化获取设备ID的代码,采用了读取/etc/SN文件中内容作为设备ID的方式,所以在启动分布式软总线服务侧之前需要将设备ID(自定义数字)写入/etc/SN,注意多个设备的ID不要设置成同一个值,否则可能造成认证和通信失败问题。
# 举例设置该设备ID为1
echo "1" >>/etc/SN
连接网络
两台设备需要在同一局域网内,两台设备的 ip可以相互 ping 通,可在各自操作系统中使用ip a
查看ip。
openEuler侧(树莓派):
启动分布式软总线服务
# dsoftbus会提供softbus_server_main命令,可直接执行 softbus_server_main
OpenHarmony侧(RK3568开发板):
电脑连接 RK3568 开发板
使用 USB 线一端连接 RK3568 开发板的 “OTG” 类型的 USB 接口,一端连接电脑的 USB 接口。打开 DevEco,界面右上方设备列表识别到开发板即为连接成功。
修改分布式软总线权限配置文件
由于 OpenHarmony 分布式软总线服务对使用其功能的应用有权限限制。故运行 demo 需要修改分布式软总线权限配置文件。
# 可使用hdc_std工具进行权限配置文件替换,hdc_std工具会在OpenHarmony SDK安装时一起安装,安装路径为: OpenHarmony SDK安装路径(可根据上一章指导,通过DevEco查看)/toolchains/x.x.x.x/hdc_std.exe # 由于RK3568中分布式软总线权限配置文件为只读模式,所以需要使用如下命令将系统文件修改为可读可写模式: hdc_std.exe shell "mount -o remount,rw /" # 如下使用softbus_client_app仓库中softbus_trans_permission.json替换RK3568中对应的文件。 hdc_std.exe file send softbus_trans_permission.json /system/etc/communication/softbus/
重启分布式软总线服务
# 使用如下命令重启分布式软总线服务,使修改的权限配置文件生效。 ps -ef | grep softbus_server | grep -v grep kill -9 上面查询到的进程号
设备认证
OpenHarmony 设备和 openEuler 设备在组网过程中,需要两台设备提前将对方添加为可信设备。所以在两台设备互联互通之前,需要通过 Hichain 模块进行认证。详情请参考可信设备添加,如下使用“pin码弹窗”方式认证的demo演示,以下操作均在树莓派中进行操作。
依赖动态库软链接
# 该方式需要依赖libsec_shared.z.so,该动态库在openEuler的dsoftbus中被替换为libboundscheck.so,所以需要通过建立软链接的方式使用libsec_shared.z.so。 ln -s /usr/lib64/libboundscheck.so /usr/lib64/libsec_shared.z.so # 在ARM环境下该方法还需要依赖/lib64/1d-linux-aarch64.so.1,否则会出现no such file的报错。 ln -s /lib/ld-linux-aarch64.so.1 /lib64/ld-linux-aarch64.so.1
运行认证客户端
# 认证客户端demo可执行文件同样在softbus_client_app仓库中,hichain_sample—>devicemanager chmod u+x devicemanager ./devicemanager
根据提示输入“l”列出同一局域网内设备。
根据提示输入 OpenHarmony 设备编号进行认证,输入后在 RK3568 开发板中会弹出手动确认弹窗“是否允许对端设备连接”,点击“允许”,在树莓派侧再输入“l”,会发现设备的状态从“discovery”变成了“online”,表示认证成功。
设备通信
OpenHarmony侧(RK3568开发板)客户端烧录、运行。
电脑连接 RK3568 开发板,点击 DevEco 上方的“Run”按钮。
烧录结束后 RK3568 将直接运行 APP。
openEuler侧(树莓派)发送数据
# 直接运行“代码编译”阶段编译出的softbus_client_main可执行文件 ./softbus_client_main
运行后会显示组网设备:
根据提示输入“c”:
根据提示输入OpenHarmony设备的编号:
此时在 RK3568 开发板屏幕上方将显示接收到的字符串:
OpenHarmony侧(RK3568开发板)展示终端信息:
点击app页面中的“刷新”图标,会显示与该设备连接的终端设备,点击终端图标将会显示设备基本信息。
OpenHarmony侧(RK3568开发板)发送数据:
点击app页面“发送数据”按钮,将会向openEuler设备发送一条数据。
在openEuler侧(树莓派),将会展示接收到的信息。
至此,openEuler和OpenHarmony通过分布式软总线互联互通demo演示完成。
六、总结
该文档主要演示了 OpenHarmony 设备和 openEuler 设备如何通过分布式软总线进行互联互通。服务端代码正在持续优化,以支持更多分布式场景;客户端所用代码均属于 demo,仍需优化:如OpenHarmony APP调用分布式软总线的方式,标准流程为开发 System Ability 来调用分布式软总线服务端 API,集成到 SDK 中并提供 API 给APP 进行调用,由于时间关系采用 APP 直接调用分布式软总线 API 的方式,欢迎各位开发爱好者参与,一起丰富openEuler的嵌入式能力。