订阅通知实现ai识别.md 9.2 KB

事件订阅流程

服务端发送订阅请求

sequenceDiagram
participant web端
participant 服务端
participant 设备
web端 -->> 服务端 : 配置订阅请求
服务端 ->> +设备 : 1.  SUBSCRIBE 请求 订阅ai信息 
设备 -->> -服务端 : 2. 回复订阅成功信息
par 设备录像或者拍照
    设备 -->> +设备: 等待识别到指定ai信息
    设备 -->> -设备: 识别结果规则匹配
end

设备 ->> +服务端 : 3. NOTIFY 识别到物体通知
服务端 -->> -设备 : 4. 回复收到信息
服务端 ->> 服务端 :  处理通知
服务端 ->> web端 : 推送识别到ai数据通知

gb28181订阅示范

1:事件观察者向事件源发送SUBSCRIBE请求,请求消息体携带订阅参数; 2:事件源应将订阅成功与否的响应消息返回给该事件观察者。 服务端 -> 设备

Via:SIP/2.0/UDP 事件观察者域名或IP地址
Max-Forwards:70
From:显示名<sip:事件观察者编码@事件观察者域名或IP地址>;tag=BK32B1U8DKDrB
To:显示名<sip:事件源编码@事件源域名或IP地址>
Call-ID:17250
CSeq:1SUBSCRIBE
Expires:90
Event:presence
Content-type:Application/MANSCDP+XML
Content-Length:消息实体的字节长度
<? xmlversion="1.0"?>
<Query>
<CmdType>Alarm </CmdType>
<SN>17430</SN>
<DeviceID>64010000001340000001</DeviceID>
<StartAlarmPriority>1</StartAlarmPriority>
<EndAlarmPriority>4</EndAlarmPriority>
<AlarmMethod>0</AlarmMethod>
<StartTime>2010-11-11T00:00:00</StartTime>
<EndTime>2010-12-11T00:00:00</EndTime>
</Query>

设备 -> 服务端

Via:SIP/2.0/UDP 事件观察者域名或IP地址
From:显示名<sip:事件观察者编码@事件观察者域名或IP地址>;tag=BK32B1U8DKDrB
To:显示名<sip:事件源编码@事件源域名或IP地址>
Call-ID:17250
CSeq:1SUBSCRIBE
Expires:90
Event:presence
Content-type:Application/MANSCDP+XML
Content-Length:消息实体的字节长度
<? xmlversion="1.0"?>
<Response>
<CmdType>Alarm </CmdType>
<SN>17430</SN>
<DeviceID>64010000001340000001</DeviceID>
<Result>OK</Result>
</Response>

事件通知消息示范

设备 -> 服务端

Via:SIP/2.0/UDP 事件源域名或IP地址
Max-Forwards:70
From:显示名<sip:事件源编码@事件源域名或IP地址>;tag=BK32B1U8DKDrB
To:显示名<sip:事件观察者编码@事件观察者域名或IP地址>
Call-ID:17250
CSeq:1NOTIFY
Subscription-State:active;expires=90;retry-after=0
Event:presence
Content-type:Application/MANSCDP+XML
Content-Length:消息实体的字节长度
<? xmlversion="1.0"?>
<Notify>
<CmdType>Alarm</CmdType>
<SN>1</SN>
<DeviceID>64010000001340000001</DeviceID>
<AlarmPriority>4</AlarmPriority>
<AlarmMethod>2</AlarmMethod>
<AlarmTime>2009-12-04T16:23:32</AlarmTime>
<AlarmDescription>警情描述</AlarmDescription>
<Longitude>171.3</Longitude>
<Latitude>34.2</Latitude>
</Notify>

服务端 --> 设备

Via:SIP/2.0/UDP 事件源域名或IP地址
From:显示名<sip:事件源编码@事件源域名或IP地址>;tag=BK32B1U8DKDrB
To:显示名<sip:事件观察者编码@事件观察者域名或IP地址>
Call-ID:17250
CSeq:1NOTIFY
Content-type:Application/MANSCDP+XML
Content-Length:消息实体的字节长度
<? xmlversion="1.0"?>
<Response>
<CmdType>Alarm </CmdType>
<SN>1</SN>
<DeviceID>64010000001340000001</DeviceID>
<Result>OK</Result>
</Response>

需求

  1. 指定设备端启用的识别算法
  2. 人脸
  3. 火情
  4. 车牌
  5. 根据指定规则触发人脸
  6. 根据特征码识别人脸
  7. 根据识别相似度

订阅通知协议定义与数据获取方法

对订阅报警方法进行扩展,使用4级警情-报警条件为7来设定报警

开始订阅 (服务端 -> 设备)

头数据

Via:SIP/2.0/UDP 事件观察者域名或IP地址
Max-Forwards:70
From:显示名<sip:事件观察者编码@事件观察者域名或IP地址>;tag=BK32B1U8DKDrB
To:显示名<sip:事件源编码@事件源域名或IP地址>
Call-ID:17250
CSeq:1SUBSCRIBE
Expires:90
Event:presence
Content-type:Application/MANSCDP+XML
Content-Length:消息实体的字节长度

xml数据结构

<? xmlversion="1.0"?>
<Query>
<CmdType>Alarm </CmdType>
<SN>17430</SN>
<DeviceID>64010000001340000001</DeviceID>
<StartAlarmPriority>4</StartAlarmPriority>
<EndAlarmPriority>4</EndAlarmPriority>
<AlarmMethod>7</AlarmMethod>
<StartTime>2010-11-11T00:00:00</StartTime>
<EndTime>2010-12-11T00:00:00</EndTime>
<!--    上方数据为国标必须数据 -->
    
