There are various communication modes (such as Wi-Fi and Bluetooth), and the usage of different communication modes varies greatly and often leads to problems. In addition, the convergence, sharing, and conflict of communication links cannot be handled. DSoftBus manages unified distributed communications between near-field devices and provides APIs for device discovery, connection, networking, and data transmission, regardless of the link type. It mainly provides the following capabilities:
You can use the APIs provided by DSoftBus to implement fast communications between devices without caring about the communication details, thereby deploying and running services across platforms.
Figure 1 DSoftBus architecture
The main code directory structure of DSoftBus is as follows:
/foundation/communication/dsoftbus
├── interfaces # APIs
├── adapter # Adapter code
├── core # Core code
│ ├── common # Common code
│ ├── authentication # Authentication code
│ ├── bus_center # Networking code
│ ├── connection # Connection code
│ ├── discovery # Discovery code
│ ├── transmission # Transmission code
│ └── frame # Framework code
├── sdk # Service process code
│ ├── bus_center # Networking code
│ ├── discovery # Discovery code
│ ├── transmission # Transmission code
│ └── frame # Framework code
└── components # Dependent component code
NOTICE: To use RPC across devices, you must have the ohos.permission.DISTRIBUTED_DATASYNC permission (which is a dangerous one).
A device can proactively discover a smartphone only when the smartphone has the Visible to all nearby devices feature enabled. (This feature is available in Settings > Super Device > Visible to > All nearby devices.)
1. Discovery
Publish a service of your application.
// Callbacks for service publishing
typedef struct {
void (*OnPublishSuccess)(int publishId); // Called when the service is published successfully.
void (*OnPublishFail)(int publishId, PublishFailReason reason);// Called when the service fails to be published.
} IPublishCallback;
// Publish the service.
int PublishService(const char *pkgName, const PublishInfo *info, const IPublishCallback *cb);
Unpublish a service of your application.
// Unpublish a service.
int UnPublishService(const char *pkgName, int publishId);
Discovery a specified device.
// Callbacks for device discovery
typedef struct {
void (*OnDeviceFound)(const DeviceInfo *device); // Called when a device is found.
void (*OnDiscoverFailed)(int subscribeId, DiscoveryFailReason failReason); // Called when the discovery fails to start.
void (*OnDiscoverySuccess)(int subscribeId); // Called when the discovery starts successfully.
} IDiscoveryCallback;
// Start a device discovery.
int StartDiscovery(const char *pkgName, const SubscribeInfo *info, const IDiscoveryCallback *cb);
The DSoftBus notifies you of the device information via the callback once a device is found.
Stop the discovery as you need.
// Stop the discovery.
int StopDiscovery(const char *pkgName, int subscribeId);
2. Networking
Initiate a connection request with the address of the target device and the connection callback.
// Address to connect to
typedef struct {
ConnectionAddrType type;
union {
struct BrAddr {
char brMac[BT_MAC_LEN];
} br;
struct BleAddr {
char bleMac[BT_MAC_LEN];
uint8_t udidHash[UDID_HASH_LEN];
} ble;
struct IpAddr {
char ip[IP_STR_MAX_LEN];
uint16_t port;
} ip;
} info;
char peerUid[MAX_ACCOUNT_HASH_LEN];
} ConnectionAddr;
// Address types
typedef enum {
CONNECTION_ADDR_WLAN = 0,
CONNECTION_ADDR_BR,
CONNECTION_ADDR_BLE,
CONNECTION_ADDR_ETH,
CONNECTION_ADDR_MAX
} ConnectionAddrType;
// Callback for the connection result
typedef void (*OnJoinLNNResult)(ConnectionAddr *addr, const char *networkId, int32_t retCode);
// Initiate a connection request.
int32_t JoinLNN(const char *pkgName, ConnectionAddr *target, OnJoinLNNResult cb);
Wait for the connection result. If JoinLNN() returns success, the DSoftBus accepts the connection request and notifies you of the connection result through the callback. The addr parameter in the callback matches the target parameter in JoinLNN(). If retCode in the callback is 0, the connection is successful. 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.
Transmit data using transmission APIs.
Initiate a disconnection request with the networkId and the callback.
// Callback for the disconnection result
typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode);
// Initiate a disconnection request.
int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb);
Wait until the disconnection is complete. The networkId parameter in OnLeaveLNNResult() matches networkId in LeaveLNN(). If retCode in the callback is 0, the disconnection is successful; otherwise, the disconnection fails. If the disconnection is successful, networkId becomes invalid and can no longer be used.
Register and unregister callbacks for device state changes.
// Device state events
#define EVENT_NODE_STATE_ONLINE 0x1
#define EVENT_NODE_STATE_OFFLINE 0x02
#define EVENT_NODE_STATE_INFO_CHANGED 0x04
#define EVENT_NODE_STATUS_CHANGED 0x08
#define EVENT_NODE_STATE_MASK 0xF
// Device information
typedef struct {
char networkId[NETWORK_ID_BUF_LEN];
char deviceName[DEVICE_NAME_BUF_LEN];
uint16_t deviceTypeId;
} NodeBasicInfo;
// Device state event callbacks
typedef struct {
uint32_t events; // Networking event mask
void (*onNodeOnline)(NodeBasicInfo *info); // Called when the device gets online.
void (*onNodeOffline)(NodeBasicInfo *info); // Called when the device gets offline.
void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // Called when the device information changes.
void (*onNodeStatusChanged)(NodeStatusType type, NodeStatus *status); // Called when the device status changed.
} INodeStateCb;
// Register the callback for device state events.
int32_t RegNodeDeviceStateCb(const char *pkgName, INodeStateCb *callback);
// Unregister the callback for device state events.
int32_t UnregNodeDeviceStateCb(INodeStateCb *callback);
3. Transmission
Create a session server with a listener. You can use the listener to monitor events such as opening and closing a session, and receiving messages or bytes.
// Callbacks for session management
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);
void (*OnStreamReceived)(int sessionId, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param);
void (*OnQosEvent)(int sessionId, int eventId, int tvCount, const QosTv *tvList);
} ISessionListener;
// Create a session server.
int CreateSessionServer(const char *pkgName, const char *sessionName, const ISessionListener* listener);
Open a session for sending and receiving data.
// Open a session.
int OpenSession(const char *mySessionName, const char *peerSessionName, const char *peerNetworkId, const char *groupId, const SessionAttribute* attr);
Send data to the peer device based on the session ID.
// Send bytes.
int SendBytes(int sessionId, const void *data, unsigned int len);
// Send messages.
int SendMessage(int sessionId, const void *data, unsigned int len);
Close a session with a specified ID.
// Close a session.
void CloseSession(int sessionId);
Remove the session server.
// Remove the session server.
int RemoveSessionServer(const char *pkgName, const char *sessionName);
communication_dsoftbus
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
Activity
Community
Health
Trend
Influence
:Code submit frequency
:React/respond to issue & PR etc.
:Well-balanced team members and collaboration
:Recent popularity of project
:Star counts, download counts etc.