1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/openharmony-communication_dsoftbus

Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

DSoftBus

Введение

Между устройствами существует множество способов связи (например, Wi-Fi и Bluetooth). Различия в использовании этих методов связи могут привести к проблемам с передачей данных. Кроме того, существуют многочисленные вызовы при объединении и совместной работе связей между устройствами и управлении конфликтами.

DSoftBus реализует унифицированные распределённые коммуникации между близкорасположенными устройствами и предоставляет API для открытия устройств, установки соединений, создания сетей и передачи данных независимо от типа связи. Он выделяется следующими возможностями:

  • Реализует открытие и установку соединений устройств в различных режимах связи, таких как WLAN и Bluetooth.
  • Выполняет унифицированное создание сетей устройств и управление топологией, а также предоставляет информацию об устройствах для передачи данных.
  • Устанавливает каналы для передачи сообщений, байтов, потоков и файлов.

Вы можете использовать предоставленные 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);
```

Сетевые соединения

  1. Инициирование запроса на подключение с адресом целевого устройства и обратным вызовом для возврата результата подключения.

    // Адрес целевого устройства для подключения.
    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);
  2. Ждите результата подключения. Если JoinLNN() вернул успех, DSoftBus принимает запрос на подключение и уведомляет службу о результате подключения через обратный вызов. Параметр addr в обратном вызове совпадает с параметром target в JoinLNN(). Если значение параметра retCode равно 0, подключение выполнено успешно. В этом случае значение параметра networkId является действительным и будет использоваться в API передачи данных и отключения. Если значение параметра retCode не равно 0, подключение не удалось, и значение параметра networkId недействительно.3. Передача данных с помощью связанных API.

  3. Инициирование запроса на отключение с параметром networkId и обратным вызовом для возврата результата.

    // Обратный вызов для возврата результата отключения.
    typedef void (*OnLeaveLNNResult)(const char *networkId, int32_t retCode);
    
    // Инициирование запроса на отключение.
    int32_t LeaveLNN(const char *pkgName, const char *networkId, OnLeaveLNNResult cb);
  4. Подождите до полной отвязки.

Параметр networkId в методе OnLeaveLNNResult() совпадает с параметром networkId в методе LeaveLNN(). Если значение параметра retCode в обратном вызове равно 0, отвязка выполнена успешно; в противном случае отвязка завершается ошибкой. В случае успешной отвязки параметр networkId становится недействительным и больше не может использоваться.

  1. Регистрировать и отменять регистрацию обратных вызовов для изменения состояния устройства.```C // События состояния устройства. #define EVENT_NODE_STATE_ONLINE 0x1 #define EVENT_NODE_STATE_OFFLINE 0x2 #define EVENT_NODE_STATE_INFO_CHANGED 0x4 #define EVENT_NODE_STATUS_CHANGED 0x8 #define EVENT_NODE_STATE_MASK 0xF

// Информация о устройстве. 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 секунд.

Вовлечённые репозитории

DSoftBus

communication_dsoftbus

communication_bluetooth

communication_ipc

communication_wifi

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/openharmony-communication_dsoftbus.git
git@api.gitlife.ru:oschina-mirror/openharmony-communication_dsoftbus.git
oschina-mirror
openharmony-communication_dsoftbus
openharmony-communication_dsoftbus
master