<!--    
tagName=HfyAiInfo 此特殊标签表示对ai进行配置 
aiNum 启用的ai算法数量
-->
<HfyAiInfo aiNum="3">
    
    <HfyAi>
<!--        算法类型 1:人脸 2:火情 3:车牌-->
        <Arithmetic>1</Arithmetic>
<!--        触发方式 人脸和车牌有效  1:不限制 2:白名单策略 3:黑名单策略   -->
        <TriggerType>3</TriggerType>
<!--        资源路径 设备端获取人脸特征数据信息 这些数据怎么让设备获取 -->
        <ResourcePath>http://127.0.0.1/</ResourcePath>
<!--        资源上传地址,用于在识别成功后上传多媒体资源 -->
        <uploadUrl>http://127.0.0.1:8080/up</uploadUrl>
<!--        刷新数据间隔,单位秒 默认2分钟 -->
        <RefreshTime>60</RefreshTime>
<!--        可靠度百分比,大于此值触发报警事件 0-100 -->
        <Score>70.0</Score>
    </HfyAi>
    
<!--    火情识别 -->
    <HfyAi>
        <Arithmetic>2</Arithmetic>
        <Score>45.3</Score>
        <uploadUrl>http://127.0.0.1:8080/fire</uploadUrl>
    </HfyAi>
    
<!--    车牌-->
    <HfyAi>
        <Arithmetic>3</Arithmetic>
        <TriggerType>1</TriggerType>
        <ResourcePath>http://127.0.0.1/carList</ResourcePath>
        <RefreshTime>60</RefreshTime>
        <Score>65.3</Score>
    </HfyAi>
</HfyAiInfo>
</Query>

订阅回复 (设备 -> 服务端)

头数据

Via:SIP/2.0/UDP 事件观察者域名或IP地址
From:显示名<sip:事件观察者编码@事件观察者域名或IP地址>;tag=BK32B1U8DKDrB
To:显示名<sip:事件源编码@事件源域名或IP地址>
Call-ID:17250
CSeq:1SUBSCRIBE
Expires:90
Event:presence
Content-type:Application/MANSCDP+XML
Content-Length:消息实体的字节长度

xml 结构体

<? xmlversion="1.0"?>
<Response>
<CmdType>Alarm </CmdType>
<SN>17430</SN>
<DeviceID>64010000001340000001</DeviceID>
<Result>OK</Result>
</Response>

设备端获取名单资源数据

设备端获取数据流程

graph TD
a(开始检查数据) --> b[请求url] 
--> c{是否携带数据版本信息}
 c -->|否| d[服务端返回当前版本] --> a
 c -->|是| f{版本是否一致}
 f -->|否| e[返回版本号和数据]
 f -->|是| g[返回版本一致] 
 --> 不更新数据 
 -->  wait[等待] -->a
 e --> 更新数据 -->wait

设备端触发通知

设备端在指定情况下推送消息到gb服务端

<? xmlversion="1.0"?>
<Notify>
<CmdType>Alarm</CmdType>
<SN>1</SN>
<DeviceID>64010000001340000001</DeviceID>
<AlarmPriority>4</AlarmPriority>
<AlarmMethod>7</AlarmMethod>
<AlarmTime>2009-12-04T16:23:32</AlarmTime>
<AlarmDescription>警情描述</AlarmDescription>
<Longitude>171.3</Longitude>
<Latitude>34.2</Latitude>
<!--    通过扩展报警来实现自定义ai数据上报 -->
<HfyAiInfo>
<!--        识别到的数据框,有识别到多少就是多少 -->
    <AiDataItem>
            <!--        匹配到的ai算法的类型 -->
            <Arithmetic>3</Arithmetic>
            <!--        相似度 -->
            <Score>65.3</Score>
<!--            车牌号-->
            <CarPlate></CarPlate>
<!--            车牌类型 -->
            <PlateType></PlateType>
<!--            识别到的ai主题框-->
            <DrawBox>x1,x2,y1,y2</DrawBox>
    </AiDataItem>
    
    <AiDataItem>
        <Arithmetic>1</Arithmetic>
        <Score>85.0</Score>
<!--        人脸特征值数据 -->
        <faceId>1234</faceId>
        <DrawBox>x1,x2,y1,y2</DrawBox>
    </AiDataItem>
    
<!--    火情-->
    <AiDataItem>
        <Arithmetic>2</Arithmetic>
        <Score>65.3</Score>
        <DrawBox>x1,x2,y1,y2</DrawBox>
    </AiDataItem>
<!--        多媒体资源的uuid,用于和http post方式上传的数据进行绑定 -->
    <MediaId>10086</MediaId>
</HfyAiInfo>
</Notify>

通知设备ai库更新

<? xmlversion="1.0"?> update 17430 64010000001340000001 OK

ai识别到的多媒体数据上传

摄像头会在识别时会有对应的图像或者录像数据,这部分得看怎么和通知绑定起来

  1. 通过 http post 的方式上传文件,但是参数携带 MediaId

http接口定义

设备获取数据库列表

  1. 接口地址 /aiLib/list/{libId}
  2. 请求参数 | 字段 | 位置 | 必须? | 备注 | | --- | --- | --- | --- | | libId | path | y | 数据库id 由wvp平台下发指定 | | v | query | n | 数据库版本号 | | p | version | n | 页码 默认1 | | l | limit | n | 每页数量 默认50 |

  3. 服务端返回数据结构 json | 字段 | 类型 | 备注 | |-------| --- |------------------------------| | code | int | 调用状态码 0:成功,携带指定数据 2:无版本号 | | v | string | 版本号 生成规则 hfy+随机uid,指定接口只有一个值 | | data | array | 识别名单列表,为0时存在 | | page | int | 页码 | | limit | int | 限制值 | | total | int | 总数量 |