Можно ли отправить большие данные JSON в IoT Hub? - PullRequest
0 голосов
/ 26 октября 2018

Я задаю этот вопрос от имени разработчика оборудования (у меня нет особых знаний в области устройств).

В настоящий момент IoT-концентратор получает данные от устройства каждые 2 минуты, по некоторым причинам, планируя хранить данные локально на устройстве и отправлять их каждые 30 минут. Но проблема в том, что данные не сохраняются в хранилище. Данные за 2 минуты сохраняются в хранилище. Но данные 30 минут не должным образом сохраняются в хранилище. Сохраняется только первый объект в массиве.

Я использую Stream Analytics для обработки данных из центра IoT и их хранения в табличном хранилище.

Текущее сообщение Json data (каждые 2 минуты):

{
    "deviceid": "testdevice12",
    "BatteryVoltage": "31.31",
    "PanelVoltage": "0.00",
    "PanelCurrent": "0.00",
    "OutputVoltage": "31.29",
    "OutputCurrent": "4.94",
    "RSSI": "13",
    "FreeHeapSize": "86.884",
    "timestamp": 1540470493
}

В течение 30 минут это будет выглядеть следующим образом:

[{
    "deviceid": "testdevice12",
    "BatteryVoltage": "31.31",
    "PanelVoltage": "0.00",
    "PanelCurrent": "0.00",
    "OutputVoltage": "31.29",
    "OutputCurrent": "4.94",
    "RSSI": "13",
    "FreeHeapSize": "86.884",
    "timestamp": 1540470493
}, {
    "deviceid": "testdevice12",
    "BatteryVoltage": "31.29",
    "PanelVoltage": "0.00",
    "PanelCurrent": "0.00",
    "OutputVoltage": "31.28",
    "OutputCurrent": "4.93",
    "RSSI": "0",
    "FreeHeapSize": "86.884",
    "timestamp": 1540470558
}, {
    "deviceid": "testdevice12",
    "BatteryVoltage": "31.30",
    "PanelVoltage": "0.00",
    "PanelCurrent": "0.00",
    "OutputVoltage": "31.29",
    "OutputCurrent": "4.94",
    "RSSI": "5",
    "FreeHeapSize": "86.884",
    "timestamp": 1540470621
}, {
    "deviceid": "testdevice12",
    "BatteryVoltage": "31.31",
    "PanelVoltage": "0.00",
    "PanelCurrent": "0.00",
    "OutputVoltage": "31.30",
    "OutputCurrent": "4.94",
    "RSSI": "5",
    "FreeHeapSize": "86.884",
    "timestamp": 1540470684
}, {
    "deviceid": "testdevice12",
    "BatteryVoltage": "31.30",
    "PanelVoltage": "0.00",
    "PanelCurrent": "0.00",
    "OutputVoltage": "31.28",
    "OutputCurrent": "4.94",
    "RSSI": "7",
    "FreeHeapSize": "86.884",
    "timestamp": 1540470760
}]

Вот запрос ASA, который я использую:

WITH [StreamData] AS ( SELECT * FROM [IoTHubStream] WHERE [ObjectType] IS NULL -- Filter out device info and command responses ) 
SELECT IoTHub.ConnectionDeviceId AS DeviceId, PanelVoltage, PanelCurrent, BatteryVoltage, BatteryCurrent, OutputVoltage, OutputCurrent, Temperature, Humidity, EventProcessedUtcTime, PartitionId, EventEnqueuedUtcTime, * INTO [DeviceDataHistory] FROM [StreamData]

1 Ответ

0 голосов
/ 26 октября 2018

Поняли -Наконца. Есть несколько моментов: 1. Полезная нагрузка JSON с кэшированной структурой данных должна выглядеть следующим образом:

{
 "topic": "cachedData",
  "deviceId": "testdevice12",
  "data":
[{
"BatteryVoltage": "31.31",
"PanelVoltage": "0.00",
"PanelCurrent": "0.00",
"OutputVoltage": "31.29",
"OutputCurrent": "4.94",
"RSSI": "13",
"FreeHeapSize": "86.884",
"timestamp": 1540470493
}, {
"BatteryVoltage": "31.29",
"PanelVoltage": "0.00",
"PanelCurrent": "0.00",
"OutputVoltage": "31.28",
"OutputCurrent": "4.93",
"RSSI": "0",
"FreeHeapSize": "86.884",
"timestamp": 1540470558
}, {
"BatteryVoltage": "31.30",
"PanelVoltage": "0.00",
"PanelCurrent": "0.00",
"OutputVoltage": "31.29",
"OutputCurrent": "4.94",
"RSSI": "5",
"FreeHeapSize": "86.884",
"timestamp": 1540470621
}, {
"BatteryVoltage": "31.31",
"PanelVoltage": "0.00",
"PanelCurrent": "0.00",
"OutputVoltage": "31.30",
"OutputCurrent": "4.94",
"RSSI": "5",
"FreeHeapSize": "86.884",
"timestamp": 1540470684
}, {
"BatteryVoltage": "31.30",
"PanelVoltage": "0.00",
"PanelCurrent": "0.00",
"OutputVoltage": "31.28",
"OutputCurrent": "4.94",
"RSSI": "7",
"FreeHeapSize": "86.884",
"timestamp": 1540470760
}]
}
  1. Azure Stream Analytics должна выглядеть следующим образом:

     SELECT   
      iothubAlias.deviceId,
      arrayElement.ArrayValue.BatteryVoltage,
      arrayElement.ArrayValue.PanelVoltage,
      arrayElement.ArrayValue.PanelCurrent,
      arrayElement.ArrayValue.OutputVoltage,
      arrayElement.ArrayValue.OutputCurrent,
      arrayElement.ArrayValue.RSSI,
      arrayElement.ArrayValue.FreeHeapSize,
      arrayElement.ArrayValue.timestamp
    INTO [DeviceDataHistory]
    FROM [IoTHubStream] as iothubAlias  
    CROSS APPLY GetArrayElements(iothubAlias.data) AS arrayElement
    

Чтобы извлечь несколько строк из ввода, вы должны использовать «GetArrayElements» - вы можете прочитать больше здесь:

https://docs.microsoft.com/en-us/azure/stream-analytics/stream-analytics-parsing-json

https://msdn.microsoft.com/en-US/azure/stream-analytics/reference/getarrayelements-azure-stream-analytics

  1. Не забудьте установить PartitionKey и RowKey для таблицы Azure, заданной в качестве выходных данных для Azure Stream Analytics:

enter image description here

И конечный результат выглядит так:

enter image description here

Попробуйте и дайте мне знать, если это помогло.

...