Пользовательские каналы данных с голографическим удаленным взаимодействием и API Windows Mixed Reality

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

Важно!

Для пользовательских каналов данных требуется пользовательское удаленное приложение и пользовательское приложение проигрывателя, так как оно обеспечивает обмен данными между двумя пользовательскими приложениями.

Совет

Простой пример для пинг-понгов можно найти в примерах удаленного и проигрывателя в репозитории примеров голографического удаленного взаимодействия GitHub. Раскомментируйте #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE файлы SampleRemoteApp.h / SamplePlayerMain.h, чтобы включить пример кода.

Создание пользовательского канала данных

Для создания пользовательского канала данных требуются следующие поля:

std::recursive_mutex m_customDataChannelLock;
winrt::Microsoft::Holographic::AppRemoting::IDataChannel m_customDataChannel = nullptr;
winrt::Microsoft::Holographic::AppRemoting::IDataChannel::OnDataReceived_revoker m_customChannelDataReceivedEventRevoker;
winrt::Microsoft::Holographic::AppRemoting::IDataChannel::OnClosed_revoker m_customChannelClosedEventRevoker;

После успешной установки подключения можно создать новые каналы данных с удаленной стороны, со стороны игрока или с обеих сторон. RemoteContext и PlayerContext предоставляют CreateDataChannel() метод для создания каналов данных. Первый параметр — это идентификатор канала, который используется для идентификации канала данных в последующих операциях. Второй параметр — это приоритет, указывающий, с каким приоритетом данные этого канала передаются на другую сторону. На удаленной стороне допустимые идентификаторы каналов варьируются от 0 до 63. На стороне игрока допустимые идентификаторы каналов — от 64 до 127 включительно. Допустимые приоритеты: Low, Mediumили High.

Чтобы начать создание канала данных на удаленной стороне, выполните следующие действия.

// Valid channel ids for channels created on the remote side are 0 up to and including 63
m_remoteContext.CreateDataChannel(0, DataChannelPriority::Low);

Чтобы начать создание канала данных на стороне игрока , выполните следующие действия.

// Valid channel ids for channels created on the player side are 64 up to and including 127
m_playerContext.CreateDataChannel(64, DataChannelPriority::Low);

Примечание

Чтобы создать пользовательский канал данных, только одна сторона (удаленная или проигрыватель) должна вызвать CreateDataChannel метод .

Обработка событий пользовательского канала данных

Чтобы создать пользовательский канал данных, необходимо обработать событие (как на проигрывателе, OnDataChannelCreated так и на удаленной стороне). Он активируется при создании пользовательского канала данных с обеих сторон и предоставляет IDataChannel объект , который можно использовать для отправки и получения данных по этому каналу.

Чтобы зарегистрировать прослушиватель в событии, выполните следующие OnDataChannelCreated действия.

m_onDataChannelCreatedEventRevoker = m_remoteContext.OnDataChannelCreated(winrt::auto_revoke,
    [this](const IDataChannel& dataChannel, uint8_t channelId)
    {
        std::lock_guard lock(m_customDataChannelLock);
        m_customDataChannel = dataChannel;

        // Register to OnDataReceived and OnClosed event of the data channel here, see below...
    });

Чтобы получать уведомления о получении данных, зарегистрируйтесь в событии OnDataReceived объекта IDataChannel , предоставленного обработчиком OnDataChannelCreated . Зарегистрируйтесь в событии OnClosed , чтобы получать уведомления о закрытии канала данных.

m_customChannelDataReceivedEventRevoker = m_customDataChannel.OnDataReceived(winrt::auto_revoke, 
    [this]()
    {
        // React on data received via the custom data channel here.
    });

m_customChannelClosedEventRevoker = m_customDataChannel.OnClosed(winrt::auto_revoke,
    [this]()
    {
        // React on data channel closed here.

        std::lock_guard lock(m_customDataChannelLock);
        if (m_customDataChannel)
        {
            m_customDataChannel = nullptr;
        }
    });

Отправка данных

Для отправки данных по пользовательскому каналу IDataChannel::SendData() данных используйте метод . Первый параметр — это winrt::array_view<const uint8_t> для данных, которые должны быть отправлены. Второй параметр указывает, куда следует повторно отправить данные, пока другая сторона не подтвердит получение.

Важно!

В случае плохих сетевых условий один и тот же пакет данных может поступать несколько раз. Получая код должен иметь возможность обрабатывать эту ситуацию.

uint8_t data[] = {1};
m_customDataChannel.SendData(data, true);

Закрытие пользовательского канала данных

Чтобы закрыть пользовательский канал данных, используйте IDataChannel::Close() метод . Обе стороны получат уведомление о событии OnClosed после закрытия пользовательского канала данных.

m_customDataChannel.Close();

См. также: