Обратите внимание, что функция Azure IoT Hub Device Streams все еще находится в предварительной версии publi c (более одного года). Вы используете SDK 1.29.0-preview-004 на стороне устройства и 1.27.0-preview-004 на стороне службы и образец DeviceStreamingSample из azure -iot-samples-csharp-master package.
Потоки устройства используют для процесса установления связи между службой и устройством ту же концепцию связи, что и для вызова метода устройства. Эту фазу квитирования можно легко протестировать с помощью запроса REST POST.
В демонстрационных целях я буду использовать свой IoT Hub Tester , в котором реализована функция Device Streams, подробнее см. раздел Приложение А2.
Шаг 1. Запустите программу DeviceClientStreamingSample для вашего устройства. Вы должны использовать Transport.Amqp . Обратите внимание, что остальные не прошли мой тест.
Шаг 2. Используйте клиентский инструмент REST для создания запроса POST. Следующий URL-адрес предназначен для моего теста:
https://xxxxxxxxxxx.azure-devices.net/twins/device1/streams/teststream?api-version=2018-08-30-preview
заголовки:
accept: application/json
iothub-streaming-response-timeout-in-seconds: 15
iothub-streaming-connect-timeout-in-seconds: 5
Authorization: sas-token
полезная нагрузка: любая или пустая
Следующий фрагмент экрана демонстрируется при отправке POST на устройство1:
, а в следующем фрагменте кода показана остановка программы в точке останова после метода WaitForDeviceStreamRequestAsyn c:
Полное рукопожатие и потоковая передача между устройством и службой (в данном случае моим тестером) показаны в следующем фрагменте экрана:
Как я уже упоминал, Azure IoT Hub Tester реализовал функцию потоков устройств, следующий фрагмент экрана показывает буфер потока:
Обратите внимание, что запуск смоделированного устройства для TransportType.Mqtt не работает, симптом такой же, как у вас, тайм-аут. Похоже (на основе ответа REST POST) есть ошибка при подписке устройства на топи c, например $ iothub / streams / POST / #
Однако, когда ваше устройство использует прямой протокол MQTT для IoT Hub, все работает нормально, см. фрагмент экрана моего тестера, где device1 подключено к IoT Hub:
Когда на экране отображается Azure IoT Hub Tester, вы можете использовать его для тестирования сервисного SDK для потоковой передачи, например, следующую строку из образца SDK:
DeviceStreamResponse result = await _serviceClient.CreateStreamAsync(_deviceId, deviceStreamRequest).ConfigureAwait(false);
и тестер покажет устройство1 потоковую передачу:
В заключение, на основании проведенного выше тестирования вы должны иметь успешную потоковую передачу с SDK, когда моделируемое устройство настроено для протокола TransportType.Amqp .
ОБНОВЛЕНИЕ:
В случае использования клиентского инструмента REST вы можете увидеть ответ от устройства квитирования в заголовках:
* 10 89 *
Этот ответ генерируется следующей строкой:
await _deviceClient.AcceptDeviceStreamRequestAsync(streamRequest, cancellationTokenSource.Token).ConfigureAwait(false);
На основе заголовков ответа, таких как
iothub-streaming-is-accepted
iothub-streaming-url
iothub-streaming-auth-token
может быть установлена потоковая связь через webSocket между устройством и сервисом через IoT Hub. Обратите внимание, что после этого смоделированное устройство выйдет из строя в случае использования клиентского инструмента REST.