达实AIoT
文档中心
快速开始
  • 单点登录对接
  • 开放接口对接
  • 领域模型事件对接
  • 私有部署
  • 应用开发指南
  • DASDesign
IoT平台
应用平台
  • 低代码工具
  • 基础服务
  • 系统运维
  • 场景模型
应用
  • 物业管理
  • 数据中心
  • 智慧园区IPS
  • 园区服务
  • 物业管理
  • 场景模型
  • 会议
  • 门禁
  • 停车场
文档中心
快速开始
  • 单点登录对接
  • 开放接口对接
  • 领域模型事件对接
  • 私有部署
  • 应用开发指南
  • DASDesign
IoT平台
应用平台
  • 低代码工具
  • 基础服务
  • 系统运维
  • 场景模型
应用
  • 物业管理
  • 数据中心
  • 智慧园区IPS
  • 园区服务
  • 物业管理
  • 场景模型
  • 会议
  • 门禁
  • 停车场
期待您的声音
  1. 新能源集控子系统
  • 轻应用
  • 图形引擎
  • 业务编排
  • 数据中台
    • 接口统一认证方式
    • 销售子系统
      • API-body中的columns参数结构
      • 销售子系统API文档
    • 生产调度子系统
      • 生产调度子系统API文档
      • API-body中的columns参数结构
    • 新能源集控子系统
      • 新能源集控子系统API文档
      • API-body中的columns参数结构
  1. 新能源集控子系统

新能源集控子系统API文档

数据中台-表数据导入接口 API 文档#

接口基本信息#

项目新能源集控子系统
接口名称表数据导入接口
请求地址http://10.30.102.50:31600/datafocus/api/v1.0/table/import
请求方法POST(HTTP REST形式)
接口描述向数据中台指定表导入业务数据
签名要求是(基于 HMAC-SHA256 算法)

对接参数及说明#

参数参数值说明
Tenant-Id10001租户Id
Secret-Iddbdd80636d0241d0b2cd14e55216d9e9应用Id
Secret-Keycfbf1ed8f0ea88b322e99d7c3be17189c8ee7d1bb01309f8cf50646eb2a230b2应用密钥
Urlhttp://10.30.102.50:31600/datafocus/api/v1.0/table/import请求地址(当前域名为测试环境,生产可能会变更)

请求参数#

请求头#

参数名必选类型描述示例值
Secret-Id是String接口鉴权密钥 ID(从系统管理 - 接口鉴权获取)dbdd80636d0241d0b2cd14e55216d9e9
Tenant-Id是String租户 ID(固定值)10001
Content-Type是String请求体格式application/json

URL 查询参数(Query Parameters)#

参数名必选类型描述生成规则
timestamp是String毫秒级时间戳(防二次请求)当前时间毫秒数(如 1723761234567)
nonce是String6位随机字符串(防重发)由 0-9、a-f 组成的 6 位字符串(如 686254)
sign是String签名串(防参数篡改)通过 HMAC-SHA256 算法生成(详见「签名规则」章节)

请求体(Body)#

