Мультиплексирование трансляции протокола Azure IoT через пограничный шлюз

#azure-iot-hub #azure-iot-edge

#azure-iot-hub #azure-iot-edge

Вопрос:

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

Я реализовал шлюз трансляции, который мультиплексирует соединения и функционирует аналогично этой реализации, которая использует политику доступа «подключение устройства» для отправки сообщений в облачный IoT-концентратор от имени любого устройства через одно AMQP-соединение. В качестве примера сообщения отправляются по следующей ссылке '/devices/' deviceIdentifier '/messages/events';

Это полностью функционально для соединения, сформированного device -> my middleware -> Cloud IoT Hub , и для обратного направления. Я хотел бы реализовать то же самое с введением прозрачного шлюза, то есть device -> my middleware -> Edge IoT Hub -> Cloud IoT Hub

Моя проблема возникает из-за того, что пограничный концентратор, по-видимому, не принимает ключ политики доступа «подключение устройства».

В качестве аутентификации я создаю, SharedAccessSignature как видно из примера репозитория и ниже, однако, насколько я могу судить, в отличие от SharedAccessKeyAuthenticationProvider.fromConnectionString , нет способа указать gatewayHostName.

 this.sas = SharedAccessSignature.create(
    encodeURIComponent(this.endpoint), this.keyName, this.key,
    Math.ceil((Date.now() / 1000)   this.KEY_TIMEOUT)
);
  

Короче говоря, я пытаюсь заставить мое промежуточное программное обеспечение «олицетворять» любое из устройств на концентраторе через одно TLS-соединение, используя ключ политики доступа «подключение устройства», через прозрачный пограничный шлюз IoT, однако я не вижу места для указания gatewayHostName параметра в SharedAccessSignature или найти способ найти и настроить политики общего доступа на уровне IoT hub на пограничном концентраторе IoT.

Комментарии:

1. Когда клиент видит HostName={a};GatewayHostName={b} в строке подключения, он знает, что нужно установить TCP-соединение с {b} вместо {a}. Но он также должен добавлять {a} к имени пользователя при установлении соединения, чтобы пограничный концентратор знал, к какому концентратору интернета вещей подключиться. Когда клиент устанавливает соединение с пограничным концентратором с помощью токена уровня концентратора, имя пользователя должно быть {policy}@sas.root.{a} . Можете ли вы попробовать это?

2. Кроме того, я считаю, что переменная среды AuthenticationMode=Cloud должна быть установлена в пограничном концентраторе, иначе пограничный концентратор попытается аутентифицировать устройство, чего он не знает, как сделать для ключа политики «подключение устройства». Установка этой переменной делает пограничный концентратор пассивным; он будет передавать запрос аутентификации в IoT Hub. Недостатком является то, что это отключает автономные возможности, поэтому обычно это не рекомендуется.

3. Здравствуйте, прежде всего, спасибо за помощь, мне удалось заставить его выполнить шаги connect и initializeCBS после настройки TransportConfig для включения сертификата SSL CA, я упоминаю об этом только потому, что это может помочь кому-то другому.

4. Больше связано с этим вопросом при размещении токена аудитории, который я получаю Matching template not found for audience amqps://${string} , для любой из следующих трех строк: "iothubdemo91.azure-devices.net" , "iothubdemo91" и "edgeDevice1" . Далее идет мой SAS и моя аудитория. let sas = SharedAccessSignature.create( encodeURIComponent(${any_of_strings_above}), keyName,key,Math.ceil((Date.now() / 1000) 3600) ); let audience = keyName "@sas.root.iothubdemo91.azure-devices.net" // this.endpoint let token = sas.toString(); amqp.putToken(audience, token);

5. @DamonBarry Не могли бы вы взглянуть на мой последний комментарий? Я могу делать все, что связано с подключением, но я не знаю правильного токена аудитории, это не iothubowner@sas.root . iothubdemo91.azure-devices.net , который работает только для Azure Cloud IoT Hub.