---
title: Embedded SIG | 分布式软总线-官方技术文章-TaiShan Community
description: 本文主要介绍Embedded SIG分布式软总线相关特性，应用指南以及限制约束等内容。
keywords: Embedded,SIG,分布式软总线,官方技术文章,TaiShan,Community,特性介绍,背景
url: https://www.hikunpeng.com/developer/techArticles/20230901-6?envFlag=1
section: (其他)
---

# Embedded SIG | 分布式软总线-官方技术文章-TaiShan Community

URL: https://www.hikunpeng.com/developer/techArticles/20230901-6?envFlag=1
描述: 本文主要介绍Embedded SIG分布式软总线相关特性，应用指南以及限制约束等内容。
关键词: Embedded,SIG,分布式软总线,官方技术文章,TaiShan,Community,特性介绍,背景

官方技术文章 [了解详情](https://www.hikunpeng.com/zh/developer/techArticles)

Embedded SIG | 分布式软总线

Embedded SIG | 分布式软总线

实战经验

Released 2022/07/23

0

## 特性介绍

### 1. 背景

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

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

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

### 2. 架构

软总线的主要架构如下：

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

（1）即插即用：快速便捷发现周边设备。

（2）自由流转：各设备间自组网，任意建立业务连接，实现自由通信。

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

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

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

## 应用指南

### 1. 部署示意

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

注意：

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

### 2. 服务端启动

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

```
1  ```bash
2  openeuler ~ # softbus_server_main >log.file &
3  ```
```

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

### 3. 客户端API

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

（1）discovery\_service.h：发现模块头文件，支持应用主动探测和发布的API如下：

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

（2）softbus\_bus\_center.h：组网模块头文件，支持获取组网内设备信息API如下：

（3）session.h：连接/传输模块头文件，支持创建session和数据传输API如下：

各API参数详见头文件描述。

### 4. 应用示例

（1）编写客户端程序

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

a. 安装SDK

执行SDK自解压安装脚本

```
1  ```bash
2  sh openeuler-glibc-x86_64-openeuler-image-aarch64-qemu-aarch64-toolchain-22.03.sh
3   ```
```

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

举例如下：

```

1  ```bash
2  sh ./openeuler-glibc-x86_64-openeuler-image-armv7a-qemu-arm-toolchain-22.03.sh``
3  openEuler embedded(openEuler Embedded Reference Distro) SDK installer version 22.03
4  ================================================================
5  Enter target directory for SDK (default: /opt/openeuler/22.03): sdk
6  You are about to install the SDK to "/usr1/openeuler/sdk". Proceed [Y/n]? y
7  Extracting SDK...............................................done
8  Setting it up...SDK has been successfully set up and is ready to be used.
9  Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g.
10  . /usr1/openeuler/sdk/environment-setup-armv7a-openeuler-linux-gnueabi
11   ```
```

b. 设置SDK环境变量

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

```
1  ```bash
2  . /usr1/openeuler/myfiles/sdk/environment-setup-armv7a-openeuler-linux-gnueabi
3  ```
```

c. 查看是否安装成功

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

```
1  ```bash
2  arm-openeuler-linux-gnueabi-gcc -v
3  ```
```

接下来编写客户端程序。

创建一个main.c文件，源码如下：

```
1  ```c
2      #include "dsoftbus/softbus_bus_center.h"
3      #include <stdio.h>
4      #include <stdlib.h>
5      int main(void)
6  {
7          int32_t infoNum = 10;
8          NodeBasicInfo **testInfo = malloc(sizeof(NodeBasicInfo *) * infoNum);
9          int ret = GetAllNodeDeviceInfo("testClient", testInfo, &infoNum);
10          if (ret != 0) {
11              printf("Get node device info fail.\n");
12              return 0;
13          }
14          printf("Get node num: %d\n", infoNum);
15          for (int i = 0; i < infoNum; i++) {
16              printf("\t networkId: %s, deviceName: %s, deviceTypeId: %d\n",
17              testInfo[i]->networkId,
18              testInfo[i]->deviceName,
19              testInfo[i]->deviceTypeId);
20          }
21          for (int i = 0; i < infoNum; i++) {
22              FreeNodeInfo(testInfo[i]);
23          }
24          free(testInfo);
25          testInfo = NULL;
26  
27          return 0;
28      }
29  ```
```

创建一个`CMakeLists.txt`文件，源码如下：

```
1  ```bash
2  project(dsoftbus_hello C)
3  add_executable(dsoftbus_hello main.c)
4  target_link_libraries(dsoftbus_hello dsoftbus_bus_center_service_sdk.z)
5  ```
```

编译客户端

```
1   ```bash
2  mkdir build
3  cd build
4  cmake ..
5  make
6  ```
```

编译完成后会得到`dsoftbus_hello`。

（2）构建QEMU组网环境

在host中创建网桥br0

```
1   ```bash
2  brctl addbr br0
3  ```
```

启动qemu1

```
1  ```bash
2  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
3  ```
```

注意

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

```
1  ```bash
2  failed to parse default acl file `/usr/local/libexec/../etc/qemu/bridge.conf'
3  qemu-system-aarch64: bridge helper failed
4   ```
```

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

```
1  ```bash
2  echo "allow br0" > /usr/local/libexec/../etc/qemu/bridge.conf
3  ```
```

启动qemu2

```
1  ```bash
2  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
3  ```
```

注意

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

配置IP

```
1  配置host的网桥地址
2  ```bash
3  ifconfig br0 192.168.10.1 up
4  ```
5  
6  配置qemu1的网络地址
7  ```bash
8  ifconfig eth0 192.168.10.2
9  ```
10  
11  配置qemu2的网络地址
12  ```bash
13  ifconfig eth0 192.168.10.3
14  ```
```

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

（3）启动分布式软总线

```
1  在qemu1和qemu2中启动分布式软总线的服务端
2  
3  ```bash
4  softbus_server_main >log.file &
5  ```
6  
7  将编译好的客户端分发到qemu1和qemu2的根目录中
8  
9  ```bash
10  scp dsoftbus_hello root@192.168.10.2:/
11  scp dsoftbus_hello root@192.168.10.3:/
12  ```
```

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

```
1  qemu1
2  
3  ```bash
4  [LNN]NodeStateCbCount is 10
5  [LNN]BusCenterClientInit init OK!
6  [DISC]Init success
7  [TRAN]init tcp direct channel success.
8  [TRAN]init succ
9  [COMM]softbus server register service success!
10  
11 [COMM]softbus sdk frame init success.
12  Get node num: 1
13  networkId: 714373d691265f9a736442c01459ba39236642c743a71750bb63eb73cde24f5f, deviceName: UNKNOWN, deviceTypeId: 0
14  ```
15  
16  qemu2
17  
18  ```bash
19  [LNN]NodeStateCbCount is 10
20  [LNN]BusCenterClientInit init OK!
21  [DISC]Init success
22  [TRAN]init tcp direct channel success.
23  [TRAN]init succ
24  [COMM]softbus server register service success!
25  
26  [COMM]softbus sdk frame init success.
27  Get node num: 1
28  networkId: eaf591f64bab3c20304ed3d3ff4fe1d878a0fd60bf8c85c96e8a8430d81e4076,deviceName: UNKNOWN, deviceTypeId: 0
29  ```
```

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

### 5. 编译指导

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

容器构建指导链接：

<https://docs.openeuler.org/zh/docs/22.03_LTS/docs/Embedded/ [了解详情](https://docs.openeuler.org/zh/docs/22.03_LTS/docs/Embedded/)容器构建指导.html>

（1）下载脚本所在仓库（例如下载到`src/yocto-meta-openeuler`目录下）

```
1  ```bash
2  git clone https://gitcode.com/openeuler/yocto-meta-openeuler.git -b openEuler-22.03-LTS -v src/yocto-meta-openeuler
3  ```
```

（2）执行下载脚本

```
1   下载最新软总线代码:
2  ```bash
3  sh src/yocto-meta-openeuler/scripts/download_code.sh dsoftbus
4  ```
```

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

（3）编译编译脚本

```
1  编译最新软总线代码:
2  ```bash
3  sh src/yocto-meta-openeuler/scripts/compile.sh dsoftbus
4  ```
```

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

## 限制约束

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

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

## 关注我们

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

项目地址：

<https://gitcode.com/openeuler/yocto-meta-openeuler%3E [了解详情](https://gitcode.com/openeuler/yocto-meta-openeuler>)

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

This Page
