npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

iot-gateway-batch-nodejs

v0.1.1

Published

NodeJS Batch Module for Azure IoT Gateway

Downloads

4

Readme

iot-gateway-batch-nodejs

NodeJS Batch Module for Azure IoT Gateway

Using this module, developers can build Azure IoT Gateway solutions that batch and shred messages destined for Azure IoT Hub. The batching module is deisgned to go either before or after the gateway's IdentityMap module as it batches by a messages macAddress or deviceId properties. Additionally, this same module can be imported and leveraged on the cloud side, through services such as Azure Functions, to provide cloud-side processing functionality. When using with the Gateway, batching and shredding modules come with the proper interface to read and re-publish messages to the gateway's message broker.

Installation

npm install iot-gateway-batch-nodejs --save

Usage

This module, coupled with a data compression module, can enhance IoT deployments in low/constrained bandwidth conditions or where connectivity can be intermittent. Though the IoT Device SDK and Gateway both support batching modes, this module enables user defined batching and shredding functionality.

Details

Messages are batched by either the macAddress message property when the module is placed before the IdentityMap module, or by the deviceId property when the module is placed after the IdentityMap module. This grouping is dynamically based on the properties of the messages passing through the module. All messages without a macAddress or deviceId property will simply pass through the module unchanged. The module will also publish all remaining queued messages, batched by the aforementioned properties, at module shutdown.

The following is the output of a batched message content section when converted from the origional Uint8Arry to a string (when deploying the batching module before the Identity Map module:

[
    {"properties":{"macAddress":"01:01:01"},"content":[116,104,105,115,32,105,115,32,115,111,109,101,32,99,111,110,116,101,110,116]},
    {"properties":{"macAddress":"01:01:01"},"content":[116,104,105,115,32,105,115,32,115,111,109,101,32,99,111,110,116,101,110,116]}
]

The value can be obtained by taking the batched content, converting it to a buffer and calling JSON.parse with a custom Uint8Array formatter:

    function UInt8ArrayFormatter(key, value) {
        if (value instanceof Uint8Array) {
            return Array.from(value);
        }
        return value;
    };
    var shreddedMessageArray = JSON.stringify(Buffer.from(batched_message.content).toString(), UInt8ArrayFormatter);

The only required confiugration element for the batcher, is the batchCount property. This property tells the module how many messages to batch at a time.

The batching module also provides two(2) optional property settings that can be activated via the module configuration for gateway installations or set directly via code for other installations (e.g. Azure Functions):

  • Excluded: The excluded property is an array for holding either macAddresses or deviceIds that the module will exclude from batching. This facilitates have select devices bypass this module.
  • PublishAsDevice: The publishAsDevice property allows batched messages to be published as an alternate device registered with IoT Hub. This feature is useful to indicate that the gateway was the source of the data rather than the field device.

Unlike the batching module, the shredding module will typically go before the IdentityMap module in a Cloud-to-Device workflow, as most cloud services will typically resolve only the cloud device identity, deviceId, for a given device.

*Note: schema for both of these settings can be found in the Configuration Schema section below.

Gateway

Batching

Add the following module to the modules section of your gateway JSON configuration file:

{
    "modules": [
        {
        "name": "batch",
            "loader": {
                "name": "node",
                "entrypoint": {
                    "main.path": ".\node_modules\iot-gateway-batch-nodejs\batch.js"
                }
            },
            "args": {
                "batchCount": 10,
                "excluded": ["01:01:01:01:01", "myDeviceId"],
                "publishAsDevice":{
                    "deviceId":"theGateway",
                    "deviceKey":"{gateway-device-key}"
                }
            }
        },
        ...

Then in the links section, patch the module into the message flow:

    ],
    "links": [
        {"source": "{reader_module}", "sink": "batch"},
        {"source": "batch", "sink": "{identity_map}"},
        ...
    ]
}

Shredding

Add the following module to the modules section of your gateway JSON configuration file:

{
    "modules": [
        {
        "name": "shred",
            "loader": {
                "name": "node",
                "entrypoint": {
                    "main.path": ".\node_modules\iot-gateway-batch-nodejs\shred.js"
                }
            },
            "args": {
            }
        },
        ...

Then in the links section, patch the module into the message flow:

    ],
    "links": [
        {"source": "{cloud2device_reader_module}", "sink": "shred"},
        {"source": "shred", "sink": "{identity_map}"},
        ...
    ]
}

Azure Function

Add the package to your function, instructions here then import the module

var batcher = require('batch');

and

var result = batcher.stashMessage(message, batchCount, excluded);
if(result){
    // do something with the batched message
} else {
    // null was returned from the batcher indicating the 
    // message was stashed in the device message array.
}

Configuration Schema

The module is configured via the args object with the following schema:

{
    "$schema": "http://json-schema.org/draft-04/schema#",
    "additionalProperties": false,
    "definitions": {},
    "id": "http://example.com/example.json",
    "properties": {
        "args": {
            "additionalProperties": false,
            "id": "/properties/args",
            "properties": {
                "batchCount": {
                    "id": "/properties/args/properties/batchCount",
                    "type": "integer"
                },
                "excluded": {
                    "additionalItems": true,
                    "id": "/properties/args/properties/excluded",
                    "items": {
                        "id": "/properties/args/properties/excluded/items",
                        "type": "string"
                    },
                    "type": "array",
                    "uniqueItems": false
                },
                "publishAsDevice": {
                    "additionalProperties": false,
                    "id": "/properties/args/properties/publishAsDevice",
                    "properties": {
                        "deviceId": {
                            "id": "/properties/args/properties/publishAsDevice/properties/deviceId",
                            "type": "string"
                        },
                        "deviceKey": {
                            "id": "/properties/args/properties/publishAsDevice/properties/deviceKey",
                            "type": "string"
                        }
                    },
                    "required": [
                        "deviceKey",
                        "deviceId"
                    ],
                    "type": "object"
                }
            },
            "required": [
                "batchCount"
            ],
            "type": "object"
        }
    },
    "required": [
        "args"
    ],
    "type": "object"
}

Tests

npm test

License

This project is licensed under the MIT License.

Contributing

When contributing to this repository, please create a GitHub issue to discuss the change you would like to make.

Please note we have a code of conduct, please follow it in all your interactions with the project.

Release History

  • 0.1.1 republish
  • 0.1.0 Initial release

Maintainers