#json #azure #time-series #azure-iot-hub
#json #azure #временные ряды #azure-iot-hub
Вопрос:
Название звучит довольно исчерпывающе, но мой базовый вопрос, я думаю, довольно прост.
Контекст
В Azure у меня есть IoT hub, на который я отправляю сообщения. Я использую модифицированную версию одного из примеров из Azure Iot SDK для python.
Отправка работает нормально. Однако вместо строки я отправляю структуру JSON.
Когда я наблюдаю за событиями, поступающими в IoT hub, используя облачную оболочку, это выглядит так:
PS /home/marcel> az iot hub monitor-events --hub-name weathertestiothub
This extension 'azure-cli-iot-ext' is deprecated and scheduled for removal. Please remove and add 'azure-iot' instead.
Starting event monitor, use ctrl-c to stop...
{
"event": {
"origin": "raspberrypi-zero-wh",
"payload": "{ "timestamp": "1608643863720", "locationDescription": "Attic", "temperature": "21.941", "relhumidity": "71.602" }"
}
}
Проблема
Данные кажутся нормальными, за исключением того, что полезная нагрузка выглядит здесь странно. НО полезная нагрузка — это буквально то, что я отправляю с устройства, используя образец SDK.
Это правильный способ сделать это? В конце концов, мне очень сложно получить данные в модель анализа временных рядов. Так что, я думаю, виновата моя структура.
Вопрос
Какую структуру данных JSON рекомендуется отправлять в IoT hub для последующего использования?
Ответ №1:
Вы должны добавить следующие 2 строки в свое сообщение в образце python SDK:
msg.content_encoding = "utf-8"
msg.content_type = "application/json"
Это должно решить вашу проблему с форматированием.
Мы также обновили наши образцы, чтобы отразить это: https://github.com/Azure/azure-iot-sdk-python/blob/master/azure-iot-device/samples/sync-samples/send_message.py
Комментарии:
1. Привет и добро пожаловать в Stackoverflow. Этот сайт работает немного иначе, чем обычный форум, и уделяет гораздо больше внимания предоставлению прямых ответов на вопросы. Я немного отформатировал ваш пост в этом направлении. Также очень приветствуется раскрытие информации, поэтому, если вы работаете в вовлеченной компании, в данном случае в Microsoft.
2. Добавление кодировки и типа — хороший совет, хотя и не решающий. Смотрите мой собственный ответ ниже.
Ответ №2:
В итоге я использовал подсказку @elhorton, но это не было ключевым изменением. Тем не менее, форматирование в Azure Shell Monitor теперь выглядит намного лучше:
"event": {
"origin": "raspberrypi-zero-wh",
"payload": {
"temperature": 21.543947753906245,
"humidity": 69.22964477539062,
"locationDescription": "Attic"
}
}
Ключ был:
- включите время источника сообщения в формате ISO
from datetime import datetime
timestampIso = datetime.now().isoformat()
message.custom_properties["iothub-creation-time-utc"] = timestampIso
- Используя
locationDescription
какTime Series ID Property
см. https://docs.microsoft.com/en-us/azure/time-series-insights/how-to-select-tsid (Возможно, я мог бы также взятьiothub-connection-device-id
, но я не проверял это специально)
Ответ №3:
Я предполагаю, что использование « iothub-connection-device-id
» сделает « raspberrypi-zero-wh
» в качестве имени экземпляра временного ряда. Я согласен с вашим выбором использования « locationDescription
» в качестве TSID; таким образом, Attic становится именем экземпляра временного ряда, температура и влажность будут вашими переменными.
Комментарии:
1. Да, на данный момент я думаю, что вы абсолютно правы. В первый раз я использовал
deviceId
только буквальное значение, потому что не понимал значения exaxt. К сожалению, необработанные сообщения не отображаются в облачной оболочке, как я описал в своем вопросе. Это может быть препятствием для понимания механики в фоновом режиме.