Channel Data Forwarding November 26, 2018

Overview

The Channel Data Forwarding service will forward a copy of the original feed data from any UbiBot device to the given URL endpoint. This can be useful to seamlessly connect UbiBot devices to third-party platform business logic or third-party applications. This service requires activation on the UbiBot platform along with some development work on the data endpoint to correctly handle the incoming data feeds.

Activation Method

  • Please login to https://console.ubibot.com 
  • From left side menu, click “Data Factory”->”Data Forwarding”.
  • Follow the “Add new forwarding” instructions.

Data Forwarding Message Format

Data forwarding is achieved by sending POST requests to the given endpoint URL. The Content-Type header is set to “application/json”. The original feed data is contained in the request body as follows:

  • The feed data will be forwarded in JSON format to the given URL
  • The unique device channel_id: (string) can be used to distinguish the data from different devices.
  • The feeds are an array consisting of:
    • created_at:  the time when the data feed was sampled in ISO 8901 format.
    • field1..field10: sensor readings
    • status:  status information, such as SSID and ICCID

Note that you will need to send a response to the UbiBot platform within 15 seconds for each message

Example Forwarded Data:

{“result”:”success”,”server_time”:”2017-09-04T06:53:34Z”,”timezone”:null,”channel”:{"channel_id":"735","feeds":[{"created_at":"2018-01-05T05:51:52Z","field3":2293.119873},{"created_at":"2018-01-05T05:51:52Z","field1":18.118561},{"created_at":"2018-01-05T05:51:52Z","field2":20},{"created_at":"2018-01-05T05:56:52Z","field3":2180.479980},{"created_at":"2018-01-05T05:56:52Z","field1":18.382927},{"created_at":"2018-01-05T05:56:52Z","field2":20},{"created_at":"2018-01-05T06:01:52Z","field3":2117.760010},{"created_at":"2018-01-05T06:01:52Z","field1":18.738079},{"created_at":"2018-01-05T06:01:52Z","field2":20},{"created_at":"2018-01-05T06:02:09Z","field5":-62}]}

 Requirements for Endpoint Response

  • Please ensure the endpoint’s response is made within 15 seconds, otherwise the platform will close the connection.
  • If the endpoint sends a response with the string “SUCCESS”, the platform will mark this forward request as successful. If the endpoint sends the string “ERROR” it means the request was unsuccessful. The UbiBot platform keeps track of all the response results for statistics purposes.

Simple PHP endpoint example:

<?php

try{
    $data = file_get_contents('php://input'); //get POST payload forwarded from the UbiBot platform
    $json = json_decode($data, true); //parse input data into json. You can handle the $json object from here. 
    //------Please make sure the response is made within 15 seconds, otherwise connection will be disconnected and marked unsuccessful.----------//
    $myfile = file_put_contents('log.txt', $data.PHP_EOL , FILE_APPEND | LOCK_EX);  //Write to a local log file for the demo. 
    echo "SUCCESS"; // if the request has been handled successfully. 
}
catch (Exception $ex)
{
    echo "ERROR";// if there is some error encountered 
}

Simple NodeJS endpoint example:

const http = require('http');
const server = http.createServer(function (req, res) {
    let type = req.headers["content-type"];
    if (req.method.toLowerCase() === 'post' && type === "application/json") {
        try{
            ////get POST payload
            var jsonData = "";
            req.on("data", function(chunk) {
                jsonData += chunk;
            });
            req.on("end", function() {
                //parse input data into json
                var reqObj = JSON.parse(jsonData);
                
                //-----------Make sure response is sent within 15 seconds------------//
                var fs = require('fs');
                fs.writeFile("log.txt", JSON.stringify(reqObj), function(err) {
                    if(err) {
                        res.end('ERROR');//mark request as error
                    }
                });
                res.end('SUCCESS');//mark request as successful
            });
        }catch{
            res.end('ERROR');//mark request as error
        }
    }else{
        res.end('ERROR');//mark request as error
    }
});
//Setup listening IP and port
server.listen(8080, "127.0.0.1", function () {
    console.log("server is started listen port 8080");
});

Simple Python endpoint example:

from http.server import BaseHTTPRequestHandler, HTTPServer
import cgi
import json

class testHTTPServer_RequestHandler(BaseHTTPRequestHandler):
    def do_POST(self):
        try:
            ctype, pdict = cgi.parse_header(self.headers.get('content-type'))
            if ctype == 'application/json':
                #get POST payload, parse input data into json
                length = int(self.headers['content-length'])
                jsonArray = json.loads(self.rfile.read(length))
                #-----------Make sure response is made within 15 seconds------------#
                myfile = open("log.txt",'a')
                myfile.write(json.dumps(jsonArray))
                myfile.write("\n")
                myfile.close()
                #request handled successfully
                self.protocal_version = 'HTTP/1.1'
                self.send_response(200)
                self.send_header("Welcome", "Contect")
                self.end_headers()
                self.wfile.write(bytes("SUCCESS", "utf-8"))
                return
            else:
                #request handled with error
                self.protocal_version = 'HTTP/1.1'  
                self.send_response(300)
                self.send_header("Welcome", "Contect")
                self.end_headers()
                self.wfile.write(bytes("ERROR", "utf-8"))
                return
        except:
            #request handled with error
            self.protocal_version = 'HTTP/1.1'
            self.send_response(300)
            self.send_header("Welcome", "Contect")
            self.end_headers()
            self.wfile.write(bytes("ERROR", "utf-8"))
            return

def run():
    port = 8080
    print('starting server, port', port)
    # Server settings
    server_address = ('', port)
    httpd = HTTPServer(server_address, testHTTPServer_RequestHandler)
    print('running server...')
    httpd.serve_forever()

if __name__ == '__main__':
    run()