鸿蒙开源组件——分布式软总线组件
头像 宋你一朵小红花 2021-06-14 10:02:25    发布
3997 浏览 11 点赞 13 收藏

分布式软总线组件

简介

由于设备通信方式多种多样(WIFI、蓝牙等),不同通信方式使用差异大,问题多。同时通信链路的融合共享和冲突无法处理。分布式软总线实现近场设备间统一的分布式通信能力管理,提供不区分链路的设备发现连接、组网和传输能力,主要包括如下:

  • 发现连接:提供基于Wifi、蓝牙等通信方式的设备发现连接能力。
  • 设备组网:提供统一的设备组网和拓扑管理能力,为数据传输提供已组网设备信息。
  • 数据传输:提供数据传输通道,支持消息、字节数据传输等能力。

业务方通过使用分布式软总线提供的API实现设备间高速通信,不用关心通信细节,进而实现业务平台部署与运行能力。

系统架构

目录

分布式软总线组件主要代码目录结构如下:


/foundation/communication/dsoftbus
├── interfaces            # 接口代码
├── core                  # 核心代码
│   ├── common            # 通用代码
│   ├── adapter           # 适配层代码
│   ├── authentication    # 认证代码
│   ├── bus_center        # 组网代码
│   ├── connection        # 连接代码
│   ├── discovery         # 发现代码
│   ├── transmission      # 传输代码
│   └── frame             # 框架代码
├── sdk                   # 运行业务进程代码
│   ├── bus_center        # 组网代码
│   ├── discovery         # 发现代码
│   ├── transmission      # 传输代码
│   └── frame             # 框架代码
└── components            # 依赖组件代码

约束

  • 组网设备需在同一局域网中。
  • 组网之前,需先完成设备绑定,绑定流程参见安全子系统中说明。

说明

使用说明

须知: 使用跨设备通信时,必须添加权限ohos.permission.DISTRIBUTED_DATASYNC,该权限类型为dangerous。

1、发现

  • 发布流程
  1. 上层应用需要对外发布自身能力时,调用服务发布接口发布自身能力。// 发布回调 typedef struct { void (*OnPublishSuccess)(int publishId); //发布成功时回调 void (*OnPublishFail)(int publishId, PublishFailReason reason);//发布失败时回调 } IPublishCallback; // 发布服务 int PublishService(const char *pkgName, const PublishInfo *info, const IPublishCallback *cb);1.2.3.4.5.6.7.8.
  2. 上层应用不再需要对外发布自身能力时,调用UnpublishService接口注销服务。

  • 发现流程
  1. 上层应用需要发现特定能力设备时,调用发现接口启动发现。// 发现回调 typedef struct { void (*OnDeviceFound)(const DeviceInfo *device); //发现设备回调 void (*OnDiscoverFailed)(int subscribeId, DiscoveryFailReason failReason); //启动发现失败回调 void (*OnDiscoverySuccess)(int subscribeId); //启动发现成功回调 } IDiscoveryCallback; // 发现服务 int StartDiscovery(const char *pkgName, const SubscribeInfo *info, const IDiscoveryCallback *cb);1.2.3.4.5.6.7.8.9.
  2. 软总线发现到设备时,通过回调接口通知业务发现的设备信息。
  3. 上层应用不再需要发现时,调用StopDiscovery接口停止设备发现。
// 停止服务
int StopDiscovery(const char *pkgName, int subscribeId);

