写点什么

openEuler Embedded SIG | 分布式软总线

作者:openEuler
  • 2022 年 7 月 28 日
  • 本文字数:3947 字

    阅读完需:约 13 分钟

特性介绍

背景

openEuler 秉承着打造“数字化基础设施操作系统”的愿景,为促进与 OpenHarmony 生态的合作与互通,实现端边领域的互通和协同,首次在嵌入式领域引入分布式软总线技术。

分布式软总线是 OpenHarmony 社区开源的分布式设备通信基座,为设备之间的互通互联提供统一的分布式协同能力,实现设备无感发现和高效传输。

OpenHarmony 主要面向强交互等需求的智能终端、物联网终端和工业终端。openEuler 主要面向有高可靠、高性能等需求的服务器、边缘计算、云和嵌入式设备,二者各有侧重。通过以分布式软总线为代表的技术进行生态互通,以期实现“1+1>2”的效果,支撑社区用户开拓更广阔的行业空间。


架构

软总线的主要架构如下:

软总线主体功能分为发现、组网、连接和传输四个基本模块,实现:

  • 即插即用:快速便捷发现周边设备。

  • 自由流转:各设备间自组网,任意建立业务连接,实现自由通信。

  • 高效传输:通过 WIFI、蓝牙设备下软硬件协同最大化发挥硬件传输性能。

软总线南向支持标准以太网通信,同时后续可持续拓展 WIFI、蓝牙等多种通信方式。并为北向的分布式应用提供统一的 API 接口,屏蔽底层通信机制。

软总线依赖于设备认证、IPC、日志和系统参数(SN 号)等周边模块,嵌入式系统中将这些依赖模块进行了样板性质的替换,以实现软总线基本功能。实际的周边模块功能实现,还需要用户根据实际业务场景进行丰富和替换,以拓展软总线能力。

应用指南

部署示意

软总线支持局域网内多设备部署,设备间通过以太网通信。单设备上分为 server 和 client,二者通过 IPC 模块进行交互。

注意

当前 IPC 模块和 SN 号等系统参数,嵌入式版本提供的仅为参考模板,还无法支持多节点和多 client 部署。用户可根据实际业务场景进行 IPC 模块和 SN 号系统参数进行功能丰富,以拓展软总线部署能力。

服务端启动

服务端主程序为softbus_server_main,执行该主程序既可拉起软总线服务端。

openeuler ~ # softbus_server_main >log.file &
复制代码

当服务端被拉起时,会主动通过名为 ethX 的网络设备进行 coap 广播,若探测到对端设备存在则会启动自组网。

客户端 API

头文件在 sdk 和 initrd 中均存放在/usr/include/dsoftbus/下,其中:

  1. discovery_service.h:发现模块头文件,支持应用主动探测和发布的 API 如下:

其中服务能力通过g\_capabilityMap数组定义,用户若新增能力需要自定义修改该数组,并重新编译软总线服务端和客户端程序来生效。

  1. softbus_bus_center.h:组网模块头文件,支持获取组网内设备信息 API 如下:

  1. session.h:连接/传输模块头文件,支持创建 session 和数据传输 API 如下:


应用示例

使用 QEMU 部署分布式软总线,编写客户端程序,使其能够列出所有发现的设备信息。

  1. 编写客户端程序

编写客户端程序依托于 Embedded 版本发布的 SDK,按如下步骤进行 SDK 环境使用准备。

  • 安装 SDK

执行 SDK 自解压安装脚本

sh openeuler-glibc-x86_64-openeuler-image-aarch64-qemu-aarch64-toolchain-22.03.sh
复制代码

根据提示输入工具链的安装路径,默认路径是/opt/openeuler/<openeuler version>/;若不设置,则按默认路径安装;也可以配置相对路径或绝对路径。

举例如下:

sh ./openeuler-glibc-x86_64-openeuler-image-armv7a-qemu-arm-toolchain-22.03.sh``openEuler embedded(openEuler Embedded Reference Distro) SDK installer version 22.03================================================================Enter target directory for SDK (default: /opt/openeuler/22.03): sdkYou are about to install the SDK to "/usr1/openeuler/sdk". Proceed [Y/n]? yExtracting SDK...............................................doneSetting it up...SDK has been successfully set up and is ready to be used.Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.. /usr1/openeuler/sdk/environment-setup-armv7a-openeuler-linux-gnueabi
复制代码
  1. 设置 SDK 环境变量

前一步执行结束最后已打印 source 命令,运行即可。

. /usr1/openeuler/myfiles/sdk/environment-setup-armv7a-openeuler-linux-gnueabi
复制代码
  1. 查看是否安装成功

运行如下命令,查看是否安装成功、环境设置成功。

arm-openeuler-linux-gnueabi-gcc -v
复制代码

接下来编写客户端程序。

创建一个main.c文件,源码如下:

#include "dsoftbus/softbus_bus_center.h"#include <stdio.h>#include <stdlib.h>int main(void){    int32_t infoNum = 10;    NodeBasicInfo **testInfo = malloc(sizeof(NodeBasicInfo *) * infoNum);    int ret = GetAllNodeDeviceInfo("testClient", testInfo, &infoNum);    if (ret != 0) {        printf("Get node device info fail.\n");        return 0;    }    printf("Get node num: %d\n", infoNum);    for (int i = 0; i < infoNum; i++) {        printf("\t networkId: %s, deviceName: %s, deviceTypeId: %d\n",        testInfo[i]->networkId,        testInfo[i]->deviceName,        testInfo[i]->deviceTypeId);    }    for (int i = 0; i < infoNum; i++) {        FreeNodeInfo(testInfo[i]);    }    free(testInfo);    testInfo = NULL;
return 0;}
复制代码


创建一个CMakeLists.txt文件,源码如下:

