1# 分布式软总线组件<a name="ZH-CN_TOPIC_0000001103650648"></a> 2 3- [简介](#section13587125816351) 4- [系统架构](#section13587185873516) 5- [目录](#section161941989596) 6- [约束](#section119744591305) 7- [说明](#section1312121216216) 8 - [使用说明](#section1698318421816) 9 10- [相关仓](#section1371113476307) 11 12## 简介<a name="section13587125816351"></a> 13 14现实中多设备间通信方式多种多样\(WIFI、蓝牙等\),不同的通信方式使用差异大,导致通信问题多;同时还面临设备间通信链路的融合共享和冲突无法处理等挑战。分布式软总线实现近场设备间统一的分布式通信管理能力,提供不区分链路的设备间发现连接、组网和传输能力,主要功能如下: 15 16- 发现连接:提供基于Wifi、蓝牙等通信方式的设备发现连接能力。 17- 设备组网:提供统一的设备组网和拓扑管理能力,为数据传输提供已组网设备信息。 18- 数据传输:提供数据传输通道,支持消息、字节数据传输等能力。 19 20业务方通过使用分布式软总线提供的API实现设备间的高速通信,不用关心通信细节,进而实现业务平台的高效部署与运行能力。 21 22## 系统架构<a name="section13587185873516"></a> 23 24**图 1** 分布式软总线组件架构图<a name="fig4460722185514"></a> 25 26 27 28 29## 目录<a name="section161941989596"></a> 30 31分布式软总线组件主要代码目录结构如下: 32 33``` 34/foundation/communication/dsoftbus 35├── interfaces # 接口代码 36├── adapter # 适配层代码 37├── core # 核心代码 38│ ├── common # 通用代码 39│ ├── authentication # 认证代码 40│ ├── bus_center # 组网代码 41│ ├── connection # 连接代码 42│ ├── discovery # 发现代码 43│ ├── transmission # 传输代码 44│ └── frame # 框架代码 45├── sdk # 运行业务进程代码 46│ ├── bus_center # 组网代码 47│ ├── discovery # 发现代码 48│ ├── transmission # 传输代码 49│ └── frame # 框架代码 50└── components # 依赖组件代码 51``` 52 53## 约束<a name="section119744591305"></a> 54 55- 组网设备需在同一局域网中。 56- 组网之前,需先完成设备绑定,绑定流程参见安全子系统中说明。 57 58## 说明<a name="section1312121216216"></a> 59 60### 使用说明<a name="section1698318421816"></a> 61 62>**须知:** 63>使用跨设备通信时,必须添加权限ohos.permission.DISTRIBUTED\_DATASYNC,该权限类型为 _**dangerous**_ 。 64 65>设备主动发现手机时,手机需打开超级终端的允许被“附近设备”发现开关(设置-超级终端-我的设备-允许被发现-附近设备),才能被设备发现。 66 67**1、发现** 68 69- **发布流程** 70 711. 上层应用需要对外发布自身能力时,调用服务发布接口发布自身能力。 72 73 ``` 74 // 发布回调 75 typedef struct { 76 void (*OnPublishSuccess)(int publishId); //发布成功时回调 77 void (*OnPublishFail)(int publishId, PublishFailReason reason);//发布失败时回调 78 } IPublishCallback; 79 80 // 发布服务 81 int PublishService(const char *pkgName, const PublishInfo *info, const IPublishCallback *cb); 82 ``` 83 842. 上层应用不再需要对外发布自身能力时,调用UnpublishService接口注销服务。 85 86 ``` 87 // 注销服务 88 int UnPublishService(const char *pkgName, int publishId); 89 ``` 90 91 92- **发现流程** 93 941. 上层应用需要发现特定能力设备时,调用发现接口启动发现。 95 96 ``` 97 // 发现回调 98 typedef struct { 99 void (*OnDeviceFound)(const DeviceInfo *device); //发现设备回调 100 void (*OnDiscoverFailed)(int subscribeId, DiscoveryFailReason failReason); //启动发现失败回调 101 void (*OnDiscoverySuccess)(int subscribeId); //启动发现成功回调 102 } IDiscoveryCallback; 103 104 // 发现服务 105 int StartDiscovery(const char *pkgName, const SubscribeInfo *info, const IDiscoveryCallback *cb); 106 ``` 107 1082. 当软总线发现到设备时,通过回调接口通知业务所发现的设备信息。 1093. 上层应用不再需要发现时,调用StopDiscovery接口停止设备发现。 110 111 ``` 112 // 停止服务 113 int StopDiscovery(const char *pkgName, int subscribeId); 114 ``` 115 116 117**2、组网** 118 1191. 发起组网请求,携带组网连接地址信息,并且提供组网执行结果回调函数。 120 121 ``` 122 // 组网连接地址 123 typedef struct { 124 ConnectionAddrType type; 125 union { 126 struct BrAddr { 127 char brMac[BT_MAC_LEN]; 128 } br; 129 struct BleAddr { 130 char bleMac[BT_MAC_LEN]; 131 } ble; 132 struct IpAddr { 133 char ip[IP_STR_MAX_LEN]; 134 int port; 135 } ip; 136 } info; 137 } ConnectionAddr; 138 139 // 组网连接地址类型 140 typedef enum { 141 CONNECTION_ADDR_WLAN = 0, 142 CONNECTION_ADDR_BR, 143 CONNECTION_ADDR_BLE, 144 CONNECTION_ADDR_ETH, 145 CONNECTION_ADDR_MAX 146 } ConnectionAddrType; 147 148 // 组网请求执行结果回调 149 typedef void (*OnJoinLNNResult)(ConnectionAddr *addr, const char *networkId, int32_t retCode); 150 151 // 发起组网请求 152 int32_t JoinLNN(ConnectionAddr *target, OnJoinLNNResult cb); 153 ``` 154 1552. 等待组网结果,JoinLNN\(\)返回成功表示软总线接受了组网请求,组网结果通过回调函数通知业务;组网回调函数中addr参数内容和JoinLNN\(\)的入参互相匹配;retCode如果为0,表示组网成功,此时networkId为有效值,后续传输、退网等接口均需使用该参数;retCode如果不为0,表示组网失败,此时networkId为无效值。 1563. 使用传输相关接口进行数据传输。 1574. 发送退网请求,携带组网成功后返回的networkId,并且提供退网执行结果回调。 158 159 ``` 160 // 退网执行结果回调 161 typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode); 162 163 // 退网请求 164 int32_t LeaveLNN(const char *networkId, OnLeaveLNNResult cb); 165 ``` 166 1675. 等待退网完成,OnLeaveLNNResult\(\)的networkId和退网请求接口中的networkId互相匹配;retCode为0表示退网成功,否则退网失败。退网成功后,networkId变为无效值,后续不应该被继续使用。 1686. 使用节点(即设备)注册和注销接口,监听网络中节点状态变化等事件。 169 170 ``` 171 // 事件掩码 172 #define EVENT_NODE_STATE_ONLINE 0x1 173 #define EVENT_NODE_STATE_OFFLINE 0x02 174 #define EVENT_NODE_STATE_INFO_CHANGED 0x04 175 #define EVENT_NODE_STATE_MASK 0x07 176 177 // 节点信息 178 typedef struct { 179 char networkId[NETWORK_ID_BUF_LEN]; 180 char deviceName[DEVICE_NAME_BUF_LEN]; 181 uint16_t deviceTypeId; 182 } NodeBasicInfo; 183 184 // 节点状态事件回调 185 typedef struct { 186 uint32_t events; // 组网事件掩码 187 void (*onNodeOnline)(NodeBasicInfo *info); // 节点上线事件回调 188 void (*onNodeOffline)(NodeBasicInfo *info); // 节点下线事件回调 189 void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // 节点信息变化事件回调 190 } INodeStateCb; 191 192 // 注册节点状态事件回调 193 int32_t RegNodeDeviceStateCb(INodeStateCb *callback); 194 195 // 注销节点状态事件回调 196 int32_t UnregNodeDeviceStateCb(INodeStateCb *callback); 197 ``` 198 199 200**3、传输** 201 2021. 创建会话服务,并设置会话相关回调,用户可在回调中处理打开/关闭和消息接收事件。 203 204 ``` 205 // 会话管理回调 206 typedef struct { 207 int (*OnSessionOpened)(int sessionId, int result); 208 void (*OnSessionClosed)(int sessionId); 209 void (*OnBytesReceived)(int sessionId, const void *data, unsigned int dataLen); 210 void (*OnMessageReceived)(int sessionId, const void *data, unsigned int dataLen); 211 } ISessionListener; 212 213 // 创建会话服务 214 int CreateSessionServer(const char *pkgName, const char *sessionName, const ISessionListener* listener); 215 ``` 216 2172. 创建会话 ,用于收发数据。 218 219 ``` 220 // 创建会话 221 int OpenSession(const char *mySessionName, const char *peerSessionName, const char *peerDeviceId, const char *groupId, const SessionAttribute* attr); 222 ``` 223 2243. 通过sessionId向对端设备发送数据。 225 226 ``` 227 // 发送字节数据 228 int SendBytes(int sessionId, const void *data, unsigned int len); 229 // 发送消息数据 230 int SendMessage(int sessionId, const void *data, unsigned int len); 231 ``` 232 2334. 通过sessionId关闭会话。 234 235 ``` 236 // 关闭会话 237 void CloseSession(int sessionId); 238 ``` 239 2405. 删除会话服务。 241 242 ``` 243 // 删除会话服务 244 int RemoveSessionServer(const char *pkgName, const char *sessionName); 245 ``` 246 247 248## 相关仓<a name="section1371113476307"></a> 249 250分布式软总线子系统 251 252**communication_dsoftbus** 253 254communication_bluetooth 255 256communication_ipc 257 258communication_wifi 259