Более сложный вариант перенаправления сообщений в CosmosDB и, вероятно, более дорогой, чем рассмотренный ранее — использование Event Hub и маршрутизации сообщений.
- На Azure Portal в Create Resources -> Databases -> Azure Cosmos DB -> создаем базу данных и коллекцию «TermoSensorDBCollection».
- Создаем Event Hub. На Azure Portal: Create a resource -> Internet of Things -> Event Hub.
- Задаем имя ServiceBus (Name). В моем случае [schneidereq]. Имя общее для всех, так что его нужно выбирать уникальным.
- Pricing Tier — Basic или Standard на выбор.
- Resource group — в моем случае [SchneiderEq].
- Location — West Europe (сервера поближек России).
- Переходим в созданный Event Hubs Namespace -> Event Hub -> +Event Hub -> Задаем имя (Name). В моем случае [termosensoreventhub].
- Создаем Stream Analitycs Job. На Azure Portal: Create a resource -> Stream Analitycs Job.
- В созданном Stream Analytics Job заходим в Inputs -> Add stream input:
- Input alias — TermoSensorInput.
- Service Bus Namespace — созданный namespace. В моем случае [schneidereq].
- Event Hub name -> Use existing -> В моем случае [termosensoreventhub]
- Сохраняем — Save.
- В Stream Analytics Job заходим в Outputs -> Add:
- Output alias -> TermoSensorOutput.
- Select Cosmos DB from your subscriptions.
- Database -> Use existing.
- Collection name pattern — вводим созданную ранее (в моем случае [TermoSensorDBCollection]).
- Сохраняем — Save.
- В Stream Analytics Job заходим в Query и задаем простой запрос:
SELECT * INTO TermoSensorOutput FROM TermoSensorInput
- Переходим в All resources -> созданный IoT Hub -> раздел Messaging -> Message routing -> Add:
- В Endpoint нажимаем Add -> Event hubs, чтобы добавить custom endpoint.
- Задаем Endpoint name. В моем случае [TermoSensorEndpoint].
- Выбираем созданный Event Hub.
- Сохраняем.
- В routing query вводим правило аналогичное условию WHERE в предыдущей статье:
$connectionDeviceId = 'TermoSensorWithABB'
- Сохраняем.
- Запускаем созданный Stream Analytics Job.
- Стартуем передачу данных с термодатчика.
- Заходим в созданный Event Hub, чтобы убедится, что данные поступают.
- Переходим в CosmosDB. Там в выбранной коллекции также появляются данные.
- Далее CosmosDB подключается к PowerBI. На эту тему есть достаточно подробная статья, поэтому нет смысла рассматривать этот момент отдельно.
Эксперимент
Если включить Stream Analytics Job фильтрующий сообщения от «TermoSensorWithABB» в предыдущем уроке, то видно, что сообщения до него не доходят.
У маршрута есть параметр Enable/Disable. Посмотрим, как изменится передача сообщений, если отключить маршрут. Azure Portal -> Выбираем ваш IoT Hub -> Раздел «Messaging» -> Message route -> Кликаем на вашем маршруте -> Enable route -> Disable -> И сохраняем «Save».
Видно, что сообщения от термодатчика перестали поступать на Stream Analytics Job. Логично, что раз маршрут, который перехватывал все обращения удовлетворяющие критерию:
$connectionDeviceId = 'TermoSensorWithABB'
отключился, то при работающем Stream Analytics Job у которого идет фильтрация по такому-же критерию в WHERE данные должны начать поступать.
Так и есть. После отключения маршрута сообщения начинают поступать на Stream Analytics Job у которого в QUERY прописан запрос:
SELECT * INTO TermoSensorStreamAnalyticsOutput FROM TermoSensorStreamAnalyticsInput WHERE TermoSensorStreamAnalyticsInput.IoTHub.ConnectionDeviceId = 'TermoSensorWithABB'
Всё работает. 🙂