请求体为 JSON 格式,包含目标表名、字段定义和数据行,示例如下:
{
	"tableName": "power_plant_info",
	"columns": [
		{
			"columnName": "point_name",
			"dataType": "string"
		},
		{
			"columnName": "id",
			"dataType": "string"
		},
		{
			"columnName": "power_name",
			"dataType": "string" 
		},
		{
			"columnName": "power_addr",
			"dataType": "string"
		},
		{
			"columnName": "commissioning_date",
			"dataType": "timestamp"
		},
		{
			"columnName": "sum_capacity",
			"dataType": "string"
		},
		{
			"columnName": "power_image_url",
			"dataType": "string"
		},
		{
			"columnName": "power_recommend",
			"dataType": "string"
		},
		{
			"columnName": "invoke_date",
			"dataType": "timestamp"
		},
		{
			"columnName": "space_area",
			"dataType": "string"
		},
		{
			"columnName": "architecture_area",
			"dataType": "string"
		},
		{
			"columnName": "staff_number",
			"dataType": "int"
		},
		{
			"columnName": "enterprise_culture",
			"dataType": "string"
		},
		{
			"columnName": "consumption_rate",
			"dataType": "string"
		},
		{
			"columnName": "electricity_cost",
			"dataType": "string"
		},
		{
			"columnName": "data_type",
			"dataType": "string"
		},
		{
			"columnName": "generate_type",
			"dataType": "string"
		},
		{
			"columnName": "year_electricity_target",
			"dataType": "string"
		},
		{
			"columnName": "create_date",
			"dataType": "timestamp"
		}
	],
	"rows": [
		[ "测点名", "0881id", "电厂名称", "厂区地址", "2025-08-19", "总装机容量", "厂区图片url", "厂站简介",
			"2024-09-11", "占地面积", "建筑面积", 12, "企业文化", "厂用电率", "供电度电成本", "数据类型", "生产类型", "年发电目标","2025-08-19"
		]
	]
}
参数说明
一级参数必选类型描述子参数说明
tableName是String目标表名-
columns是Array字段定义列表(顺序需与 rows 一致)columnName:字段名;dataType:字段类型
rows是Array数据行列表数组元素为数据值,顺序与 columns 定义的字段一一对应

java请求示例#

package com.example.demo.Util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.http.*;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Locale;
import java.util.Map;

public class TestDemo {

    private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256";
    private static final String HEADER_SECRET_ID = "Secret-Id";
    private static final String TENANT_ID = "Tenant-Id";