2、组网

  1. 发起组网请求,携带组网连接地址信息,并且提供组网执行结果回调函数。// 组网连接地址 typedef struct { ConnectionAddrType type; union { struct BrAddr { char brMac[BT_MAC_LEN]; } br; struct BleAddr { char bleMac[BT_MAC_LEN]; } ble; struct IpAddr { char ip[IP_STR_MAX_LEN]; int port; } ip; } info; } ConnectionAddr; // 组网连接地址类型 typedef enum { CONNECTION_ADDR_WLAN = 0, CONNECTION_ADDR_BR, CONNECTION_ADDR_BLE, CONNECTION_ADDR_ETH, CONNECTION_ADDR_MAX } ConnectionAddrType; // 组网请求执行结果回调 typedef void (*OnJoinLNNResult)(ConnectionAddr *addr, const char *networkId, int32_t retCode); // 发起组网请求 int32_t JoinLNN(ConnectionAddr *target, OnJoinLNNResult cb);1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.
  2. 等待组网结果,JoinLNN()返回成功表示软总线接受了组网请求,组网结果通过回调函数通知业务;组网回调函数中addr参数内容和JoinLNN()的入参互相匹配;retCode如果为0,表示组网成功,此时networkId为有效值,后续传输、退网等接口均需使用该参数;retCode如果不为0,表示组网失败,此时networkId为无效值。
  3. 使用传输相关接口进行数据传输。
  4. 发送退网请求,携带组网成功后返回的networkId,并且提供退网执行结果回调。
// 退网执行结果回调
typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode);

// 退网请求
int32_t LeaveLNN(const char *networkId, OnLeaveLNNResult cb);

等待退网完成,OnLeaveLNNResult()的networkId和退网请求接口中的networkId互相匹配;retCode为0表示退网成功,否则退网失败。退网成功后,networkId变为无效值,后续不应该被继续使用。

使用节点(即设备)注册和注销接口,监听网络中节点状态变化等事件。


// 事件掩码
#define EVENT_NODE_STATE_ONLINE 0x1
#define EVENT_NODE_STATE_OFFLINE 0x02
#define EVENT_NODE_STATE_INFO_CHANGED 0x04
#define EVENT_NODE_STATE_MASK 0x07

// 节点信息
typedef struct {
    char networkId[NETWORK_ID_BUF_LEN];
    char deviceName[DEVICE_NAME_BUF_LEN];
    uint8_t deviceTypeId;
} NodeBasicInfo;

// 节点状态事件回调
typedef struct {
    uint32_t events; // 组网事件掩码
    void (*onNodeOnline)(NodeBasicInfo *info);   // 节点上线事件回调
    void (*onNodeOffline)(NodeBasicInfo *info);  // 节点下线事件回调
    void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // 节点信息变化事件回调
} INodeStateCb;

//  注册节点状态事件回调
int32_t RegNodeDeviceStateCb(INodeStateCb *callback);

// 注销节点状态事件回调
int32_t UnregNodeDeviceStateCb(INodeStateCb *callback);

3、传输

  1. 创建会话服务,并设置会话相关回调,用户可在回调中处理打开/关闭和消息接收事件。// 会话管理回调 typedef struct { int (*OnSessionOpened)(int sessionId, int result); void (*OnSessionClosed)(int sessionId); void (*OnBytesReceived)(int sessionId, const void *data, unsigned int dataLen); void (*OnMessageReceived)(int sessionId, const void *data, unsigned int dataLen); } ISessionListener; // 创建会话服务 int CreateSessionServer(const char *pkgName, const char *sessionName, const ISessionListener* listener);
  2. 创建会话 ,用于收发数据。
  3. 通过sessionId向对端设备发送数据。// 发送字节数据 int SendBytes(int sessionId, const void *data, unsigned int len); // 发送消息数据 int SendMessage(int sessionId, const void *data, unsigned int len);
  4. 通过sessionId关闭会话。// 关闭会话 void CloseSession(int sessionId);
  5. 删除会话服务。// 删除会话服务 int RemoveSessionServer(const char *pkgName, const char *sessionName);1.2.



©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
其它
地址:北京市朝阳区北三环东路三元桥曙光西里甲1号第三置业A座1508室 商务内容合作QQ:2291221 电话:13391790444或(010)62178877
版权所有:电脑商情信息服务集团 北京赢邦策略咨询有限责任公司
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,我司致力于保护作者版权,如有侵权,请与我司联系删除
京ICP备:2022009079号-2
京公网安备:11010502051901号
ICP证:京B2-20230255