BV相机产品Profile介绍

本文介绍标准品类中BV相机的产品Profile。BV相机来源于看门狗服务系统,是适配于看门狗的品类。该产品主要涉及视频监控、媒体流处理及分析服务。

基本信息

  • 产品品类 : BV相机

属性

属性定义了产品或设备的特性。每个属性包括名称、标识符、数据类型、读写权限、是否必须以及添加时间等信息。读写权限:0(只读),1(读写)。是否必须:0(可选),2(必须)。

属性名称 标识符 数据类型 读写权限 是否必须 描述/数据定义
设备编号 deviceGuid text(字符串) 1 2 数据长度:128
测试图片掩膜 TestImageMask ImageMask(图片掩膜) 0 2 (空)
吸引力得分 score int32(整数型) 0 2 (空)
媒体源编号 mediaSourceGuid text(字符串) 0 0 数据长度:128
出厂编号 factoryGuid text(字符串) 0 0 数据长度:128
dash流媒体访问地址 dashMediaUrl text(字符串) 0 0 数据长度:255
hls流媒体访问地址 hlsMediaUrl text(字符串) 0 0 数据长度:255
rtmp流媒体访问地址 rtmpMediaUrl text(字符串) 0 0 数据长度:255
rtsp流媒体访问地址 rtspMediaUrl text(字符串) 0 0 数据长度:255
媒体流访问token mediaToken text(字符串) 0 0 数据长度:255
客户端token clientToken text(字符串) 0 0 数据长度:255
当前设备视频片段 deviceVideoUrl text(字符串) 0 0 数据长度:255; 视频片段,默认3s
设备名称 deviceName text(字符串) 1 2 数据长度:128
设备类型 deviceType enum(枚举型) 1 2 枚举值: 0=全景, 1=枪机, 2=球机, 3=鱼眼
扩展数据 extendData text(字符串) 1 2 数据长度:128
当前设备截图地址 deviceImage text(字符串) 1 0 数据长度:255; 示例: http://192.168.100.37:44040/image/20241018/d46815304.jpg
服务请求编号 requestId text(字符串) 1 0 数据长度:255

事件

事件定义了通知或回调机制。事件类型:0(信息),1(告警)。QoS:0(最多一次)。持久化存储:0(无),1(有)。是否必须:2(必须)。

设备信息更新

  • 标识符 : deviceInfo
  • 类型 : 0
  • 是否必须 : 2
  • 持久化存储 : 1
  • QoS : 0
  • 输出数据 :
    • deviceImage: text(字符串), 长度=255 - 设备截图
    • requestId: text(字符串), 长度=255 - 请求ID

车辆识别计数

  • 标识符 : vehicle_count
  • 类型 : 1
  • 是否必须 : 2
  • 持久化存储 : 0
  • QoS : 0
  • 描述 : 用于服务调用后回调
  • 输出数据 :
    • objectNumber: int32(整数型), min=1, max=111 - 目标数量
    • objectBoundingBox: text(字符串), 长度=255 - 目标边界框
    • boundingBoxImage: text(字符串), 长度=512 - 边界框图片
    • boundingBoxImageUrl: text(字符串), 长度=128 - 边界框图片URL
    • analysisTime: text(字符串), 长度=128 - 分析时间

行人识别计数

  • 标识符 : crowd_count
  • 类型 : 1
  • 是否必须 : 2
  • 持久化存储 : 0
  • QoS : 0
  • 描述 : 用于服务调用后回调
  • 输出数据 :
    • objectNumber: int32(整数型), min=1, max=111 - 目标数量
    • objectBoundingBox: text(字符串), 长度=255 - 目标边界框
    • boundingBoxImage: text(字符串), 长度=512 - 边界框图片
    • boundingBoxImageUrl: text(字符串), 长度=128 - 边界框图片URL
    • analysisTime: text(字符串), 长度=128 - 分析时间
    • heatMapImageUrl: text(字符串), 长度=128 - 热力图URL
    • heatMapImage: text(字符串), 长度=512 - 热力图

