FIWARE和图像处理的协作
在实现这个数据协作基础设施时,通常会使用在欧盟第七框架计划中开发并作为开源项目维护运营的FIWARE,并且主要使用FIWARE的经纪人功能orion来组合各种FIWARE组件来构建基础设施。
然而,由于FIWARE Orion专注于文本数据的代理功能,因此无法直接处理图像或视频。FIWARE组件中有处理视频流和音频流的工具,如Kurento和OpenVidu,但它们与FIWARE Orion之间的集成并不容易。
因此,这次我们将连接USB摄像头的树莓派设备作为监视摄像头,并将摄像头拍摄的图像保存到云存储中。同时,将“图像拍摄的时间和地点”以及“保存图像的云存储路径”注册到FIWARE平台上。
这次的架构
环境建设
首先,让我们开始构建云端的基础设施。脚本文件已在GitHub上公开(qiita_fiware_camera),请克隆仓库。
另外,为了操作Microsoft Azure,请安装azure-cli;为了操作Kubernetes,请安装kubectl、helm和envsubst。
设置变量
首先,根据env.temp创建一个设置变量值的env文件。
创建.env文件
nmatsui@:qiita_fiware_camera (main =)$ cp variables/env.temp variables/env
nmatsui@:qiita_fiware_camera (main =)$ vi variables/env
请输入您的环境适当设置将以“ << ” 和 ” >> ”用于封装的变量,例如 Microsoft Azure的租户名称和Azure DNS的域名(本文以 nmatsui.work 作为示例域名进行说明)。
准备Azure AKS和Azure Blob Storage
前往安装目录,在Microsoft Azure上启动Azure AKS和Azure Blob Storage。
nmatsui@:qiita_fiware_camera (主要 =)$ cd installation/
当您执行 01_azure_login.sh 的时候,会自动弹出浏览器页面,请登录到 Microsoft Azure。
执行 02_azure_create_resourcegroup.sh 脚本以创建用于存储本次创建的云资源的资源组。
nmatsui@:安装(主要=)$ ./02_azure_create_resourcegroup.sh
运行03_azure_start_aks.sh脚本将启动Azure AKS。由于需要大约5分钟的时间,请等待命令完成。
{
“aadProfile”: null,
“addonProfiles”: null,
“agentPoolProfiles”: [
{
“availabilityZones”: null,
“count”: 3,
“creationData”: null,
“currentOrchestratorVersion”: “1.24.0”,
“enableAutoScaling”: false,
“enableEncryptionAt
…”type”: “Microsoft.ContainerService/ManagedClusters”,
“windowsProfile”: null
}
已将“qfcaks”合并为当前上下文,位于/Users/nmatsui/.kube/config
nmatsui@:安装(main =)$ kubectl get nodes
名称 状态 角色 年龄 版本
aks-nodepool1-14606101-vmss000000 就绪 agent 7分钟12秒 v1.24.0
aks-nodepool1-14606101-vmss000001 就绪 agent 7分钟14秒 v1.24.0
aks-nodepool1-14606101-vmss000002 就绪 agent 7分钟17秒 v1.24.0
运行04_azure_blobstorage.sh脚本,使Azure Blob Storage可用。同时,创建一个用于从监视摄像头上传图像的容器。
nmatsui@:installation (main =)$ ./04_azure_blobstorage.sh
{
“accessTier”: “Hot”,
“allowBlobPublicAccess”: true,
“allowCrossTenantReplication”: null,
“allowSharedKeyAccess”: null,
…
“storageAccountSkuConversionStatus”: null,
“tags”: {},
“type”: “Microsoft.Storage/storageAccounts”
}
{
“created”: true
}
FIWARE的准备工作
接下来,我们将在Kubernetes上启动FIWARE Orion、Cygnus以及它们所依赖的MongoDB。
运行05_fiware_start_mongodb.sh脚本会启动一个MongoDB的PRIMARY节点和两个SECONDARY节点。请等待几分钟,直到它们启动完毕。
nmatsui@:installation (main =)$ ./05_fiware_start_mongodb.sh…
名称:mongodb
上次部署时间:2022年6月26日星期日21:26:58
命名空间:default
状态:已部署
版本:1
测试套件:无
备注:
图表名称:mongodb
图表版本:12.1.20
应用程序版本:5.0.9
…
然后,运行以下命令:
mongosh admin –host “mongodb-0.mongodb-headless.default.svc.cluster.local:27017,mongodb-1.mongodb-headless.default.svc.cluster.local:27017,mongodb-2.mongodb-headless.default.svc.cluster.local:27017”
nmatsui@:installation (main =)$ kubectl get statefulsets
名称 就绪数 年龄
mongodb 3/3 2分49秒
nmatsui@:installation (main =)$ kubectl get pods -l app.kubernetes.io/name=mongodb
名称 就绪数 状态 重启次数 年龄
mongodb-0 1/1 运行中 0 2分55秒
mongodb-1 1/1 运行中 0 2分
mongodb-2 1/1 运行中 0 65秒
MongoDB的3个Pod启动后,执行06_fiware_setup_mongodb.sh来进行集群化。
nmatsui@:安装(主要=)$ ./06_fiware_setup_mongodb.sh…
如果您看不到命令提示符,请尝试按Enter键。
[
{
名称:’mongodb-0.mongodb-headless.default.svc.cluster.local:27017’,
状态:’PRIMARY’
},
{
名称:’mongodb-1.mongodb-headless.default.svc.cluster.local:27017’,
状态:’SECONDARY’
},
{
名称:’mongodb-2.mongodb-headless.default.svc.cluster.local:27017’,
状态:’SECONDARY’
}
]
pod “mongodb-client”已删除
执行07_fiware_start_orion.sh,启动FIWARE orion。
FIWARE orion是一个组件,可以接收来自监视摄像头的数据,并根据条件调用适当的组件来处理该数据,实现代理功能。
deployment.apps/orion已创建
nmatsui@:installation(main =)$ kubectl get deployments
名称就绪 更新中 可用 年龄
orion 3/3 3 3 4m33s
nmatsui@:installation(main =)$ kubectl get pods -l app=orion
名称 准备好的状态 状态 重启 年龄
orion-54c98d69c7-4tjmh 1/1 运行中 0 4m48s
orion-54c98d69c7-964st 1/1 运行中 0 4m48s
orion-54c98d69c7-kgxrl 1/1 运行中 0 4m48s
运行08_fiware_start_cygnus.sh脚本来启动FIWARE Cygnus。
当数据到达orion时,FIWARE Cygnus会被orion调用,并将到达的数据按时间顺序记录在数据库中。Cygnus可以使用多种数据库,但此次我们设置为将数据记录在已建立的MongoDB中。
nmatsui@:installation(main =)$ ./08_fiware_start_cygnus.sh创建了service/cygnus和deployment.apps/cygnus。
查看deployments:
nmatsui@:installation(main =)$ kubectl get deployments
名称 就绪 最新更新 可用 年龄
cygnus 3/3 3 3 89秒
orion 3/3 3 3 9分钟55秒
查看带有app=cygnus标签的pods:
nmatsui@:installation(main =)$ kubectl get pods -l app=cygnus
名称 就绪 状态 重启 年龄
cygnus-6dc69bdd9f-l6kql 1/1 运行中 0 105秒
cygnus-6dc69bdd9f-pzplw 1/1 运行中 0 105秒
cygnus-6dc69bdd9f-w8dss 1/1 运行中 0 105秒
准备API网关
因为FIWARE已经启动,所以我们将使用Kong作为API Gateway并与FIWARE Orion进行集成。通过API Gateway将FIWARE Orion间接连接到互联网,可以实现通信路径的加密、用户的认证授权,以及根据需要实现限制速率和IP限制等功能。
然而,由于这次只是验证,所以我们只用简单的固定令牌进行认证。如果是实际运营,应当使用OpenID Connect等对适当的认证和授权进行设置。
运行09_kong_start_kong.sh来启动Kong的自定义资源和Ingress控制器等。同时,Azure负载均衡器和Azure AKS将协同工作,使得Kong可以从互联网接收请求。然而,由于还没有进行DNS,TLS或路由设置,因此此时意义不大。
服务/kong-validation-webhook已创建
部署ingress-kong已创建
创建ingressclass.networking.k8s.io/kong
部署ingress-kong已调整缩放
nmatsui@:installation (main =)$ kubectl -n kong获取部署
名称 准备就绪 最新 可用性 年龄
ingress-kong 3/3 3 3 4m37s
nmatsui@:installation (main =)$ kubectl -n kong获取容器
名称 准备就绪 状态 重启数 年龄
ingress-kong-6454f9b96b-nbfsp 2/2 运行中 0 4m52s
ingress-kong-6454f9b96b-xz6mh 2/2 运行中 0 4m52s
ingress-kong-6454f9b96b-zx9qw 2/2 运行中 0 4m52s
nmatsui@:installation (main =)$ kubectl -n kong获取服务
名称 类别 集群IP 外部IP 端口 年龄
kong-proxy 负载均衡器 10.0.104.182 20.194.150.71 80:31629/TCP,443:30182/TCP 3m31s
kong-validation-webhook 集群IP 10.0.37.181 无 443/TCP 3m31s
nmatsui@:installation (main =)$ curl -i http://20.194.150.71/
HTTP/1.1 404 Not Found
Date: Sun, 26 Jun 2022 13:08:35 GMT
Content-Type: application/json; charset=utf-8
Connection: keep-alive
Content-Length: 48
X-Kong-Response-Latency: 0
Server: kong/2.8.1
{“message”:”no Route matched with those values”}
执行10_kong_start_cert-manager.sh脚本后,将A记录注册到Azure DNS,然后从Let’s Encrypt获取TLS证书。
nmatsui@:installation (main =)$ ./10_kong_start_cert-manager.sh创建命名空间/cert-manager
创建自定义资源定义.apiextensions.k8s.io/certificaterequests.cert-manager.io
…
“部署状态”: “成功”,
“资源组”: “dns-zone”,
“目标资源”: {
“id”: null
},
“生存时间”: 3600,
“类型”: “Microsoft.Network/dnszones/A”
}
clusterissuer.cert-manager.io/letsencrypt-prod已创建
执行11_kong_setup_kong.sh脚本,为Kong配置路由到FIWARE Orion。同时,应用TLS证书和使用固定令牌进行身份验证,以及将HTTP重定向到HTTPS,提高公开到互联网上的Orion API的安全性。
1. 第一个请求`curl -i http://fiware-camera.nmatsui.work/`返回404 Not Found错误,表示没有匹配的路由。
2. 第二个请求`curl -i http://fiware-camera.nmatsui.work/version`返回301 Moved Permanently,将请求重定向到HTTPS。
3. 第三个请求`curl -i https://fiware-camera.nmatsui.work/version`返回401 Unauthorized错误,表示请求缺少API密钥。
4. 最后一个请求`curl -i -H “Authorization: ${API_TOKEN}” https://fiware-camera.nmatsui.work/version`返回200 OK,并返回Orion的版本信息和其他相关信息。
以上是关于FIWARE Orion设置和API安全性的配置和请求的概述。
FIWARE中的Entity和Subscription的定义。
现在可以访问云上的FIWARE Orion API,因此我们可以注册相应的实体来监控摄像头,并定义cygnus订阅,确保实体更新时cygnus记录数据。
nmatsui@:installation (main =)$ cd ../setup/
nmatsui@:setup (main =)$ ./01_create_camera_entity.shHTTP/2 201
內容長度: 0
位置: /v2/entities/camera01?type=camera
fiware-correlator: 3e0f4e94-f555-11ec-b8fc-4a55b25ab823
日期: 星期日,2022年6月26日 13:38:20 GMT
x-kong-upstream-latency: 101
x-kong-proxy-latency: 1
透過: kong/2.8.1
内容长度:0
位置:/v2/subscriptions/62b86186fa263b47d742d76b
fiware相关器:60a34aa0-f555-11ec-94c9-eebfce5fe69a
日期:Sun,26 Jun 2022 13:39:18 GMT
x-kong-upstream-latency:44
x-kong-proxy-latency:1
通过:kong/2.8.1
通过这一方式,以下的实体将被注册到FIWARE Orion,并且当这些实体被更新时,数据将通过Cygnus存入MongoDB,并按照时间顺序进行记录。
nmatsui@:setup (main =)$ source ../variables/env
nmatsui@:setup (main =)$ curl -sS -H "Authorization: ${API_TOKEN}" -H "Fiware-Service: ${FIWARE_SERVICE}" https://fiware-camera.nmatsui.work/v2/entities/ | jq .
[
{
"id": "camera01",
"type": "camera",
"created_at": {
"type": "ISO8601",
"value": "2022-06-26T13:38:19.000Z",
"metadata": {}
},
"location": {
"type": "geo:json",
"value": {
"type": "Point",
"coordinates": [
0,
0
]
},
"metadata": {}
},
"path": {
"type": "string",
"value": "/",
"metadata": {}
}
}
]
准备监视摄像头
最后,在树莓派3上连接USB摄像头,并将其用作监视摄像头。这次我们将在Python 3.10中运行OpenCV 4来处理USB摄像头。请使用pyenv等工具将Python 3.10引入树莓派3,并安装poetry。
请注意,azure-storage-blob依赖于cryptography,在构建时需要rust。请参考官方步骤,提前安装rust。
首先,将camera_client目录通过SCP传输到树莓派3。
请在监视摄像头运行时获取连接到Azure Blob Storage的字符串,并同时将已编辑的env文件进行SCP传输。
nmatsui@:qiita_fiware_camera (main =)$ 进入variables/
nmatsui@:variables (main =)$ 运行./01_azure_storage_connectionstring.sh……………….<<连接字符串>>………………..
请开始一个新的终端并通过SSH连接到树莓派3,并安装opencv-python和Azure Blob Storage的python库azure-storage-blob。
然而,要构建opencv-python需要多种库的支持,因此请根据错误消息并参考此页面等逐个添加缺失的库。即使所有库都齐全,构建树莓派3上的opencv也需要4~5小时的时间。
nmatsui@:~$ ssh pi@raspberrypi.local
pi@raspberrypi:~/camera_client $ poetry安装
我会进入poetry的shell,并激活已安装了OpenCV等库的Python虚拟环境。同时,我会将env文件中的变量作为环境变量加载,并将连接到Azure Blob Storage的字符串也设置为环境变量。
pi@raspberrypi:~/camera_client $ poetry shell
(camera-client-4j-8aR1T-py3.10) pi@raspberrypi:~/camera_client $ set -a;source ~/env; set +a
(camera-client-4j-8aR1T-py3.10) pi@raspberrypi:~/camera_client $ export AZURE_STORAGE_CONNECTION_STRING=”……………….<<连接字符串>>………………..”
监视摄像头与FIWARE和云存储的协作
既做好了各项准备,现在让我们让监视摄像头与FIWARE和云存储进行协作。本次只需执行 main.py 脚本即可。如果环境如预期地准备好了,应该会显示“finish script”。
脚本执行完毕
如果一切顺利进行, 请检查FIware Orion的实体。最新拍摄的监控摄像头影像信息(拍摄日期、时间和地点)应该已记录在Azure Blob Storage的路径上。
nmatsui@:variables (main =)$ curl -sS -H "Authorization: ${API_TOKEN}" -H "Fiware-Service: ${FIWARE_SERVICE}" https://fiware-camera.nmatsui.work/v2/entities/ | jq .
[
{
"id": "camera01",
"type": "camera",
"created_at": {
"type": "ISO8601",
"value": "2022-06-26T14:27:22.170Z",
"metadata": {}
},
"location": {
"type": "geo:json",
"value": {
"type": "Point",
"coordinates": [
139.932983435,
37.487650993
]
},
"metadata": {}
},
"path": {
"type": "string",
"value": "photos/2022-06-26T23_27_22.170270.jpg",
"metadata": {}
}
}
]
让我们重复拍摄几次。FIWARE Orion只保留最新的信息,因此实体中始终存储着最后一次拍摄的信息。如果想要了解包括过去拍摄记录在内的时间序列信息,可以参考Cygnus记录的数据库。
nmatsui@:variables (main =)$ kubectl run mongodb-client --rm --tty -i --restart='Never' --image marketplace.azurecr.io/bitnami/mongodb:4.4.15-debian-10-r2 --command -- \
> mongosh admin --host 'mongodb-0.mongodb-headless.default.svc.cluster.local:27017,mongodb-1.mongodb-headless.default.svc.cluster.local:27017,mongodb-2.mongodb-headless.default.svc.cluster.local:27017'
...
rs0 [primary] admin> use sth_fiware_camera
rs0 [primary] sth_fiware_camera> db.sth_x002f.find()
[
{
_id: ObjectId("62b86cce266c7040087246bd"),
entityId: 'camera01',
entityType: 'camera',
path: 'photos/2022-06-26T23_27_22.170270.jpg',
created_at: ISODate("2022-06-26T14:27:22.170Z"),
location: { type: 'Point', coordinates: [ 139.932983435, 37.487650993 ] },
recvTime: ISODate("2022-06-26T14:27:24.735Z")
},
{
_id: ObjectId("62b86ebc370e400b96d1a443"),
entityId: 'camera01',
entityType: 'camera',
path: 'photos/2022-06-26T23_35_37.381996.jpg',
created_at: ISODate("2022-06-26T14:35:37.381Z"),
location: { type: 'Point', coordinates: [ 139.932983435, 37.487650993 ] },
recvTime: ISODate("2022-06-26T14:35:39.858Z")
},
{
_id: ObjectId("62b86eeb266c7040087246be"),
entityId: 'camera01',
entityType: 'camera',
path: 'photos/2022-06-26T23_36_21.931998.jpg',
created_at: ISODate("2022-06-26T14:36:21.931Z"),
location: { type: 'Point', coordinates: [ 139.932983435, 37.487650993 ] },
recvTime: ISODate("2022-06-26T14:36:24.368Z")
}
]
总结
为了测试,我在Azure AKS上将FIWARE和Azure Blob Storage进行了集成,以便存储监视摄像头捕获的图像和拍摄记录。尽管这次测试只是简单地记录了数据,但是如果将FIWARE Orion配置为不仅仅调用Cygnus还调用图像分析程序,那么就可以建立一个在监视摄像头拍摄到可疑物体时进行报警的系统。
根据FIWARE的特点,巧妙地利用它,让我们一起过上美好的FIWARE生活吧!
参考:验证过的环境的信息
Azure DNS
FIWARE Orion2.4.0FIWARE Cygnus2.15.0MongoDB4.2.7Kong2.8.1監視カメラRaspberry Pi 3Model B Plus Rev 1.3USBカメラLOGICOOL C270nRaspbian GNU/Linux 11 (bullseye)5.15.32-v7+ #1538python3.10.5opencv-python4.6.0azure-storage-blob12.12.0requests2.28.0
参考来源:FIWARE基金会,FIWARE目录,https://github.com/FIWARE/catalogue↩Kurento和OpenVidu是通过WebRTC将摄像头和麦克风(视频和音频的传输源)直接连接到浏览器(播放设备),实时传输视频和音频的组件。可以在视频传输过程中插入图像分析和通信处理,在摄像头拍摄的汽车车牌上读取文本数据并将其注册到FIWARE Orion等等。但是,实时视频传输的基础设施准备和实时图像分析、通信处理的实施非常困难。
由于本次未获得GNSS模块,获取位置信息的实现是虚拟的。