Пользовательские каналы данных с голографическим удаленным взаимодействием и 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();
См. также:
- Обзор удаленного голографического взаимодействия
- Написание удаленного приложения голографического удаленного взаимодействия с помощью API Windows Mixed Reality
- Написание удаленного приложения голографического удаленного взаимодействия с помощью API OpenXR
- Создание пользовательского проигрывателя для голографического удаленного взаимодействия
- Устранение неполадок и ограничения голографического удаленного взаимодействия
- Условия лицензии на использование ПО для голографического удаленного взаимодействия
- Заявление о конфиденциальности Майкрософт