服务

服务定义了可调用的操作,包括输入/输出数据、结果返回方式等配置。结果返回方式:0(无),2(HTTP),3(Redis),4(属性),5(事件)。调用方式:0(同步),1(异步)。部分服务会关联事件用于回调。

异步视频服务_代理

  • 标识符 : captureServerVideoProxy
  • 描述 : (空)
  • 结果返回方式 : 4
  • 调用方式 : 1
  • 接口 URL : /api/accessGateway/captureServerVideo
  • 输入数据 :
    • cameraFactoryGuid: text(字符串), 长度=128 - 设备出厂编号
    • mediaSourceGuid: text(字符串), 长度=128 - 媒体源编号
    • mediaDeviceGuid: text(字符串), 长度=128 - 设备编号
    • beginTimestamp: text(字符串), 长度=128 - UTC 开始时间(毫秒值), -1=取实时码流(受任务队列影响),历史抓取只支持当前时间5分钟之前的历史数据
    • expiredTimestamp: text(字符串), 长度=128 - 过期时间,-1=不超时,可以使用相对时间,+10s表示10s后, -10s表示10秒前,+500ms表示500毫秒后,-500ms表示500毫秒前
    • captureRetryLimit: int32(整数型) - 捕获重试限制,不设置则按照服务器默认配置(默认为3)
    • callBackRetryLimit: int32(整数型) - 回调重试限制,不设置则按照服务器默认配置(默认为3)
    • format: text(字符串), 长度=128 - 格式,不设置则按照服务器默认配置(默认mp4)
    • requestUrl: text(字符串), 长度=255 - 抓图服务请求地址(仅支持 Thrift HTTP 协议)
  • 输出数据 :
    • file: text(字符串), 长度=128 - 文件(base64)
    • suffix: text(字符串), 长度=128 - 后缀, jpg、png、MP4、avi等
    • result: int32(整数型) - 结果, 0:成功 1:失败

异步抓图服务_代理

  • 标识符 : captureServerImageProxy
  • 描述 : (空)
  • 结果返回方式 : 4
  • 调用方式 : 1
  • 接口 URL : /api/accessGateway/captureServerImage
  • 输入数据 : (与异步视频服务_代理类似,缺少 duration)
  • 输出数据 : (同上)

异步视频服务

  • 标识符 : captureServerVideo
  • 描述 : (空)
  • 结果返回方式 : 4
  • 调用方式 : 1
  • 接口 URL : (空)
  • 输入数据 : (与代理服务类似,新增 duration: int32(整数型) - 持续时间)
  • 输出数据 : (同上)

异步抓图服务

  • 标识符 : captureServerImage
  • 描述 : (空)
  • 结果返回方式 : 4
  • 调用方式 : 1
  • 接口 URL : (空)
  • 输入数据 : (与视频服务类似,缺少 duration)
  • 输出数据 : (同上)

请求截图

  • 标识符 : captureImage
  • 描述 : 测试属性回调
  • 结果返回方式 : 4
  • 调用方式 : 0
  • 输入数据 :
    • deviceGuid: text(字符串), 长度=32 - 视频设备GUID
    • streamHint: int32(整数型) - 码流类型
    • replayTime: struct(结构体) - 回放起止时间(开始时间、结束时间,单位:ms)
    • playType: int32(整数型) - 播放类型
  • 输出数据 :
    • deviceImage: text(字符串), 长度=2048 - 图片链接

获取视频片段

  • 标识符 : getVideoFragment
  • 结果返回方式 : 4
  • 调用方式 : 0
  • 输入数据 :
    • rtspMediaUrl: text(字符串), 长度=255 - RTSP流媒体访问地址
    • duration: int32(整数型) - 持续时间
  • 输出数据 :
    • deviceVideoUrl: text(字符串), 长度=255 - 当前设备视频片段链接

