Между устройствами существует множество способов связи (например, Wi-Fi и Bluetooth). Различия в использовании этих методов связи могут привести к проблемам с передачей данных. Кроме того, существуют многочисленные вызовы при объединении и совместной работе связей между устройствами и управлении конфликтами.
DSoftBus реализует унифицированные распределённые коммуникации между близкорасположенными устройствами и предоставляет API для открытия устройств, установки соединений, создания сетей и передачи данных независимо от типа связи. Он выделяется следующими возможностями:
Вы можете использовать предоставленные API DSoftBus для быстрой связи между устройствами без необходимости заботиться о деталях связи, что ускоряет развертывание и выполнение служб на разных платформах.
Рисунок 1 Акварель DSoftBus
Структура каталога DSoftBus следующая:```text //foundation/communication/dsoftbus ├── adapter # Adapter code ├── components # Dependent components ├── core # Core code │ ├── adapter # Adapter code │ ├── authentication # Authentication code │ ├── bus_center # Network code │ ├── common # Common code │ ├── connection # Device connection code │ ├── discovery # Discovery code │ ├── frame # Framework code │ └── transmission # Data transmission code ├── interfaces # External APIs ├── sdk # SDK │ ├── bus_center # Network │ ├── discovery # Discovery │ ├── frame # Framework │ └── transmission # Transmission ├── tests # Testing code └── tools # Tools
## Restrictions
- Connections can only be established between devices within the same local area network (LAN) or between nearby device ranges.
- Before establishing a connection between two devices, you must bind the devices. For more information, see [Security](https://gitee.com/openharmony/docs/blob/master/en/readme/Security.md).
- After completing data transmission, the service should close the session to free up resources.
## Usage
> **NOTE**
>
> Remote procedure calls (RPCs) between devices require permissions `ohos.permission.DISTRIBUTED_DATASYNC` and `ohos.permission.DISTRIBUTED_SOFTBUS_CENTER`.
```### Обнаружение устройств
- **Процесс публикации**
1. Вызовите **PublishLNN()**, чтобы опубликовать информацию об приложении через сеть.
```C
// Коллбэк для возврата результата публикации.
typedef struct {
/** Коллбэк для результата публикации */
void (*OnPublishResult)(int publishId, PublishResult reason);
} IPublishCb;
// Информация для публикации.
typedef struct {
int publishId; // ID публикации.
DiscoverMode mode; // Режим обнаружения.
ExchangeMedium medium; // Средство связи.
ExchangeFreq freq; // Частота использования.
const char *capability; // Возможности устройства для обнаружения.
unsigned char *capabilityData; // Дополнительные данные для публикации.
unsigned int dataLen; // Длина данных.
bool ranging; // Нужно ли использовать дальность.
} PublishInfo;
// Опубликовать информацию.
int32_t PublishLNN(const char *pkgName, const PublishInfo *info, const IPublishCb *cb);
```
2. Вызовите **StopPublishLNN**, чтобы прекратить публикацию информации, когда она больше не требуется.
```C
// Прекратить публикацию услуги.
int32_t StopPublishLNN(const char *pkgName, int32_t publishId);
```
- **Процесс обнаружения**
1. Вызовите **RefreshLNN()**, чтобы обнаружить устройства с указанными возможностями.```C
// Callbacks for device discovery.
typedef struct {
/** Callback to invoke when a device is discovered. */
void (*OnDeviceFound)(const DeviceInfo *device);
/** Callback for subscription result. */
void (*OnDiscoverResult)(int32_t refreshId, RefreshResult reason);
} IRefreshCallback;
// Start device discovery.
int32_t RefreshLNN(const char *pkgName, const SubscribeInfo *info, const IRefreshCallback *cb);
DSoftBus уведомляет службу о информации о устройстве через обратный вызов при обнаружении устройства.3. Вызовите StopRefreshLNN(), чтобы остановить поиск устройств.
```C
// Остановка поиска.
int32_t StopRefreshLNN(const char *pkg_name, int32_t refresh_id);
```
Инициирование запроса на подключение с адресом целевого устройства и обратным вызовом для возврата результата подключения.
// Адрес целевого устройства для подключения.
typedef struct {
ConnectionAddrType type;
union {
struct BrAddr {
char br_mac[BT_MAC_LEN];
} br;
struct BleAddr {
char ble_mac[BT_MAC_LEN];
uint8_t udid_hash[UDID_HASH_LEN];
} ble;
struct IpAddr {
char ip[IP_STR_MAX_LEN];
uint16_t port;
} ip;
} info;
char peer_uid[MAX_ACCOUNT_HASH_LEN];
} 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 *network_id, int32_t ret_code);
// Инициирование запроса на подключение.
int32_t JoinLNN(const char *pkg_name, ConnectionAddr *target, OnJoinLNNResult cb);
Ждите результата подключения. Если JoinLNN() вернул успех, DSoftBus принимает запрос на подключение и уведомляет службу о результате подключения через обратный вызов. Параметр addr в обратном вызове совпадает с параметром target в JoinLNN(). Если значение параметра retCode равно 0, подключение выполнено успешно. В этом случае значение параметра networkId является действительным и будет использоваться в API передачи данных и отключения. Если значение параметра retCode не равно 0, подключение не удалось, и значение параметра networkId недействительно.3. Передача данных с помощью связанных API.
Инициирование запроса на отключение с параметром networkId и обратным вызовом для возврата результата.
// Обратный вызов для возврата результата отключения.
typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode);
// Инициирование запроса на отключение.
int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb);
Подождите до полной отвязки.
Параметр networkId в методе OnLeaveLNNResult() совпадает с параметром networkId в методе LeaveLNN(). Если значение параметра retCode в обратном вызове равно 0, отвязка выполнена успешно; в противном случае отвязка завершается ошибкой. В случае успешной отвязки параметр networkId становится недействительным и больше не может использоваться.
// Информация о устройстве. typedef struct { char networkId[NETWORK_ID_BUF_LEN]; char deviceName[DEVICE_NAME_BUF_LEN]; uint16_t deviceTypeId; } NodeBasicInfo;
// Обратные вызовы событий состояния устройства. typedef struct { uint32_t events; // Маска сетевых событий. void (*onNodeOnline)(NodeBasicInfo *info); // Вызывается при переходе устройства в режим онлайн. void (*onNodeOffline)(NodeBasicInfo *info); // Вызывается при переходе устройства в режим офлайн. void (*onNodeBasicInfoChanged)(NodeBasicInfoType type, NodeBasicInfo *info); // Вызывается при изменении информации о устройстве. void (*onNodeStatusChanged)(NodeStatusType type, NodeStatus *status); // Вызывается при изменении текущего состояния работы устройства. } INodeStateCb;
// Регистрация обратного вызова для событий состояния устройства. int32_t RegNodeDeviceStateCb(const char *pkgName, INodeStateCb *callback);
// Отмена регистрации обратного вызова для событий состояния устройства. int32_t UnregNodeDeviceStateCb(INodeStateCb *callback);
1. Создайте экземпляр **Socket**.
```C
typedef struct {
char *name; // Локальное имя сокета.
char *peerName; // Имя соединяемого сокета.
char *peerNetworkId; // Network ID соединяемого устройства.
char *pkgName; // Имя пакета вызывающего модуля.
TransDataType dataType; // Тип передаваемых данных.
} SocketInfo;
// Создание сокета.
int32_t Socket(SocketInfo info);
```
2. Начните прослушивание сокета на сервере и привязывайте сокет на клиенте.
```C
// Callbacks для сокета.
typedef struct {
void (*OnBind)(int32_t socket, PeerSocketInfo info);
void (*OnShutdown)(int32_t socket, ShutdownReason reason);
void (*OnBytes)(int32_t socket, const void *data, uint32_t dataLen);
void (*OnMessage)(int32_t socket, const void *data, uint32_t dataLen);
void (*OnStream)(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param);
void (*OnFile)(int32_t socket, FileEvent *event);
void (*OnQos)(int32_t socket, QoSEvent eventId, const QosTV *qos, uint32_t qosCount);
void (*OnError)(int32_t socket, int32_t errCode);
void (*OnBytesSent)(int32_t socket, uint32_t dataSeq, int32_t errCode);
} ISocketListener;
```
```c
typedef enum {
QOS_TYPE_MIN_BW, // Минимальная пропускная способность.
QOS_TYPE_MAX_WAIT_TIMEOUT, // Время ожидания соединения.
QOS_TYPE_MIN_LATENCY, // Минимальная задержка соединения.
QOS_TYPE_RTT_LEVEL, // Уровень времени обратной передачи (RTT).
QOS_TYPE_MAX_BUFFER, // Максимальный буфер (зарезервировано).
QOS_TYPE_FIRST_PACKAGE, // Размер первого пакета (зарезервировано).
QOS_TYPE_MAX_IDLE_TIMEOUT, // Максимальное время бездействия.
QOS_TYPE_TRANS_RELIABILITY, // Надёжность передачи (зарезервировано).
QOS_TYPE_BUTT,
} QosType;
``` typedef struct {
QosType qos;
int32_t value;
} QosTV;
// Start listening on the server socket.
int32_t Listen(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener);
// Binding of the client socket.
int32_t Bind(int32_t socket, const QosTV qos[], uint32_t qosCount, const ISocketListener *listener);
```
4. Sending data to the receiving device via a socket.
```c
// Sending bytes.
int32_t SendBytes(int32_t socket, const void *data, uint32_t len);
// Asynchronous sending of bytes. The dataSeq specifies the unique sequence number for the packet being sent and cannot be zero.
int32_t SendBytesAsync(int32_t socket, uint32_t dataSeq, const void *data, uint32_t len);
// Sending messages.
int32_t SendMessage(int32_t socket, const void *data, uint32_t len);
// Sending streams.
int32_t SendStream(int32_t socket, const StreamData *data, const StreamData *ext, const StreamFrameInfo *param);
// Sending files.
int32_t SendFile(int32_t socket, const char *sFileList[], const char *dFileList[], uint32_t fileCnt);
```
4. Closing the socket.
```c
// Closing the socket.
void Shutdown(int32_t socket);
```
### Device Management
- Selection of the Wi-Fi keep-alive mode.
Invoke **ShiftLNNGear** on the DSoftBus client to launch the corresponding function **ShiftLNNGear** on the server through the IPC interface. The policy management module configures the **keepalive** property of the persistent TCP connection according to the specified policy.```c
typedef struct {
ModeCycle cycle; // Интервал проверки подключения.
ModeDuration duration; // Длительность режима работы.
bool wakeupFlag; // Признак того, что сигнал сердцебиения пробуждает устройство-получатель.
ModeAction action; // Действие, выполняемое во время процесса поддержания активности.
} GearMode;
typedef enum {
HIGH_FREQ_CYCLE = 30, // Интервал пульса сердца 30 секунд.
MID_FREQ_CYCLE = 60, // Интервал пульса сердца 60 секунд.
LOW_FREQ_CYCLE = 5 * 60, // Интервал пульса сердца 5 минут.
DEFAULT_FREQ_CYCLE = 10 * 60,// Интервал пульса сердца 10 минут.
} ModeCycle;
```// Адаптация параметров keepalive TCP постоянной соединения в зависимости от указанного режима работы.
int32_t ShiftLNNGear(const char *pkgName, const char *callerId, const char *targetNetworkId, const GearMode *mode);
Продолжительность TCP keepalive зависит от **ModeCycle**.
```C
HIGH_FREQ_CYCLE = 30, // Продолжительность TCP keepalive составляет до 40 секунд.
MID_FREQ_CYCLE = 60, // Продолжительность TCP keepalive составляет до 70 секунд.
LOW_FREQ_CYCLE = 5 * 60, // Продолжительность TCP keepalive составляет до 315 секунд.
DEFAULT_FREQ_CYCLE = 10 * 60, // Продолжительность TCP keepalive составляет до 615 секунд.
communication_dsoftbus
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )