快速入门:集成来自第三方系统的数据


本文帮助你了解如何开始使用设备数据集成服务。

关于本任务


集成第三方系统传入的设备测点数据是使用设备数据集成服务的主要场景之一。第三方系统通过 HTTP 客户端上传设备测点数据。设备测点数据上传到 EnOS 后,集成流建立一个 HTTP 服务器接收测点数据,然后将测点数据映射到 EnOS 中定义的设备模型测点。最后,集成流将测点数据转换为 EnOS 定义的标准 JSON 格式,并上传到 EnOS,实现设备测点数据集成和映射。


../_images/integration_flow_scenario.png


本任务包括以下步骤:

  1. 创建模型

  2. 创建集成流

  3. 设计集成流

  4. 发布和启动集成流

前提条件


  • 确保你已经请求了 数据集成资源

  • 确保你拥有发送 HTTP 协议的工具,如 POSTMAN 或 cURL 等。本文将会采用 POSTMAN。

步骤 1:创建模型


此步骤默认在 EnOS 上没有可复用的设备模型。首先需要在 EnOS 上创建一个名为 city_iems_cctv 的新模型,并按照下表为该模型新增功能。有关模型的更多信息,参见 创建模型


功能类型

名称

标识符

数据类型

属性

Device ID No.

device_id_no

string

city_iems_cctv

测点

Event Name

alarm_data_event_name

string

1024

测点

People Count

raw_data_count

string

1024

测点

People Count Percentage

raw_data_count_percentage

string

1024

测点

Image Path

raw_data_imgpath

string

1024

测点

Object Type

raw_data_objtype

string

1024

测点

Raw Image Path wo OBB

raw_data_patch

string

1024

测点

People Association

raw_data_pplassoc

string

1024

测点

Raw Image Path wo BB

raw_data_rawimgpath

string

1024

测点

Bounding Box

raw_data_rect

string

1024

测点

Event Start Time

raw_data_start_time

string

1024

测点

Time Stamp

raw_data_timestamp

string

1024

测点

Time Stamp Unix

raw_data_timestamp_unix

string

1024

测点

Track ID

raw_data_track_id

string

1024

测点

Video Path

raw_data_videopath

string

1024

测点

Camera ID

raw_stream_camera

string

1024

测点

Region of Interests

raw_stream_roi

string

1024

测点

Streaming ID

raw_stream_streamingID

string

1024

测点

Zone

raw_stream_zone

string

1024

步骤 2:创建集成流


  1. 登录 EnOS 管理控制台,选择左侧导航菜单中的 设备数据集成 > 流设计器

  2. 选择 新建云端集成流,选择 从空白新建集成流。输入流 名称描述,然后选择 确定

步骤 3:设计集成流


你将进入带有空白画布的 流设计器 页面。节点列表将会显示在左侧。


按照以下顺序拖拽节点到画布中,设计集成流。

