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


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

关于本任务


集成第三方系统传入的设备测点数据是使用设备数据集成服务的主要场景之一。第三方系统通过 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,查看流的运行日志。
  • 选择每个节点,进入节点配置页面。选择 日志 标签(若适用),查看节点日志。