IPC子设备和驱动
功能简介
通过添加配置IPC子设备和驱动,用户可以接入RTSP视频流,对视频流进行抽帧,调用AI服务对抽帧结果进行推断,并将消息推送到节点自带broker上。
新版的IPC驱动还提供了对于边缘视频流的代理推流功能,可以推送到BIE提供的使用rtsps加密的视频平台,并能够在云端实时查看该视频流(公有云暂不提供),也可以推送到用户指定的rtsp/rtmp视频平台。
创建产品和设备
1.点击产品管理,创建IPC协议的产品,如果需要使用onvif协议,请将以下内容保存为onvif.json后,导入该产品:
{"items":[{"name":"onvif","version":"1673597021zqgpjx","attributes":[{"name":"ip","id":"ip","type":"string","defaultValue":"127.0.0.1","required":true},{"name":"port","id":"port","type":"int32","defaultValue":80,"required":true},{"name":"username","id":"username","type":"string","defaultValue":"admin","required":true},{"name":"password","id":"password","type":"string","defaultValue":"1234qwer","required":true}],"createTime":"2023-01-12T18:44:17+08:00","updateTime":"2023-01-13T16:03:41+08:00","type":0}],"total":1}
2.点击设备管理,创建IPC协议产品的子设备,选择刚刚创建的onvif产品,并根据实际情况填写onvif连接信息。
配置驱动
- 选中节点,点击子设备管理,引入官方IPC驱动。
- 点击绑定子设备,选择对应的产品找到刚刚创建的设备。
- 点击驱动配置,选择添加服务
模型请求支持在前端自定义参数和body内容,body中图片文件为抽帧得到的图片。以easyedge 模型服务为例,存在两类请求,图像文件支持binary和base64。 (接口说明参考:https://ai.baidu.com/ai-doc/EASYDL/vk7pzuavg#http-%E8%BF%94%E5%9B%9E%E6%95%B0%E6%8D%AE)
- 服务名称:任意
- 抽帧频率:默认1,单位fps
- 是否缩放:默认为否,单位为像素px
- 服务请求地址:填写AI服务暴露的API地址
- params:参数,添加调AI服务的请求参数,比如阈值(在调用AI服务时,为了使模型服务可以区分图片顺序,在header中默认添加Unix毫秒级时间戳,示例
{"Unix-Date":"1684740775233"}
) - body:支持以原始文件binary和json,在json中,图片会以base64编码格式传输,您只需要在需要填写图片的json字段,使用
$(image)
来代替 - 图片本地缓存:是否将图片缓存到本地(开启该选项后,会将容器内的/var/lib/baetyl/image路径挂载到宿主机/var/lib/baetyl/image路径下,您也可以在生成ipc应用后,修改应用卷来调整宿主机挂载的路径)
- 缓存时间:图片保存时间,到期后会新建新的时间文件夹,并删除之前保存的图片
- 配置设备连接
- 配置摄像头视频流地址
- 选择对应的抽帧应用
- 选择是否进行推流
- 选择推送到BIE提供的默认视频平台或者已有的第三方rtsp/rtmp视频平台
- 点击部署驱动,生成对应的应用。
验证
- 在边缘安装节点,订阅节点baetyl-broker的指定topic,
thing/{产品名称}/{设备名称}/event/post
- 可以看到MQTTbox中出现了推断结果,结果遵循blink协议格式,其中result字段为AI模型调用结果,localPath为容器内保存路径,remotePath在未配置云端上传的情况下为空。
{
"reqId":"6f7f78aa-d0a1-4ec1-a409-7caa6afe178d",
"method":"thing.event.post",
"version":"1.0",
"timestamp":1684724511191,
"events":{
"localPath":"var/lib/baetyl/image/tests/2023-05-22-03-01-41/easyedge-20230522030151-jdjarl.jpg",
"remotePath":"",
"result":{
"cost_ms":78,
"error_code":0,
"results":[
{
"confidence":0.5252643823623657,
"frame":0,
"index":11,
"label":"diningtable",
"location":{
"height":437,
"left":498,
"top":640,
"width":1359
},
"modelKind":2,
"name":"diningtable",
"score":0.5252643823623657,
"trackId":0,
"x1":0.25971928238868713,
"x2":0.9679739475250244,
"y1":0.5934604406356812,
"y2":0.9990088939666748
}
]
}
}
}
- 节点在线的情况下,点击实时视频流,即可看到边缘摄像头的实时视频数据。 (同时提供了rtsp流地址,可以使用vlc等软件接入查看)
onvif云台控制
当前仅可以通过设备的事件控制的openapi实现onvif云台控制。
使用http post请求,访问如下地址:https://{baetyl-cloud-address}/v1/devices/{deviceName}/event。
请求内容为application/json,
{
"type": "direction",
"payload": "down"
}
当前type固定为direction,后续可能会增加更多onvif控制内容,payload值为up,down,left,right。
结合baetyl-rule完成图片上传
在私有化版本中,服务配置可以选择是否上传云端,选择是之后,除了thing/{产品名称}/{设备名称}/event/post
这个topic会正常发送外,还会产生$baetyl/device/{设备名称}/result
额外的topic,传输内容如下。
{
"time":"2023-05-22T03:01:51.191669945Z",
"type":"UPLOAD",
"content":{
"remotePath":"tests/2023-05-22-03-01-41/easyedge-20230522030151-jdjarl.jpg",
"localPath":"var/lib/baetyl/image/tests/2023-05-22-03-01-41/easyedge-20230522030151-jdjarl.jpg"
}
}
在baetyl-rule应用中增加source为$baetyl/device/{设备名称}/result
的topic,同时,target设置为s3上传的地址。下面配置示例在上传图片的同时,将AI消息结果上传至kafka。
clients:
- name: minio
kind: s3
address: 10.123.12.1:8686
bucket: bie-upload
ak: ak
sk: sk
- name: kafka
kind: kafka
address:
- 10.123.12.1:8765
rules:
- name: result
source:
topic: thing/ipc-01/tests/event/post
qos: 0
target:
client: kafka
topic: bie-test
- name: pic
source:
topic: $baetyl/device/tests/result
qos: 0
target:
client: minio
logger:
level: debug
encoding: console
compress: true
maxAge: 10
maxSize: 10
maxBackups: 1
在完成baetyl-rule配置后,还需要为baetyl-rule应用创建对应的卷。
同时,将卷挂载到容器中,这样,IPC驱动与baetyl-rule就挂载了同一个宿主机目录,其保存的本地图片,就可以由baetyl-rule上传到minio中。