../_images/gettingstarted_http_flow.png


  1. HTTP Server 节点添加到 流设计器 画布,创建一个 HTTP 服务器。鉴权方式 选择 匿名URL 由系统自动分配,用于本地 HTTP 客户端连接到服务器。更多信息,参见 HTTP Server

  2. Script 节点添加到画布,并将其命名为 Auth。转到 Script 标签页,将默认代码内容删掉后,输入以下代码。

    var timestamp = metadata.get("Timestamp");
    print("header timestamp :" + timestamp);
    var auth = metadata.get("Authorization");
    print("header auth :" + auth);
    
    var body = JSON.stringify(msg);
    var appId = "maimnwk3";
    var secretKey = "X56ZXY";
    
    var rawData = appId + body + timestamp;
    print("rawData :" + rawData);
    var result = tools.HMACSHA256Util.encrypt(rawData, secretKey);
    
    print("result :" + result);
    if (result === auth) {
        return tools.resultBuilder.build(true, JSON.stringify(msg));
    } else {
        return tools.resultBuilder.build(false);
    }
    return tools.resultBuilder.build(true, JSON.stringify(msg));
    


    有关 Script 节点的更多信息,参见 Script


  3. 将另一个 Script 节点添加到画布,并将其命名为 Parse Data。转到 Script 标签页,将默认代码内容删掉后,输入以下代码。

    if (!msg.Data) {
        return tools.resultBuilder.build(false);
    }
    var dataArray = msg.Data.data;
    var stream = msg.Data.stream;
    var device_id = stream.camera;
    var flag = true;
    
    for (var i = 0; i < dataArray.length; i++) {
        var data = dataArray[i];
        if (!data.eventName) {
            flag = false;
            break;
        }
    
        var paramsArray = new Array();
        if (data.eventName === "Abandon") {
            var mps = {};
            mps["raw_data_count"] = JSON.stringify(data.count);
            mps["alarm_data_event_name"] = data.eventName;
            mps["raw_data_imgpath"] = JSON.stringify(data.imgpath);
            mps["raw_data_objtype"] = data.objType;
            mps["raw_data_pplassoc"] = data.peopleassociation;
            mps["raw_data_rawimgpath"] = JSON.stringify(data.rawimgpath);
            mps["raw_data_rect"] = JSON.stringify(data.rect);
            mps["raw_data_start_time"] = data.startTime;
            mps["raw_data_track_id"] = data.trackId;
            mps["raw_data_timestamp"] = data.timestamp;
            mps["raw_data_timestamp_unix"] = data.tsUnix;
            mps["raw_data_videopath"] = JSON.stringify(data.videopath);
            mps["raw_data_patch"] = JSON.stringify(data.patch);
            mps["raw_stream_camera"] = stream.camera;
            mps["raw_stream_roi"] = stream.roi;
            mps["raw_stream_streamingID"] = stream.streamingID;
            mps["raw_stream_zone"] = stream.zone;
    
            var timestamp = data.timestamp;
            var params = {};
            params["measurepoints"] = mps;
            params["time"] = new Date().getTime();
            params["device_id_no"] = device_id;
            paramsArray.push(params);
        } else if (data.eventName == "CrowdAlert") {
            var mps = {};
            mps["raw_data_count_number"] = data.count.number;
            mps["raw_data_count_percentage"] = data.count.percentage;
            mps["alarm_data_event_name"] = data.eventName;
            mps["raw_data_imgpath"] = JSON.stringify(data.imgpath);
            mps["raw_data_objtype"] = data.objType;
            mps["raw_data_pplassoc"] = data.peopleassociation;
            mps["raw_data_rawimgpath"] = JSON.stringify(data.rawimgpath);
            mps["raw_data_rect"] = JSON.stringify(data.rect);
            mps["raw_data_start_time"] = data.startTime;
            mps["raw_data_track_id"] = data.trackId;
            mps["raw_data_timestamp"] = data.timestamp;
            mps["raw_data_timestamp_unix"] = data.tsUnix;
            mps["raw_data_videopath"] = JSON.stringify(data.videopath);
            mps["raw_stream_camera"] = stream.camera;
            mps["raw_stream_roi"] = stream.roi;
            mps["raw_stream_streamingID"] = stream.streamingID;
            mps["raw_stream_zone"] = stream.zone;
    
            var timestamp = data.timestamp;
            var params = {};
            params["measurepoints"] = mps;
            params["time"] = new Date().getTime();
            params["device_id_no"] = device_id;
            paramsArray.push(params);
        } else {
    
        }
    }
    
    if (!flag) {
        return tools.resultBuilder.build(false);
    }
    
    return tools.resultBuilder.build(true, JSON.stringify(paramsArray));
    


  4. Lookup Asset 节点添加到画布,并按照以下说明配置节点。有关 Lookup Asset 节点的更多信息,参见 Lookup Asset


    ../_images/gettingstarted_lookup_asset.png


  5. Upload Measurement Point 节点添加到画布。有关 Upload Measurement Point 节点的更多信息,参见 Upload Measurement Point

  6. 将所有节点按上述顺序连接在一起。

  7. 打开右上角的 Debug 开关,以记录集成流中节点的日志。


    ../_images/debug_switch.png


  8. 选择 保存 btn_save,保存集成流。

步骤 4:发布和启动集成流


  1. 选择 发布 btn_publish,发布集成流。

  2. 分配集成流所需的运行时资源,然后选择 确定


    ../_images/allocate_runtime_resource.png


  3. 在本地计算机上,使用 POSTMAN 将请求发送到 HTTP Server 节点的 URL,并包含以下消息作为有效负载。

    {
        "Data":{
            "data":[
                {
                    "eventName":"Abandon",
                    "count":1,
                    "imgpath":10,
                    "objType":"test",
                    "peopleassociation":"xxx",
                    "rawimgpath":10,
                    "rect":10,
                    "startTime":"2020-09-15 10:00:00",
                    "txUnix":"xx",
                    "vediopath":"xxx",
                    "patch":"xxx",
                    "camera":"xxx",
                    "rox":"xxx",
                    "streamID":"",
                    "zone":"xxx"
                }
            ],
            "stream":{
                "device_id":"xxxxxId"
            }
        }
    }
    

结果


设备数据集成 > 流设计器,选择流对应的 编辑,进入集成流画布页面,可查看流运行日志和节点日志。

  • 选择设计画布上方的 日志 btn_log,查看流的运行日志。

  • 选择每个节点,进入节点配置页面。选择 日志 标签(若适用),查看节点日志。