关闭视频流

  • 标识符 : closeMedia
  • 描述 : (空)
  • 结果返回方式 : 4
  • 调用方式 : 0
  • 输入数据 :
    • mediaToken: text(字符串), 长度=255 - 媒体流访问token
    • clientToken: text(字符串), 长度=255 - 客户端token
  • 输出数据 :
    • clientToken: text(字符串), 长度=255 - 客户端token
    • mediaToken: text(字符串), 长度=255 - 媒体流访问token
    • rtspMediaUrl: text(字符串), 长度=255 - RTSP流媒体访问地址
    • rtmpMediaUrl: text(字符串), 长度=255 - RTMP流媒体访问地址
    • hlsMediaUrl: text(字符串), 长度=255 - HLS流媒体访问地址
    • dashMediaUrl: text(字符串), 长度=255 - DASH流媒体访问地址

打开视频流

  • 标识符 : openMedia
  • 结果返回方式 : 4
  • 调用方式 : 0
  • 输入数据 :
    • deviceId: text(字符串), 长度=255 - 设备ID
  • 输出数据 : (与关闭视频流输出类似)

获取视频设备列表

  • 标识符 : getMediaDeviceList
  • 输入数据 : (空)
  • 输出数据 :
    • deviceGuid: text(字符串), 长度=255 - 视频设备GUID
    • deviceName: text(字符串), 长度=255 - 视频设备名称
    • deviceType: enum(枚举型) - 视频设备类型(0=未知, 1=枪机, 2=球机, 3=鱼眼, 4=其他)
    • extendData: text(字符串), 长度=2048 - 视频源返回的视频设备详细信息
    • mediaSourceGuid: text(字符串), 长度=255 - 视频设备所属视频源GUID
    • mediaDeviceList: text(字符串), 长度=1024 - 媒体设备列表

获取 PTZ 位置

  • 标识符 : getPtzPos
  • 描述 : 获取指定球机的PTZ位置信息
  • 回调方法 : 0
  • 输入数据 :
    • deviceGuid: text(字符串), 长度=255 - 视频设备GUID
  • 输出数据 :
    • PtzPos: struct(结构体) - PTZ 位置(ptzPosZ, ptzPosT, ptzPosP: int32, min=1, max=111)

请求云台控制

  • 标识符 : controlPtz
  • 结果返回方式 : 0
  • 输入数据 :
    • deviceGuid: text(字符串), 长度=255 - 视频设备GUID
    • ptzCtrl: enum(枚举型) - PTZ 控制命令(0=未知, 3=启动等)
    • ptzParam: enum(枚举型) - PTZ 参数(方向、缩放、焦点等)
    • ptzSpeed: int32(整数型), min=1, max=10 - PTZ 控制速度
    • ptzPos: struct(结构体) - PTZ 位置(ptzPosP, ptzPosZ, ptzPosT: int32, min=0, max=99999999)
    • ptzPresetPos: struct(结构体) - PTZ 预置位(ptzPresetName: text 长度=255, ptzPresetID: int32 min=0 max=99999999)
  • 输出数据 :
    • status: bool(布尔型) - 状态

吸引力排序

  • 标识符 : attractionSort
  • 结果返回方式 : 3
  • 回调 URL : 211.157.115.125?port=60379&database=&username=&password=NaVe!0-bvc#9@&channel=/WmdLBvoeh5H1lOpe/*/test
  • 调用方式 : 1
  • 接口 URL : /video_analysis/center_control
  • 输入数据 :
    • analysisMission: array(数组) of struct(结构体), 大小=10 - 分析任务
    • analysisType: array(数组) of text(字符串) - 分析类型
    • callbackURL: text(字符串), 长度=255 - 回调URL
    • messageId: text(字符串), 长度=255 - 消息ID
  • 输出数据 : (空)

视频吸引力得分

  • 标识符 : video_attractive_score
  • 结果返回方式 : 4
  • 调用方式 : 1
  • 接口 URL : /video_attractive_score
  • 输入数据 :
    • resourceUrl: text(字符串), 长度=128 - 资源URL
  • 输出数据 :
    • score: int32(整数型) - 吸引力得分

