数据上传转发服务

2018-04-06 09:06:36

功能描述


此服务功能开通后,设备每次上传到轻松连大数据平台的空间数据(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: 状态信息
    • *因设备版本不同传感器field值可能会返回字符串型或数值型,请注意区分。


转发数据举例如下:
{
"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";//失败处理请求返回
}
}
}
}