事件订阅
接口描述
注册接收时间中心消息的URL地址。现阶段异常事件规则事先预置或者通过web前端配置,后续可按需开放API接口配置,比如:人脸识别技能的异常规则为有人脸即推送异常事件。
请求结构
POST /msg/config/set-notify-url
请求头域
无特殊请求头。
请求参数
参数 | 类型 | 是否必选 | 描述 | 示例 |
---|---|---|---|---|
receivers | Array | 是 | URL全路径数组,使用post方式向URL推送异常事件。当前只支持http,不支持https等。如果数组长度为0且reset为true,表示删除所有接收者。 注意不要遗漏http://前缀。 | ["http://1.2.3.4:8980/r1”,“http://a.b.c.d:9977/r2"] |
msgType | String | 是 | 消息类型,当前固定为raw,表示原始消息通知。 | "msgType": "raw" |
reset | Boolean | 否 | true: 清理之前该msgType的所有receivers为本次请求receivers。 false: 将当前的设置合并到之前的设置中。如果之前已经有相同receiver,则覆盖旧的receiver相关设置。默认为false。 | "reset": true |
attr | Map | 否 | key是要进行属性设置的receiver,value是具体属性。如果reset为false,则旧的receiver的属性也可以在本次更新。 | "attr": {"withImage": "never" } |
+withImage | String | 否 | 如何接收本消息对应的抽帧图片。可选值包括:never(从不接收) exception(仅当事件中心判别消息为异常消息时) normal(仅当事件中心判别消息非异常时) any(总是接收)。默认为any | "withImage": "exception" |
+filter | Map | 指定只对符合过滤条件的消息进行推送。topic,schema,device_id,filter_func之间是逻辑AND的关系,数组字段本身是逻辑或的关系。 | ||
++topic | Array | String数组,指定哪些topic需要推送,只要满足数组中一项即匹配该字段。如果为空则忽略该过滤条件 | ["lucky-ai", "topic2" ] | |
++schema | Array | String数组,指定哪些schema需要推送,只要满足数组中一项即匹配该字段。如果为空则忽略该过滤条件 | ||
++device_id | Array | String数组,指定哪些设备ID需要推送,只要满足数组中一项即匹配该字段。如果为空则忽略该过滤条件 | ||
++filter_func | String | javascript配置的过滤函数,输入是原始消息,输出是bool,返回true表示匹配,false表示不匹配。如果为空则忽略该过滤条件 |
过滤说明 假设rawMsg为原始消息的json结构体,则rawMsg满足rawMsg.topic in filter.topic AND rawMsg.schema in filter.schema AND rawMsg.device_id in filter.device_id AND eval(rawMsg.filter_func) == true 时,才会推送。
示例说明
只推送检测到目标中未戴安全帽的原始消息,可以使用如下filter_func:
function filter_func(msg){ var obj =JSON.parse(msg);if(obj.message.objects.length>0){ var sub_obj = obj.message.objects;for(var i=0; i<sub_obj.length; i++){ if (sub_obj[i].text.indexOf('未戴安全帽') != -1){ return true;}}}return false;};
只推送匹配了异常检测的filter_func:
"function filter_func(msg){ var obj =JSON.parse(msg);if(obj.tag) { if(obj.tag.length){return true};}; return false}"
如果原始消息匹配了异常检测配置,原始消息会有tag字段(字符串数组,记录异常检测配置ID),表示匹配了哪些异常检测配置,所以这里检测了tag字段是否为空。
响应头域
无特殊响应头。
响应参数
参数 | 类型 | 描述 |
---|---|---|
status | Int32 | 接口返回状态, 0表示成功,其他表示失败 |
message | String | 成功或错误提示 |
data | JSON | 忽略该字段 |
请求示例
POST /msg/config/set-notify-url HTTP/1.1
Content-Type: application/json
Content-Length: 1254
{
"receivers": ["http://1.2.3.4:8980/new-recv1", "http://2.3.4.5:9977/new-recv2"]
"msgType": "raw",
"reset": false,
"attr": {
"http://1.2.3.4:8980/new-recv1": {
"withImage": "exception",
"filter": {
"topic": ["lucky-ai", "t2"],
"schema": ["face", "smoke"],
"device_id": ["132", "432"],
"filter_func":"function filter_func(msg){ var obj =JSON.parse(msg);if(obj.message.objects.length>0){ var sub_obj = obj.message.objects;for(var i=0; i<sub_obj.length; i++){ if (sub_obj[i].text.indexOf('无上报') != -1){ return true;}}}return false;};"
},
"http://2.3.4.5:9977/new-recv2": {
"withImage": "normal"
},
"http://a.b.c.d/old-existed/receiver": {
"withImage": "any"
}
}
}
注:如果希望全部URL不再接收通知,可将receivers置空并设置reset为true,请求示例如下:
{
"receivers": [],
"msgType": "raw",
"reset": true
响应示例
HTTP/1.1 200 OK
cache-control: no-cache
content-length: 484
content-type: application/json; charset=utf-8
date: Thu, 17 Nov 2022 00:45:02 GMT
server: nginx/1.21.6
{
"status":0,
"message": "success",
"data": null
}
异常事件推送数据格式
推送方式
向订阅URL以POST方式推送异常事件
推送参数
推送消息为JSON格式。收到响应http 200表示成功。目前无论是否推送成功,不会重试,只会记录失败日志。
参数 | 类型 | 描述 |
---|---|---|
id | String | 消息存储ID,只在单个边缘盒子唯一,不同边缘盒子之间可能重复 |
tag | Array | String数组,是否异常的标识。该字段不存在或者数组为空表示非异常,否则表示异常。非空时,每一项表示对应异常检测配置在DB中的主键ID。例如:["625df16f82cdb900013a5039", "625df16f82cdb900013a5041"] |
topic | String | 固定为lucky-ai |
schema | String | 技能英文名称 |
msg_id | String | 消息唯一标识 |
local_time | Int64 | 毫秒级消息时间戳 |
device_id | String | 单个边缘盒子上的摄像头设备的字符串唯一标识(只在该边缘盒子上唯一,有可能与其他边缘盒子的某个摄像头ID相同),与添加设备接口返回的字符串id唯一对应 |
machine_id | String | 边缘盒子的唯一标识,不同边缘盒子该字段值不同 |
message | Map | 具体识别结果 |
+image | String | BASE64编码的JPEG图片数据,解码BASE64后可以直接作为JPEG打开 |
+objects | Array | 多个识别结果的描述数组 |
++text | String | 识别结果文本 |
++bcolor | String | 对象绘图边框颜色。RGB格式。例如”#ff0000”表示红色 |
++x | Int32 | 识别区域的左上角x坐标 |
++y | Int32 | 识别区域左上角y坐标 |
++h | Int32 | 识别区域高度 |
++w | Int32 | 识别区域宽度 |
++content | Map | 识别结果的规格化输出,目前只有人流量算子有该字段 |
+++current | Int32 | 画面当前人数,目前只有人流量算子有该字段 |
region | Map | 周界识别区域。如果没有设置,该字段内容为空 |
+local_time | 整数 | 毫秒级时间戳,表示周界区域设置时间 |
+ai | String | 算法英文名称,同schema |
+id | String | 该边缘盒子上该算法对应的周期区域唯一标识 |
+deviceId | String | 边缘盒子上摄像头ID,同上述device_id字段 |
+text | String | 周界区域名称 |
+bcolor | String | 边框颜色。指定的十六进制RGB颜色。例如 #ff00ff表示全红+全蓝组合的颜色 |
+regions | Array | 每个字典对象代表一个多边形 |
++polygon | Array | Int32类型的数组。以(x1,y1), (x2,y2),…,(xn,yn)多边形顶点坐标表示的多边形。例如polygon[0]代表x1, polygon[1]代表y1, polygon[2]代表x2 |
推送事件格式示例
数据格式与“查询视频分析事件”API的响应参数data部分对应。
POST /your-receiver-URL/xxxx HTTP/1.1
Content-Type: application/json
Content-Length: 1254
{
"id": "5349b4ddd2781d08c09890f4",
"topic": "lucky-ai",
"schema": "face",
"msg_id": "D5-1608186865880-3473",
"local_time": 16081865880,
"machine_id": "边缘盒子唯一标识XXX",
"device_id": "135",
"region": {
"id": "5349b4ddd2781d08c0989077",
"ai": "face",
"local_time": 1653878385345,
"device_id": "135",
"text": "区域1",
"bcolor": "0xff00bb",
"regions": [
{
"polygon": [34, 55, 340, 547, 42, 250]
},
{
"polygon": [24, 25, 340, 447, 52, 250]
}
]
},
"message": {
"image": "JPEG文件的BASE64编码数据",
"objects": [
{
"x": 3, "y": 4, "w": 100, "h": 200, "bcolor": "#ff00bb",
"text": "张三"
},
{
"x": 13, "y": 14, "w": 200, "h": 100, "bcolor": "#ff00bb",
"text": "李四"
}
]
}
}