图片分析-ws

  • 标识符 : picture_analysis_count_ws
  • 结果返回方式 : 5
  • 调用方式 : 1
  • 接口 URL : /{productId}/{identifier}
  • 目标事件 : crowd_count
  • 输入数据 :
    • analysisType: array(数组) of int32(整数型), 大小=20 - 分析类型(如:0=person, 1=bicycle 等)
    • resultType: int32(整数型) - 结果类型(位掩码,支持边界框、热力图等)
    • analysisResource: text(字符串), 长度=1024 - 网络图片或 base64 编码
  • 输出数据 : (空)
  • 支持的分析类型及其编码

    {0: 'person', 1: 'bicycle', 2: 'car', 3: 'motorcycle', 4: 'airplane', 5: 'bus', 6: 'train', 7: 'truck', 8: 'boat', 9: 'traffic light', 10: 'fire hydrant', 11: 'stop sign', 12: 'parking meter'}
    
  • 支持的结果类型及其编码

    {1:'objectNumber',2:'objectBoundingBox',4:'heatMapImage',8:'boundingBoxImage',16:'boundingBoxImageUrl',32:'heatMapImageUrl'}
    

图片分析-http

  • 标识符 : picture_analysis_count
  • 结果返回方式 : 5
  • 调用方式 : 1
  • 接口 URL : /picture_analysis_count
  • 目标事件 : crowd_count
  • 输入数据 :
    • analysisType: array(数组) of int32(整数型), 大小=20 - 分析类型(如:0=person, 1=bicycle 等)
    • resultType: int32(整数型) - 结果类型(位掩码,支持边界框、热力图等)
    • analysisResource: text(字符串), 长度=1024 - 网络图片或 base64 编码
  • 输出数据 : (空)
  • 支持的分析类型及其编码 :(与图片分析-ws一致)
  • 支持的结果类型及其编码 :(与图片分析-ws一致)

行人识别计数服务

  • 标识符 : crowd_detect_count
  • 描述 : 请求类型:0x01识别数量 0x02识别框 0x04热力图 0x08边界图 0x10边界图Url 0x20热力图Url
  • 结果返回方式 : 5
  • 回调 URL : 192.168.100.50:6380&test123
  • 调用方式 : 1
  • 接口 URL :
  • 目标事件 : crowd_count
  • 输入数据 :
    • requestUrl: text(字符串), 长度=128 - 请求地址
    • requestResultType: text(字符串), 长度=128 - 请求结果类型
    • originalImageURL: text(字符串), 长度=255 - 原图地址URL
    • deviceName: text(字符串), 长度=128 - 设备名称
  • 输出数据 :
    • objectNumber: int32(整数型), min=1, max=1111 - 目标数量
    • objectBoundingBox: text(字符串), 长度=255 - 目标边界框
    • boundingBoxImage: text(字符串), 长度=512 - 边界框图片
    • boundingBoxImageUrl: text(字符串), 长度=255 - 边界框图片URL
    • time: text(字符串), 长度=128 - 时间
    • heatMapImageUrl: text(字符串), 长度=128 - 热力图URL
    • heatMapImage: text(字符串), 长度=128 - 热力图

车辆识别计数服务

  • 标识符 : vehicle_detect_count
  • 描述 : 请求类型:0x01识别数量 0x02识别框 0x04热力图(无) 0x08边界图 0x10边界图Url
  • 结果返回方式 : 5
  • 目标事件 : vehicle_count
  • 输入数据 :
    • requestUrl: text(字符串), 长度=128 - 请求地址
    • requestResultType: text(字符串), 长度=128 - 请求结果类型
    • originalImage: text(字符串), 长度=128 - 原图地址URL
  • 输出数据 :
    • objectNumber: int32(整数型), min=1, max=1111 - 目标数量
    • objectBoundingBox: text(字符串), 长度=255 - 目标边界框
    • boundingBoxImage: text(字符串), 长度=512 - 边界框图片
    • boundingBoxImageUrl: text(字符串), 长度=128 - 边界框图片URL
    • time: text(字符串), 长度=127 - 时间