    private static String getHmac(String data, String key) {
        try {
            // 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
            SecretKeySpec signKey = new SecretKeySpec(HexUtil.decodeHex(key), HMAC_SHA256_ALGORITHM);
            //生成一个指定 Mac 算法 的 Mac 对象
            Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM);
            //用给定密钥初始化 Mac 对象
            mac.init(signKey);
            //完成 Mac 操作
            byte[] rawHmac = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
            return HexUtil.encodeHexStr(rawHmac);
        } catch (NoSuchAlgorithmException | InvalidKeyException e) {
            System.out.println("Can't get HMAC:" + e.getMessage());
            return null;
        }
    }

    public static String createParams(String secretId, String secretKey, String method, String uri, String body) {
        String nonce = RandomUtil.randomNumbers(6);
        long timestamp = DateUtil.current();

        // 构造加密输入的sign input string
        String signStr = method.toUpperCase(Locale.ROOT) + uri + body + nonce + secretId + timestamp;
        String sign = getHmac(signStr, secretKey);

        System.out.println("nonce:" + nonce);
        System.out.println("timestamp:" + timestamp);
        System.out.println("sign:" + sign);

        return String.format("nonce=%s&sign=%s&timestamp=%s", nonce,  sign, timestamp);
    }

    public static Map<String, String> createHeaders(String secretId) {
        Map<String, String> headers = CollUtil.newHashMap();
        headers.put(HEADER_SECRET_ID, secretId);
        headers.put(TENANT_ID, "10001");
        headers.put("Content-Type", "application/json");
        return headers;
    }

    public static String sendRequest(String url, String body, String secretId, String secretKey) {
        String method = "POST";
        String reqUrl = StrUtil.format("{}?{}", url,
                createParams(secretId, secretKey, method, URLUtil.toURI(url).getPath(), body));
        Map<String, String> headers = createHeaders(secretId);
        HttpRequest request = HttpUtil.createRequest(Method.POST, reqUrl);
        request.body(body);
        request.addHeaders(headers);
        String responseBody;
        try (HttpResponse response = request.timeout(10000).execute()) {

            responseBody = "";
            if (response.getStatus() == HttpStatus.HTTP_OK) {
                responseBody = response.body();
            }
        }

        return responseBody;

    }

    public static void main(String[] args) {
        // TODO: 这里的secretId和secretKey以及请求地址替换为实际环境上的相关内容
        String secretId = "********";
        String secretKey = "*******************************";

        String body = "{\"tableName\":\"power_plant_info\",\"columns\":[{\"columnName\":\"point_name\",\"dataType\":\"string\"},{\"columnName\":\"id\",\"dataType\":\"string\"},{\"columnName\":\"power_name\",\"dataType\":\"string\"},{\"columnName\":\"power_addr\",\"dataType\":\"string\"},{\"columnName\":\"commissioning_date\",\"dataType\":\"timestamp\"},{\"columnName\":\"sum_capacity\",\"dataType\":\"string\"},{\"columnName\":\"power_image_url\",\"dataType\":\"string\"},{\"columnName\":\"power_recommend\",\"dataType\":\"string\"},{\"columnName\":\"invoke_date\",\"dataType\":\"timestamp\"},{\"columnName\":\"space_area\",\"dataType\":\"string\"},{\"columnName\":\"architecture_area\",\"dataType\":\"string\"},{\"columnName\":\"staff_number\",\"dataType\":\"int\"},{\"columnName\":\"enterprise_culture\",\"dataType\":\"string\"},{\"columnName\":\"consumption_rate\",\"dataType\":\"string\"},{\"columnName\":\"electricity_cost\",\"dataType\":\"string\"},{\"columnName\":\"data_type\",\"dataType\":\"string\"},{\"columnName\":\"generate_type\",\"dataType\":\"string\"},{\"columnName\":\"year_electricity_target\",\"dataType\":\"string\"},{\"columnName\":\"create_date\",\"dataType\":\"timestamp\"}],\"rows\":[[\"测点名\",\"0881id\",\"电厂名称\",\"厂区地址\",\"2025-08-19\",\"总装机容量\",\"厂区图片url\",\"厂站简介\",\"2024-09-11\",\"占地面积\",\"建筑面积\",12,\"企业文化\",\"厂用电率\",\"供电度电成本\",\"数据类型\",\"生产类型\",\"年发电目标\",\"2025-08-19\"]]}";
        String res =sendRequest("http://10.30.102.50:31600/datafocus/api/v1.0/table/import", body, secretId, secretKey);
        System.out.println(res);


    }

}
📌
由于数据维度不统一,本接口对应着5张不同表结构的数据库表,因此在body中的columns参数的结构有5种,详细内容请参考:新能源集控子系统接口API-body中的columns参数结构

签名规则#

1. 签名原文拼接#

生成签名原文 plainText,格式为:
plainText = 大写请求方法 + 请求路径 + 请求体 + nonce + Secret-Id + timestamp
大写请求方法:POST(固定)
请求路径:/datafocus/api/v1.0/table/import(固定)
请求体:JSON 字符串(请求体 raw 内容)
nonce:URL 参数中的 nonce 值
Secret-Id:请求头中的 Secret-Id 值
timestamp:URL 参数中的 timestamp 值

2. 加密算法#

使用 HMAC-SHA256 算法对 plainText 进行加密,密钥为Secret-Key,加密结果转为 Hex 字符串(小写),即为 sign 值。

响应示例#

Content-Type: application/json;charset=UTF-8
Content-Length: 1000
{
    "errCode": 0,
    "exception": "",
    "promptMsg": {},
    "success": true,
    "data": {
    "tableName": "power_plant_info",
    "rowCount": 1
    }
}
参数说明:
参数类型说明
errCodeint状态码
exceptionstring错误信息
successbooleantrue表示导入成功
dataObject结果对象
tableNamestring数据导入的表名
rowCountint数据导入成功的行数

期待您的宝贵建议

微信扫描二维码,为我们的AIoT产品提出您的宝贵建议,用户体验是我们坚持不懈的追求。

微信扫描二维码
修改于 2025-08-19 08:12:27
上一页
API-body中的columns参数结构
下一页
API-body中的columns参数结构
Built with