Star

ThingsBoard Documentation

Documentation for using ThingsBoard IoT Platform.

TCP Integration


ThingsBoard PE Feature


Only ThingsBoard Professional Edition supports Platform Integrations feature.

See ThingsBoard PE Installation Options to install ThingsBoard PE.

Overview

TCP Integration allows to stream data from devices which use a TCP transport protocol to ThingsBoard and converts payloads of these devices into the ThingsBoard format.

Please note TCP Integration can be started only as Remote Integration. It could be started on the same machine, where TB instance is running, or you can start in on another machine, that has access over the network to the TB instance.

Please review the integration diagram to learn more.

image

TCP Integration Configuration

Prerequisites

In this tutorial, we will use:

Let’s assume that we have a sensor which is sending current temperature and humidity readings. Our sensor device SN-001 publishes it’s temperature and humidity readings to TCP Integration on 10560 port to the machine where TCP Integration is running.

For demo purposes we assume that our device is smart enough to send data in 3 different payload types:

[
  {
    "deviceName": "SN-001",
    "deviceType": "default",
    "temperature": 25.7,
    "humidity": 69
  }
]

You can select payload type based on your device capabilities and business cases.

Please note that on the machine, where TCP Integration is running, port 10560 must be opened for incoming connections - nc utility must be able to connect to TCP socket. In case you are running it locally, it should be fine without any additional changes.

Before setting up an TCP integration, you need to create an Uplink Converter that is a script for parsing and transforming the data received by TCP integration.

To create an Uplink Converter go to Data Converters section and Click Add new data converter —> Create new converter. Name it “TCP Uplink Converter” and select type Uplink. Use debug mode for now.

NOTE Although the Debug mode is very useful for development and troubleshooting, leaving it enabled in production mode may tremendously increase the disk space, used by the database, because all the debugging data is stored there. It is highly recommended to turn the Debug mode off when done debugging.

Choose device payload type to for decoder configuration

Now copy & paste the following script to the Decoder function section:

/** Decoder **/

// decode payload to string
var strArray = decodeToString(payload);
var payloadArray = strArray.replace(/\"/g, "").replace(/\s/g, "").split(',');

var telemetryKey = payloadArray[2];
var telemetryValue = payloadArray[3]; 

var telemetryPayload = {};
telemetryPayload[telemetryKey] = telemetryValue;

// Result object with device attributes/telemetry data
var result = {
    deviceName: payloadArray[0],
    deviceType: payloadArray[1],
    telemetry: telemetryPayload,
    attributes: {}
  };

/** Helper functions **/

function decodeToString(payload) {
   return String.fromCharCode.apply(String, payload);
}

return result;

The purpose of the decoder function is to parse the incoming data and metadata to a format that ThingsBoard can consume. deviceName and deviceType are required, while attributes and telemetry are optional. attributes and telemetry are flat key-value objects. Nested objects are not supported.

Now copy & paste the following script to the Decoder function section:

/** Decoder **/

// decode payload to JSON
var data = decodeToJson(payload);

// Result object with device/asset attributes/telemetry data

var deviceName = data.deviceName;
var deviceType = data.deviceType;
var result = {
   deviceName: deviceName,
   deviceType: deviceType,
   attributes: {},
   telemetry: {
       temperature: data.temperature,
       humidity: data.humidity
   }
};

/** Helper functions **/

function decodeToString(payload) {
   return String.fromCharCode.apply(String, payload);
}

function decodeToJson(payload) {
   // covert payload to string.
   var str = decodeToString(payload);

   // parse string to JSON
   var data = JSON.parse(str);
   return data;
}

return result;

The purpose of the decoder function is to parse the incoming data and metadata to a format that ThingsBoard can consume. deviceName and deviceType are required, while attributes and telemetry are optional. attributes and telemetry are flat key-value objects. Nested objects are not supported.

Now copy & paste the following script to the Decoder function section:

/** Decoder **/

// decode payload to string
var payloadStr = decodeToString(payload);

// decode payload to JSON
// var data = decodeToJson(payload);

var deviceName = payloadStr.substring(0,6);
var deviceType = payloadStr.substring(6,13);

// Result object with device/asset attributes/telemetry data
var result = {
   deviceName: deviceName,
   deviceType: deviceType,
   attributes: {},
   telemetry: {
       temperature: parseFloat(payloadStr.substring(13,17))
   }
};

/** Helper functions **/

function decodeToString(payload) {
   return String.fromCharCode.apply(String, payload);
}

function decodeToJson(payload) {
   // covert payload to string.
   var str = decodeToString(payload);

   // parse string to JSON
   var data = JSON.parse(str);
   return data;
}

return result;

The purpose of the decoder function is to parse the incoming data and metadata to a format that ThingsBoard can consume. deviceName and deviceType are required, while attributes and telemetry are optional. attributes and telemetry are flat key-value objects. Nested objects are not supported.

Currently TCP integration does not support Downlink functionality

TCP Integration Setup

Go to Integrations section and click Add new integration button. Name it TCP Integration, select type TCP, turn the Debug mode on and from drop-down menus add recently created Uplink converter.

As you mentioned Execute remotely is checked and can not be modified - TCP Integration can be only remote type.

Please note down Integration key and Integration secret - we will use these values later in the configuration on the remote TCP Integration itself.

image

By default TCP Integration will use 10560 port, but you can change this to any available port in your case.

We leave other options by default, but there is brief description of them:

Choose device payload type for Handler Configuration

Please select Handler Type as TEXT

In our example we are going to split incoming text payload SN-001,default,temperature,25.7\n\rSN-001,default,humidity,69 into two different messages

  • SN-001,default,temperature,25.7
  • SN-001,default,humidity,69

Newline delimiter (\n\r) will be used to split payload into multiple messages.

image

To parse payload properly, please make sure that next values are set:

  • Max Frame Length - the maximum length of the decoded frame. An exception will be thrown if the length of the frame exceeds this value; Leave it by default for this demo - 128;
  • Strip Delimiter - whether the decoded frame should strip out the delimiter or not. Please check it to drop newline delimiter from the payload;
  • Message Separator - specify it to System Line Separator - in this case newline symbol will be used as delimiter;

Please select Handler Type as JSON

image

Please select Handler Type as BINARY

In our example we are going to parse incoming binary payload \x30\x30\x30\x30\x11\x53\x4e\x2d\x30\x30\x31\x64\x65\x66\x61\x75\x6c\x74\x32\x35\x2e\x37\x00\x00\x00 (in HEX).

According to our payload design:

  • 0-3 bytes - \x30\x30\x30\x30 - dummy bytes to show how you can skip particular prefix bytes in your payload. These bytes are included for sample purposes;
  • 4 byte - \x11 - payload length. If we convert it to decimal - 17. So our payload in this case is limited to 17 bytes from the incoming TCP frame;
  • 5-10 bytes - \x53\x4e\x2d\x30\x30\x31 - device name. If we convert it to text - SN-001;
  • 11-17 bytes - \x64\x65\x66\x61\x75\x6c\x74 - device type. If we convert it to text - default;
  • 18-21 bytes - \x32\x35\x2e\x37 - temperature telemetry. If we convert it to text - 25.7;
  • 22-24 bytes - \x00\x00\x00 - dummy bytes. We are going to ignore them, because payload size is 17 bytes - from 5 till 21 byte. These bytes are included for sample purposes;

we need to properly configure handler configuration to get from the incoming payload required data: \x53\x4e\x2d\x30\x30\x31\x64\x65\x66\x61\x75\x6c\x74\x32\x35\x2e\x37 which equals to SN-001default25.7 in text representation.

image

To parse payload properly, please make sure that next values are set:

  • Max Frame Length - the maximum length of the decoded frame. An exception will be thrown if the length of the frame exceeds this value; Leave it by default for this demo - 128;
  • Length Field Offset - the offset of the length field. In our case length field is 5th byte in the payload \x30\x30\x30\x30 \x11 \x53…. So set it to 4;
  • Length Field Length - the length of the length field. In our case length of the length field is 1 byte …\x30 \x11 \x53…. So set it to 1;
  • Length Adjustment (the compensation value to add to the value of the length field) - the compensation value to add to the value of the length field. In our case we don’t need this compensation, as length field contains correct value - 17 bytes. So leave it 0;
  • Number of first bytes to strip out from the decoded frame - the number of first bytes to strip out from the decoded frame. We need to skip first 5 bytes from the decoded payload, to get our data - \x30\x30\x30\x30\x11 \x53\x4e\x2d\x30…. So set it to 5;

Click Add to save the Integration.

Installing and running external TCP Integration

Please refer to the Remote Integration guide and install TCP Integration service locally or on separate machine.

Please use Integration key and Integration secret from the above section for your TCP Integration configuration.

Once ThingsBoard TCP Integration has been created, the TCP server starts, and then it waits for data from the devices.

Choose device payload type to send uplink message

Once you go to Device Groups -> All you should find a SN-001 device provisioned by the Integration. Click on the device, go to Latest Telemetry tab to see “temperature” key and its value (25.7) there.

If your payload contains humidity telemetry, you should see “humidity” key and its value (69) there as well.

Next steps