消息解析脚本

实体映射(上行)

/**
 * 将第三方服务的自定义数据格式转换为数字孪生服务协议的数据格式,设备、属性上报、事件上报到DTS时调用。
 * @param {object} body - 入参
 * @param {object} body._bv_callback_message - 服务回调参数,回调时存在
 * @param {string} body._bv_callback_message.productId - 产品编号
 * @param {string} body._bv_callback_message.deviceId - 设备编号
 * @param {string} body._bv_callback_message.identifier - 事件的唯一标识符,回调方式为事件上报时存在
 * @param {object} body._bv_callback_message._bv_service_callback - 服务调用参数
 * @param {string} body._bv_callback_message._bv_service_callback.requestId - 用于标记请求
 * @param {string} body._bv_callback_message._bv_service_callback.identifier - 服务唯一标识
 * @param {string} body._bv_callback_message._bv_service_callback.version - 消息格式版本
 * @param {number} body._bv_callback_message._bv_service_callback.timestamp - 服务调用时间
 * @param {number} flag - 入参,0 设备上报 1 属性上报 2 事件上报
 * @returns {object} 出参
 */
function rawDataToProtocol(body, flag) {
    var jsonMap = {};
    var inputData = body;
    if (flag === 0) {
        /**
         * @returns {string} return.deviceId - 设备编号(保证唯一),必传
         * @returns {string} return.deviceName - 设备名称(最大长度255),必传
         * @returns {number} return.deviceStatus - 设备状态 0:禁用 1:启用(默认),非必传
         * @returns {number} return.deviceType - 设备类型 0:动态资源 1:静态资源,必传
         * @returns {string} return.location - 设备位置纬经度(默认0 0 0 = latitude longitude elevation),非必传
         * @returns {string} return.version - 版本号,默认default,非必传
         * @returns {Object} return.payload - 扩展数据,产品属性,可用于更新设备属性值(该数据根据产品Profile中定义的属性进行过滤,已存在定义的数据会保留,其余数据则弃用),非必传
         */
        return body;
    }
    if (flag === 1) {
        /**
         * @returns {string} return.deviceId - 设备编号(保证唯一),必传
         * @returns {string} return.deviceSecret - 设备签名(不传时将系统匹配),非必传
         * @returns {string} return.deviceName - 设备名称(最大长度255),非必传
         * @returns {number} return.deviceStatus - 设备状态 0:禁用 1:启用(默认),非必传
         * @returns {string} return.location - 设备位置纬经度(默认0 0 0 = latitude longitude elevation),非必传
         * @returns {number} return.timestamp - 上行数据传输时间。时间戳格式为数值,值为自GMT 1970年1月1日0时0分到当前时间点所经过的毫秒数,非必传
         * @returns {string} return.version - 版本号,默认default,非必传
         * @returns {Object} return.payload - 扩展数据,产品属性,可用于更新设备属性值(该数据根据产品Profile中定义的属性进行过滤,已存在定义的数据会保留,其余数据则弃用),非必传
         */
        if (inputData._bv_callback_message) {
            var bv_callback_message = inputData._bv_callback_message;
            var bv_service_callback = bv_callback_message._bv_service_callback;
            var payload = inputData.payload ? inputData.payload : {};
            if (bv_service_callback.identifier == "captureServerImage" || bv_service_callback.identifier == "captureServerVideo") {
                if (inputData.result != 0) {
                    return;
                }
                if (bv_service_callback.identifier == "captureServerImage") {
                    var resourceUrl = FileStorage.cache(inputData.file, inputData.suffix, bv_callback_message.deviceId);
                    payload.deviceImage = resourceUrl;
                }
                if (bv_service_callback.identifier == "captureServerVideo") {
                    var resourceUrl = FileStorage.disk(inputData.file, inputData.suffix);
                    payload.deviceVideoUrl = resourceUrl;
                }
            }
            if (bv_service_callback.identifier == "video_attractive_score") {
                payload.score = inputData.score;
            }
            if (bv_service_callback.identifier == "captureImage") {
                //payload.deviceImage = inputData.payload.deviceImage.replace("172.27.240.1","10.132.25.2");
            }
            jsonMap.deviceId = bv_callback_message.deviceId;
            jsonMap.payload = payload;
            return jsonMap;
        } else {
            return body;
        }
    }
    if (flag === 2) {
        /**
         * @returns {string} return.deviceId - 设备编号(保证唯一),必传
         * @returns {string} return.deviceSecret - 设备签名(不传时将系统匹配),非必传
         * @returns {string} return.deviceName - 设备名称(最大长度255),非必传
         * @returns {number} return.deviceStatus - 设备状态 0:禁用 1:启用(默认),非必传
         * @returns {string} return.location - 设备位置纬经度(默认0 0 0 = latitude longitude elevation),非必传
         * @returns {string} return.identifier - 事件的唯一标识符,必传
         * @returns {number} return.timestamp - 上行数据传输时间。时间戳格式为数值,值为自GMT 1970年1月1日0时0分到当前时间点所经过的毫秒数,非必传
         * @returns {string} return.version - 版本号,默认default,非必传
         * @returns {Object} return.payload - 扩展数据,事件的输出参数(该数据根据产品Profile中定义的事件输出参数进行过滤,已存在定义的数据会保留,其余数据则弃用),非必传
         */
        if (inputData._bv_callback_message) {
            jsonMap['deviceId'] = inputData._bv_callback_message.deviceId;
            jsonMap['identifier'] = inputData._bv_callback_message.identifier;
            // 添加mask过滤
            var entityAttribute = CoreApi.getEntityAttribute(inputData._bv_callback_message.productId, inputData._bv_callback_message.deviceId);
          entityAttribute = JSON.parse(entityAttribute);
            if (typeof entityAttribute === 'object' && entityAttribute !== null && entityAttribute.hasOwnProperty('TestImageMask') && entityAttribute.hasOwnProperty('deviceImage')) {
                const mask = JSON.parse(entityAttribute.TestImageMask);
                inputData = maskFilter(inputData, mask)
                inputData.boundingBoxImage = drawBox(inputData, entityAttribute.deviceImage)
            }

            // 存在文件资源时将存储至网关服务下
            if (inputData.heatMapImage) {
                inputData.heatMapImageUrl = FileStorage.disk(inputData.heatMapImage, "jpg");
            }
            if (inputData.boundingBoxImage) {
                inputData.boundingBoxImageUrl = FileStorage.disk(inputData.boundingBoxImage, "jpg");
            }
            jsonMap['payload'] = {
                "analysisTime": inputData.analysisTime,
                "objectNumber": inputData.objectNumber,
                "objectBoundingBox": inputData.objectBoundingBox,
                "boundingBoxImageUrl": inputData.boundingBoxImageUrl,
                "heatMapImageUrl": inputData.heatMapImageUrl
            }
        }
        return jsonMap;
    }
}

function drawBox(box,image) {
    const labels = [];
    const boxes = [];
    Object.keys(box.objectBoundingBox).forEach(function (key) {
        const value = box.objectBoundingBox[key];
        boxes.push(JtsGeometry.createCoordinatesXYXY(value));
        labels.push(key);
    });
    return JtsGeometry.drawBox(image, boxes, "Number:" + box.objectNumber, labels);
}

/**
 * 根据掩码(mask)过滤 box 对象中的边界框信息。
 * @param {object} inputData - 包含边界框信息的对象,其中 objectBoundingBox 属性存储具体的边界框数据。
 * @param {object} mask - 掩码对象,包含几何信息用于与边界框进行交集判断。
 */
function maskFilter(inputData, mask) {
    if (typeof inputData.objectBoundingBox !== 'object' && inputData.objectBoundingBox === null) {
        console.log("inputData.objectBoundingBox 不是有效的对象")
        return inputData;
    }
    const in_mask = mask.properties.mask_type === "positive";
    var objectBoundingBoxObj = {};
    var objectNumber = 0;
    for (const key in inputData.objectBoundingBox) {
        let value = inputData.objectBoundingBox[key];

        // value保留三位小数 double类型
        for (let i = 0; i < value.length; i++) {
            if (typeof value[i] !== 'number') {
                value[i] = parseFloat(value[i].toString());
            }
            value[i] = parseFloat(value[i].toFixed(3));
        }

        // 使用 JtsGeometry 工具类将边界框坐标转换为多边形所需的坐标数组
        const boxCoor = JtsGeometry.createCoordinatesXYXY(value);
        // 创建边界框对应的多边形
        let boxPolygon = JtsGeometry.createPolygon(boxCoor);
        for (let i = 0; i < mask.geometry.annotations.length; i++) {
            const maskCoor = JtsGeometry.createCoordinates(mask.geometry.annotations[i].coor);
            const maskPolygon = JtsGeometry.createPolygon(maskCoor);
            // 如果 in_mask 为 true 且边界框多边形和掩码多边形有交集
            if (in_mask && JtsGeometry.isIntersects(maskPolygon, boxPolygon)) {
                //console.log("box和mask有交集,交集面积为", JtsGeometry.intersectionArea(maskPolygon, boxPolygon))
                objectBoundingBoxObj[key] = value;
                objectNumber++;
                break;
            }
            // 如果 in_mask 为 false 且边界框多边形和掩码多边形没有交集
            if (!in_mask && !JtsGeometry.isIntersects(maskPolygon, boxPolygon)) {
                //console.log("负掩码,box和mask没有交集即为有效区域")
                objectBoundingBoxObj[key] = value;
                objectNumber++;
                break;
            }
        }
    }
    inputData.objectBoundingBox = objectBoundingBoxObj;
    inputData.objectNumber = objectNumber;
    return inputData;
}

