数据上传转发服务 四月 6, 2018

功能描述

此服务功能开通后,设备每次上传到轻松连大数据平台的空间数据(feeds)都将会完整的转发到指定第三方服务器端接口地址中。 可实现设备与第三方平台业务逻辑无缝连接。

开通方式

  • 登录轻松连大数据平台
  • 通过左侧菜单点击进入“数据工厂”->”数据转发服务”
  • 按照页面引导创建数据上传转发服务

第三方服务器端接口接收环境要求

  • 当有新的设备数据上传到轻松连大数据平台时,平台将该数据以JSON形式转发到指定的转发服务器URL。
  • 服务器接收到数据后解析并进行二次开发
  • JSON数据中包含channel_id可用于区分不同设备,同时在请求参数中也包含channel_id便于解析。

转发数据格式及结构

转发的数据是通过POST请求,以JSON数据作为Request Body, 并且Header中的Content-Type值为”application/json”

具体结构如下:

  • channel_id:  (String) 设备唯一的空间编号
  • product_id:  (String) 设备所属产品型号
  • serial: (String) 设备序列号
  • feeds: (Array) 数组
    • created_at: ISO 8601标准时间格式
    • field1..field10: 传感器数据
    • status: 状态信息

转发数据举例如下:

{
	"channel_id": "123456",
	"product_id": "ubibot-ws1p",
	"serial": "123456XXXXX",
	"feeds": [{
		"created_at": "2022-04-24T09:06:56Z",
		"field1": 24.495308
	}, {
		"created_at": "2022-04-24T09:06:56Z",
		"field2": 82
	}, {
		"created_at": "2022-04-24T09:07:00Z",
		"field5": -34
	}],
	"status": "mac=98:7b:f3:10:a1:e2,usb=1",
	"ssid_base64": "VFBHUw=="
}

 第三方服务器端接口接收返回规范

  • 请确保业务逻辑在15秒内完成,否则服务器将断开连接
  • 结果内容返回SUCCESS表示成功,ERROR表示失败
  • 返回的结果仅用于后台统计成功及失败次数

 第三方服务器端实例

PHP:

<?php

try{
    $data = file_get_contents('php://input'); //get POST payload, 获取post包文
    $json = json_decode($data, true); //parse input data into json, 解析json,并进行业务逻辑
    //-----------注意: 请确保业务逻辑在15秒之内完成,否则服务器端将做超时处理------------//
    $myfile = file_put_contents('log.txt', $data.PHP_EOL , FILE_APPEND | LOCK_EX);
    echo "SUCCESS"; //成功处理请求
}
catch (Exception $ex)
{
    echo "ERROR";//失败处理请求返回
}

NodeJS:

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, 获取post包文
            var jsonData = "";
            req.on("data", function(chunk) {
                jsonData += chunk;
            });
            req.on("end", function() {
                //parse input data into json, 解析json,并进行业务逻辑
                var reqObj = JSON.parse(jsonData);
                
                //-----------注意: 请确保业务逻辑在15秒之内完成,否则服务器端将做超时处理------------//
                var fs = require('fs');
                fs.writeFile("log.txt", JSON.stringify(reqObj), function(err) {
                    if(err) {
                        res.end('ERROR');//失败处理请求返回
                    }
                });
                res.end('SUCCESS');//成功处理请求
            });
        }catch{
            res.end('ERROR');//失败处理请求返回
        }
    }else{
        res.end('ERROR');//失败处理请求返回
    }
});
//设置监听端口
server.listen(8080, "127.0.0.1", function () {
    console.log("server is started listen port 8080");
});

Python:

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, 获取post包文, parse input data into json, 解析json,并进行业务逻辑
                length = int(self.headers['content-length'])
                jsonArray = json.loads(self.rfile.read(length))
                #-----------注意: 请确保业务逻辑在15秒之内完成,否则服务器端将做超时处理------------#
                myfile = open("log.txt",'a')
                myfile.write(json.dumps(jsonArray))
                myfile.write("\n")
                myfile.close()
                #成功处理请求
                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:
                #失败处理请求返回
                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:
            #失败处理请求返回
            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()

C# ASP.NET

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace demo1.Controllers
{
    public class FeedData
    {
        public DateTime created_at { get; set; }
        public object field1 { get; set; }
        public object field2 { get; set; }
        public object field3 { get; set; }
        public object field4 { get; set; }
        public object field5 { get; set; }
        public object field6 { get; set; }
        public object field7 { get; set; }
        public object field8 { get; set; }
        public object field9 { get; set; }
        public object field10 { get; set; }

    }
    public class DeviceData
    {
        public string channel_id { get; set; }
        public string status { get; set; }
        public List feeds { get; set; }

        public string ssid_base64 { get; set; }
    }

    [Route("api/[controller]")]
    [ApiController]
    public class RestApiController : ControllerBase
    {
        [HttpPost]
        [Route("recv")]
        public string ReceiveData([FromBody] DeviceData data)
        {
            try
            {
                //使用data进行业务处理
                return "SUCCESS";//成功处理请求
            }
            catch (Exception)
            {
                return "ERROR";//失败处理请求返回
            }
        }
    }
}