project(dsoftbus_hello C)add_executable(dsoftbus_hello main.c)target_link_libraries(dsoftbus_hello dsoftbus_bus_center_service_sdk.z)
复制代码

编译客户端

mkdir buildcd buildcmake ..make
复制代码

编译完成后会得到dsoftbus_hello

  1. 构建 QEMU 组网环境

在 host 中创建网桥 br0

brctl addbr br0
复制代码

启动 qemu1

qemu-system-aarch64 -M virt-4.0 -m 1G -cpu cortex-a57 -nographic -kernel zImage -initrd <openeuler-image-qemu-xxx.cpio.gz> -device virtio-net-device,netdev=tap0,mac=52:54:00:12:34:56 -netdev bridge,id=tap0
复制代码

注意

首次运行如果出现如下错误提示:

failed to parse default acl file `/usr/local/libexec/../etc/qemu/bridge.conf'qemu-system-aarch64: bridge helper failed
复制代码

则需要向指示的文件添加“allow br0”

echo "allow br0" > /usr/local/libexec/../etc/qemu/bridge.conf
复制代码

启动 qemu2

qemu-system-aarch64 -M virt-4.0 -m 1G -cpu cortex-a57 -nographic -kernel zImage -initrd openeuler-image-qemu-aarch64-20220331025547.rootfs.cpio.gz  -device virtio-net-device,netdev=tap1,mac=52:54:00:12:34:78 -netdev bridge,id=tap1
复制代码

注意

qemu1 与 qemu2 的 mac 地址需要配置为不同的值。

配置 IP

配置 host 的网桥地址

ifconfig br0 192.168.10.1 up
复制代码

配置 IP

配置 host 的网桥地址

ifconfig eth0 192.168.10.2
复制代码

配置 qemu2 的网络地址

ifconfig eth0 192.168.10.3
复制代码

分别在 host、qemu1、qemu2 使用 ping 进行测试,确保 qemu1 可以 ping 通 qemu2。

  1. 启动分布式软总线

在 qemu1 和 qemu2 中启动分布式软总线的服务端

softbus_server_main >log.file &
复制代码

将编译好的客户端分发到 qemu1 和 qemu2 的根目录中

scp dsoftbus_hello root@192.168.10.2:/scp dsoftbus_hello root@192.168.10.3:/
复制代码


分别在 qemu1 和 qemu2 的根目录下运行 dsoftbus_hello,将得到如下输出:

qemu1

[LNN]NodeStateCbCount is 10[LNN]BusCenterClientInit init OK![DISC]Init success[TRAN]init tcp direct channel success.[TRAN]init succ[COMM]softbus server register service success!
[COMM]softbus sdk frame init success.Get node num: 1 networkId: 714373d691265f9a736442c01459ba39236642c743a71750bb63eb73cde24f5f, deviceName: UNKNOWN, deviceTypeId: 0
复制代码

qemu2

[LNN]NodeStateCbCount is 10[LNN]BusCenterClientInit init OK![DISC]Init success[TRAN]init tcp direct channel success.[TRAN]init succ[COMM]softbus server register service success!
[COMM]softbus sdk frame init success.Get node num: 1 networkId: eaf591f64bab3c20304ed3d3ff4fe1d878a0fd60bf8c85c96e8a8430d81e4076,deviceName: UNKNOWN, deviceTypeId: 0
复制代码

qemu1 和 qemu2 分别输出了发现的对方设备的基础信息。

编译指导

编译依托于 Embedded 版本发布的容器镜像,请参考容器构建指导进行容器环境准备。

容器构建指导链接:https://docs.openeuler.org/zh/docs/22.03_LTS/docs/Embedded/容器构建指导.html


  1. 下载脚本所在仓库(例如下载到src/yocto-meta-openeuler目录下)

git clone https://gitee.com/openeuler/yocto-meta-openeuler.git -b openEuler-22.03-LTS -v src/yocto-meta-openeuler
复制代码
  1. 执行下载脚本

下载最新软总线代码:

sh src/yocto-meta-openeuler/scripts/download_code.sh dsoftbus
复制代码

代码默认下载到与yocto-meta-openeuler同级别的路径,如需修改软总线或者其依赖的模块代码可到对应路径下查找dsoftbus/_standardyocto-embedded-tools仓库进行对应修改。


3. 编译编译脚本

编译最新软总线代码:

sh src/yocto-meta-openeuler/scripts/compile.sh dsoftbus
复制代码

编译工作目录名为dsoftbus/_build,编译生成件目录名为dsoftbus/_output,二者均默认与yocto-meta-openeuler在同级别路径。

限制约束

仅支持局域网下的 coap 发现。WIFI/BLE 等功能在后续版本中持续支持。

目前提供的 IPC、SN 号等软总线的依赖模块均为样例,仅支持双设备节点部署,client-server 一对一部署的能力。期待后续与社区伙伴,根据实际场景共同对这些依赖模块进行实例化。

关注我们

Embedded 已经在 openEuler 社区开源。将开展一系列主题分享,如果您对 Embedded 的构建,应用感兴趣,欢迎围观和加入。

项目地址:https://gitee.com/openeuler/yocto-meta-openeuler

欢迎大家多多 star、fork,参与社区开发与贡献。

如果您对嵌入式应用感兴趣,欢迎加入 openEuler Embedded&Yocto SIG ,讨论 Embedded 和 Yocto 等相关技术。

发布于: 2 小时前阅读数: 7
用户头像

openEuler

关注

还未添加个人签名 2020.09.30 加入

开源操作系统 openEuler 是由开放原子开源基金会(OpenAtom Foundation)孵化及运营的开源项目

评论

发布
暂无评论
openEuler Embedded SIG | 分布式软总线_开源_openEuler_InfoQ写作社区