实体反控(下行)

/**
 * 将DTS平台的BV JSON数据转换为设备(或第三方服务)能识别的格式数据,DTS给设备(或第三方服务)下发数据时调用。
 * @param {JSONObject} serviceParams - 入参,请求时服务的固定参数
 * @param {string} serviceParams.requestId - 请求id
 * @param {string} serviceParams.productId - 请求产品编号
 * @param {string} serviceParams.deviceId - 请求设备编号
 * @param {string} serviceParams.serviceIdentifier - 请求服务标识
 * @param {string} serviceParams.serviceName - 请求服务名称
 * @param {JSONObject} inputParams - 入参,产品Profile中服务的输入参数
 * @param {number} flag - 入参,0=服务调用
 * @returns {JSONObject} - 出参,满足当前服务的输入参数,请注意数据类型以及参数标识符的统一性。
 */
function protocolToRawData(serviceParams, inputParams, flag) {
    if (flag === 0) {
        var data = inputParams;
        if (data.analysisType && data.analysisType.indexOf("100003") !== -1) {
            // 按分号分割 analysisMission 字符串
            var parts = data.analysisMission.split(';');
            var result = [];

            // 遍历每个分割后的部分
            for (var i = 0; i < parts.length; i++) {
                var item = parts[i].trim();
                if (item) {
                    var subParts = item.split(',');
                    var obj = {
                        deviceId: subParts[0].trim(),
                        programName: subParts[1].trim(),
                        originalVideoUrl: subParts[2].trim()
                    };
                    result.push(obj);
                }
            }
            data.analysisMission = [{
                    args: result,
                    sceneGuid: "0"
                }
            ];
            data.messageId = Date.now();
            return data;
        }
        if (data.beginTimestamp) {
              // 拿取事件发生时前5s的
            data.beginTimestamp = new Date(data.beginTimestamp).getTime() - 5000;
            return data;
        }

        //参考服务的输入参数
        return inputParams;
    }
}
作者:北京-产品-yantings  创建时间:2025-05-21 15:20
最后编辑:北京-产品-yantings  更新时间:2026-07-16 17:09
上一篇:
下一篇: