快速入门:存储来自第三方系统的数据


本任务旨在通过一个基于实际客户需求的场景帮助你了解如何开始使用设备集成服务。


第三方系统通过 HTTP 上传设备数据。设备数据上传到 EnOS 后,集成流会通过 HTTP Server 接收消息,然后将上传的消息映射到 EnOS 中定义的资产。最后,集成流会将消息转换为 EnOS 定义的标准 JSON 格式并保存消息数据。


../_images/integration_flow_scenario.png

关于本任务

本任务包括以下步骤。

  1. 创建模型
  2. 创建集成流
  3. 设计集成流
  4. 发布和启动集成流

开始前准备

确保你已请求了 设备集成资源

步骤 1:创建模型

此步骤默认在EnOS上没有可复用的设备模型。通过下表定义的功能创建一个名为 city_iems_cctv 的新模型。有关模型的更多信息,参见 创建模型

功能类型 名称 标识符 数据类型
属性 Device ID No. device_id_no string 1024
测点 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 Server 节点的更多信息,参见 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_asset_query.png


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

  6. 按照上图将所有节点连接在一起。

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

    ../_images/debug_switch.png


  8. 点击 保存

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

  1. 转到 流设计器 页面,然后针对已创建的集成流点击 发布

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

    ../_images/allocate_runtime_resource.png


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

    {
        "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"
            }
        }
    }
    

结果

点击 编辑,进入集成流画布页面。点击每个节点的 日志 标签(若适用),查看各自的输入和输出。

../_images/gettingstarted_logs.png