README.md
1# DSoftBus
2
3
4## Introduction
5
6DSoftBus implements unified distributed communications between near-field devices and provides APIs for device discovery, connection, networking, and data transmission, regardless of the link type. It provides the following capabilities:
7
8- Device discovery and connection in various communication modes, such as WLAN and Bluetooth.
9- Unified device networking and topology management, and device information provisioning for data transmission.
10- Channel setup for transmitting messages, bytes, streams, and files.
11
12You can use the APIs provided by DSoftBus to implement fast communication between devices without caring about the communication details, which facilitating deployment and running of services across platforms.
13
14## Architecture
15
16
17
18**Figure 1** DSoftBus architecture
19
20## Directory Structure
21
22The DSoftBus directory structure is as follows:
23
24```text
25//foundation/communication/dsoftbus
26├── adapter # Adaptation code
27├── components # Dependent component code
28├── core # Core code
29│ ├── adapter # Adaptation code
30│ ├── authentication # Authentication code
31│ ├── bus_center # Networking code
32│ ├── common # Common code
33│ ├── connection # Connection code
34│ ├── discovery # Discovery code
35│ ├── frame # Framework code
36│ └── transmission # Transmission code
37├── interfaces # External APIs
38├── sdk # Service process code
39│ ├── bus_center # Networking code
40│ ├── discovery # Discovery code
41│ ├── frame # Framework code
42│ └── transmission # Transmission code
43├── tests # Test code
44└── tools # Tool code
45```
46
47## Constraints
48
49- Connections can be set up only between the devices in the same LAN or between near-field devices.
50- Before setting up a connection between two devices, you must bind the devices. For details about the binding process, see [the Security subsystem](https://gitee.com/openharmony/docs/blob/master/zh-cn/readme/%E5%AE%89%E5%85%A8%E5%9F%BA%E7%A1%80%E8%83%BD%E5%8A%9B%E5%AD%90%E7%B3%BB%E7%BB%9F.md) readme file.
51- After data transmission is complete, the service needs to close the session to release resources.
52
53## Usage
54
55### Usage Guidelines
56
57>**NOTE**
58>
59>- The permissions ohos.permission.DISTRIBUTED_DATASYNC and ohos.permission.DISTRIBUTED_SOFTBUS_CENTER are required for remote procedure calls (RPCs) across devices.
60
61**1. Discovery**
62
63- **Publishing process**
64
651. Publish a service of your application.
66
67 ```C
68 // Callback for service publishing.
69 typedef struct {
70 /** Callback used to return the publish result. */
71 void (*OnPublishResult)(int publishId, PublishResult reason);
72 } IPublishCb;
73
74 // Publish information.
75 typedef struct {
76 int publishId; // Publish ID.
77 DiscoverMode mode; // Publish mode.
78 ExchangeMedium medium; // Medium used for publishing the service.
79 ExchangeFreq freq; // Service publishing frequency.
80 const char *capability; // Capability of the device that can be discovered.
81 unsigned char *capabilityData; // Custom data for service publishing
82 unsigned int dataLen; // Length of the data.
83 bool ranging; // Whether to measure the distance.
84 } PublishInfo;
85
86 // Publish a service.
87 int32_t PublishLNN(const char *pkgName, const PublishInfo *info, const IPublishCb *cb);
88 ```
89
902. Unpublish a service of your application.
91
92 ```C
93 // Unpublish a service.
94 int32_t StopPublishLNN(const char *pkgName, int32_t publishId);
95 ```
96
97
98- **Discovery process**
99
1001. Discover a device.
101
102 ```C
103 // Callbacks for device discovery.
104 typedef struct {
105 /** Callback invoked when a device is found. */
106 void (*OnDeviceFound)(const DeviceInfo *device);
107 /** Callback invoked to return the device discovery result. */
108 void (*OnDiscoverResult)(int32_t refreshId, RefreshResult reason);
109 } IRefreshCallback;
110
111 // Start device discovery.
112 int32_t RefreshLNN(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb);
113 ```
114
1152. DSoftBus notifies the service of the device information via the callback once a device is found.
1163. Stop device discovery.
117
118 ```C
119 // Stop the discovery.
120 int32_t StopRefreshLNN(const char *pkgName, int32_t refreshId);
121 ```
122
123**2. Networking**
124
1251. Initiate a connection request with the address of the target device and the connection callback.
126
127 ```C
128 // Address to connect to.
129 typedef struct {
130 ConnectionAddrType type;
131 union {
132 struct BrAddr {
133 char brMac[BT_MAC_LEN];
134 } br;
135 struct BleAddr {
136 char bleMac[BT_MAC_LEN];
137 uint8_t udidHash[UDID_HASH_LEN];
138 } ble;
139 struct IpAddr {
140 char ip[IP_STR_MAX_LEN];
141 uint16_t port;
142 } ip;
143 } info;
144 char peerUid[MAX_ACCOUNT_HASH_LEN];
145 } ConnectionAddr;
146
147 // Address type.
148 typedef enum {
149 CONNECTION_ADDR_WLAN = 0,
150 CONNECTION_ADDR_BR,
151 CONNECTION_ADDR_BLE,
152 CONNECTION_ADDR_ETH,
153 CONNECTION_ADDR_MAX
154 } ConnectionAddrType;
155
156 // Callback invoked to return the connection result.
157 typedef void (*OnJoinLNNResult)(ConnectionAddr *addr, const char *networkId, int32_t retCode);
158
159 // Initiate a connection request.
160 int32_t JoinLNN(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb);
161 ```
162
1632. Wait for the connection result. If DSoftBus accepts the connection request, a callback is invoked to return the result. In the return value, if **retCode** is **0**, the connection is successful, and the **addr** parameter matches the **target** parameter in **JoinLNN()**. In this case, the value of **networkId** is valid and will be used in the data transmission and disconnection APIs. If the value of **retCode** is not **0**, the connection fails, and the value of **networkId** is invalid.
1643. Transmit data using transmission APIs.
1654. Initiate a disconnection request with the **networkId** and the callback.
166
167 ```C
168 // Callback invoked to return the disconnection result.
169 typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode);
170
171 // Initiate a disconnection request.
172 int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb);
173 ```
174
1755. Wait until the disconnection is complete. The **networkId** parameter in **OnLeaveLNNResult()** matches **networkId** in **LeaveLNN()**. If **retCode** is **0**, the disconnection is successful; otherwise, the disconnection fails. If the disconnection is successful, **networkId** becomes invalid and can no longer be used.
1766. Register and unregister callbacks for device state changes.
177
178 ```C
179 // Device state events.
180 #define EVENT_NODE_STATE_ONLINE 0x1
181 #define EVENT_NODE_STATE_OFFLINE 0x02
182 #define EVENT_NODE_STATE_INFO_CHANGED 0x04
183 #define EVENT_NODE_STATUS_CHANGED 0x08
184 #define EVENT_NODE_STATE_MASK 0xF
185
186 // Device information.
187 typedef struct {
188 char networkId[NETWORK_ID_BUF_LEN];
189 char deviceName[DEVICE_NAME_BUF_LEN];
190 uint16_t deviceTypeId;
191 } NodeBasicInfo;
192
193 // Device state event callbacks.
194 typedef struct {
195 uint32_t events; // Networking event mask.
196 void (*onNodeOnline)(NodeBasicInfo *info); // Called when the device gets online.
197 void (*onNodeOffline)(NodeBasicInfo *info); // Called when the device gets offline.
198 void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // Called when the device information changes.
199 void (*onNodeStatusChanged)(NodeStatusType type, NodeStatus *status); // Called when the device running status changes.
200 } INodeStateCb;
201
202 // Register the callback for device state events.
203 int32_t RegNodeDeviceStateCb(const char *pkgName, INodeStateCb *callback);
204
205 // Unregister the callback for device state events.
206 int32_t UnregNodeDeviceStateCb(INodeStateCb *callback);
207 ```
208
209**3. Transmission**
210
2111. Create a **Socket** instance.
212
213 ```C
214 typedef struct {
215 char *name; // Local socket name.
216 char *peerName; // Peer socket name.
217 char *peerNetworkId; // Peer network ID.
218 char *pkgName; // Bundle name of the caller.
219 TransDataType dataType; // Type of the data to be transmitted, which must be the same as that in the sender() method.
220 } SocketInfo;
221
222 // Create sockets.
223 int32_t Socket(SocketInfo info);
224 ```
225
2262. Start listening for the socket on the server, and bind the socket on the client.
227
228 ```C
229 // Callbacks for the socket.
230 typedef struct {
231 void (*OnBind)(int32_t socket, PeerSocketInfo info);
232 void (*OnShutdown)(int32_t socket, ShutdownReason reason);
233 void (*OnBytes)(int32_t socket, const void *data, uint32_t dataLen);
234 void (*OnMessage)(int32_t socket, const void *data, uint32_t dataLen);
235 void (*OnStream)(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param);
236 void (*OnFile)(int32_t socket, FileEvent *event);
237 void (*OnQos)(int32_t socket, QoSEvent eventId, const QosTV *qos, uint32_t qosCount);
238 void (*OnError)(int32_t socket, int32_t errCode);
239 } ISocketListener;
240
241 typedef enum {
242 QOS_TYPE_MIN_BW, // Minimum bandwidth.
243 QOS_TYPE_MAX_WAIT_TIMEOUT, // Maximum time allowed for the bind operation.
244 QOS_TYPE_MIN_LATENCY, // Minimum latency for link setup.
245 QOS_TYPE_RTT_LEVEL, // Level of the RTT.
246 QOS_TYPE_MAX_BUFFER, // Maximum buffer size (reserved).
247 QOS_TYPE_FIRST_PACKAGE, // Size of the first packet (reserved).
248 QOS_TYPE_MAX_IDLE_TIMEOUT, // Maximum idle time.
249 QOS_TYPE_TRANS_RELIABILITY,// Transmission reliability (reserved).
250 QOS_TYPE_BUTT,
251 } QosType;
252
253 typedef struct {
254 QosType qos;
255 int32_t value;
256 } QosTV;
257
258 // Start listening for the socket on the server.
259 int32_t Listen(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener);
260
261 // Bind the socket on the client.
262 int32_t Bind(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener);
263 ```
264
2654. Send data to the peer device through the socket.
266
267 ```C
268 // Send bytes.
269 int32_t SendBytes(int32_t socket, const void *data, uint32_t len);
270 // Send messages.
271 int32_t SendMessage(int32_t socket, const void *data, uint32_t len);
272 // Send streams.
273 int32_t SendStream(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param);
274 // Send a file.
275 int32_t SendFile(int32_t socket, const char *sFileList[], const char *dFileList[], uint32_t fileCnt);
276 ```
277
2785. Shut down the socket.
279
280 ```C
281 // Shut down the socket.
282 void Shutdown(int32_t socket);
283 ```
284
285**4. Device Management**
286
287- **Choose the Wi-Fi keepalive mode.**
288
2891. Call **ShiftLNNGear** on the DSoftBus client to invoke the server **ShiftLNNGear** through an IPC interface. The policy management module adjusts the keepalive attributes of the long-lived TCP connection based on the policy.
290
291 ```C
292 typedef struct {
293 ModeCycle cycle; // Interval for detecting whether the Wi-Fi connection is alive.
294 ModeDuration duration; // Heartbeat mode duration.
295 bool wakeupFlag; // Whether to wake up the peer device.
296 ModeAction action; // Mode to select.
297 } GearMode;
298
299 typedef enum {
300 /**< The heartbeat interval is 30 seconds. */
301 HIGH_FREQ_CYCLE = 30,
302 /**< The heartbeat interval is 60 seconds. */
303 MID_FREQ_CYCLE = 60,
304 /**< The heartbeat interval is 5 minutes. */
305 LOW_FREQ_CYCLE = 5 * 60,
306 /**< The heartbeat interval is 10 minutes. */
307 DEFAULT_FREQ_CYCLE = 10 * 60,
308 } ModeCycle;
309
310 // Adjust the keepalive parameters of the long-lived TCP connection based on the policy.
311 int32_t ShiftLNNGear(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode);
312 ```
313
3142. Set **ModeCycle** for the service, which determines the TCP keepalive duration for the device.
315
316 ```C
317 If HIGH_FREQ_CYCLE is used, the TCP keepalive duration is within 40 seconds.
318 If MID_FREQ_CYCLE is used, the actual TCP keepalive duration is within 70 seconds.
319 If LOW_FREQ_CYCLE is used, the TCP keepalive duration is within 315 seconds.
320 If DEFAULT_FREQ_CYCLE is used, the TCP keepalive duration is within 615 seconds.
321 ```
322
323## Repositories Involved
324
325[DSoftBus](https://gitee.com/openharmony/docs/blob/master/en/readme/dsoftbus.md)
326
327**communication_dsoftbus**
328
329[communication_bluetooth](https://gitee.com/openharmony/communication_bluetooth)
330
331[communication_ipc](https://gitee.com/openharmony/communication_ipc)
332
333[communication_wifi](https://gitee.com/openharmony/communication_wifi)
334