Azure functions 使用Azure函数处理来自IoT Hub的传入JSON消息

Azure functions 使用Azure函数处理来自IoT Hub的传入JSON消息,azure-functions,azure-cosmosdb,azure-iot-hub,Azure Functions,Azure Cosmosdb,Azure Iot Hub,我通过物联网中心接收来自物联网设备的消息,并将其存储在Cosmos数据库中。流分析工作正常,但我想使用Azure函数 在将传入的消息存储到Cosmos DB之前,我想稍微处理一下。原始消息如下所示: { "id": "12345", "time": "2019-12-05T07:21:37.000+0000", "sensors": [ { "type": "TEMPERATURE", "value": 23

我通过物联网中心接收来自物联网设备的消息,并将其存储在Cosmos数据库中。流分析工作正常,但我想使用Azure函数

在将传入的消息存储到Cosmos DB之前,我想稍微处理一下。原始消息如下所示:

{
    "id": "12345",
    "time": "2019-12-05T07:21:37.000+0000",
    "sensors": [
        {
            "type": "TEMPERATURE",
            "value": 23.30286376953125,
            "unit": "C"
        },
        {
            "type": "HUMIDITY",
            "value": 29.686492919921875,
            "unit": "RH"
        },
        {
            "type": "CELL_ID",
            "value": 56789,
            "unit": ""
        },
        {
            "type": "RSSI_LEVEL",
            "value": -86,
            "unit": "dBm"
        }
    ]
}
{
    id: "2019-12-05T07:21:37.000+0000",
    {
        "deviceId": "12345",
        "time": "2019-12-05T07:21:37.000+0000",
        "type": "TEMPERATURE",
        "value": "23.30286376953125",
        "unit": "C"
    },
    {
        "deviceId": "12345",
        "time": "2019-12-05T07:21:37.000+0000",
        "type": "HUMIDITY",
        "value": "29.686492919921875",
        "unit": "RH"
    },
    ...
}
我想在宇宙中储存的东西应该是这样的:

{
    "id": "12345",
    "time": "2019-12-05T07:21:37.000+0000",
    "sensors": [
        {
            "type": "TEMPERATURE",
            "value": 23.30286376953125,
            "unit": "C"
        },
        {
            "type": "HUMIDITY",
            "value": 29.686492919921875,
            "unit": "RH"
        },
        {
            "type": "CELL_ID",
            "value": 56789,
            "unit": ""
        },
        {
            "type": "RSSI_LEVEL",
            "value": -86,
            "unit": "dBm"
        }
    ]
}
{
    id: "2019-12-05T07:21:37.000+0000",
    {
        "deviceId": "12345",
        "time": "2019-12-05T07:21:37.000+0000",
        "type": "TEMPERATURE",
        "value": "23.30286376953125",
        "unit": "C"
    },
    {
        "deviceId": "12345",
        "time": "2019-12-05T07:21:37.000+0000",
        "type": "HUMIDITY",
        "value": "29.686492919921875",
        "unit": "RH"
    },
    ...
}
我之所以将
id
设置为等于
time
,是因为我还没有弄清楚如何从Azure Stream Analytics复制
文档id
功能。我试图确保写入Cosmos的操作不会覆盖现有文件

目前,我的JavaScript代码看起来是这样的(我不懂JavaScript,我只是在改编我在互联网上找到的代码):

调试上述代码需要很长时间,因为我无法控制物联网设备的采样率。我想知道是否有人可以帮助我获得上面的代码块以产生所需的结果

{
    id: "2019-12-05T07:21:37.000+0000",
    {
        "deviceId": "12345",
        "time": "2019-12-05T07:21:37.000+0000",
        "type": "TEMPERATURE",
        "value": "23.30286376953125",
        "unit": "C"
    },
    {
        "deviceId": "12345",
        "time": "2019-12-05T07:21:37.000+0000",
        "type": "HUMIDITY",
        "value": "29.686492919921875",
        "unit": "RH"
    },
    ...
}
不是有效的JSON,您缺少设备信息的属性名称。这可以更改为:

{
    id: "2019-12-05T07:21:37.000+0000",
    "deviceInformation": [
    {
        "deviceId": "12345",
        "time": "2019-12-05T07:21:37.000+0000",
        "type": "TEMPERATURE",
        "value": "23.30286376953125",
        "unit": "C"
    },
    {
        "deviceId": "12345",
        "time": "2019-12-05T07:21:37.000+0000",
        "type": "HUMIDITY",
        "value": "29.686492919921875",
        "unit": "RH"
    },
    ...
    ]
}
至于代码,如果您创建一个对象而不是串接字符串,可能会更容易,例如:

module.exports = function (context, IoTHubMessages) {
    context.log(`JavaScript eventhub trigger function called for message array: ${IoTHubMessages}`);

    var payload = [];
    IoTHubMessages.forEach(message => {
        context.log(`Processed message: ${message}`);

        var messageToStore  = { id: message.time, deviceInformation: [] };
        message.sensors.forEach(observation => {
            if (observation.type != "CELL_ID" && observation.type != "RSSI_LEVEL") {
                messageToStore.deviceInformation.push({
                    "deviceId": message.id,
                    "time": message.time,
                    "type": observation.type,
                    "value": observation.value,
                    "unit": observation.unit
                });
            };
        });

        payload.push(messageToStore);
    });

    context.bindings.outputDocument = payload;
    context.done();
};