跳到主要内容

使用EMQX与Shifu实现设备联动

· 阅读需 5 分钟

EMQX 是一个在世界范围内非常受欢迎的 MQTT Broker。它拥有基于 Kubernetes 的云原生架构,使得自身能力极为适合当今越来越复杂的物联网场景,让设备消息的传输更为高效。因此,Shifu 作为 Kubernetes 原生的框架,可以与 EMQX 完美结合,为 EMQX 提供智能的多协议设备联动的能力。

简介

本文将介绍如何在集群内部署 EMQXShifu,接入一个以 MQTT 为通信方式的温度计和一个以 RTSP 为传输协议的海康威视摄像头,并加入一个应用与 Shifu 进行交互,使得每次温度计检测到超过37度的体温就会让摄像头拍下一张当前照片。

本文使用的简单架构如下:

准备

本文使用了如下服务和工具:

  1. Kubernetes: 1.20.10
    • kubectl
    • kubeadm
    • kubelet
  2. Golang: 1.16.10
  3. Docker: 19.03.9
  4. EMQX: 4.1-rc1

第一步 部署Kubernetes

本步可以参考 Kubernetes 的官方教程进行部署:

https://kubernetes.io/docs/setup/

在部署完成后我们应当看到终端打印出如下信息:

第二步 部署Shifu

Shifu 的 GitHub仓库 克隆到本地:

git clone https://github.com/Edgenesis/shifu.git

然后可以通过下列命令部署 Shifu

kubectl apply -f shifu/pkg/k8s/crd/install/shifu_install.yml

部署完成后我们应当看到 ShifuCRD controller 已经完成部署:

第三步 部署EMQX

首先需要安装 EMQX Operator Controller

$ curl -f -L "https://github.com/emqx/emqx-operator/releases/download/1.1.6/emqx-operator-controller.yaml" | kubectl apply -f -

接着我们写一个最简单的 deployment.yaml

然后就可以部署一个 EMQX 了:

kubectl apply –f deployment.yaml

第四步 接入设备

对于温度计,我们只需要调整它的 MQTT 设置,让其可以向 EMQX 发布 MQTT 信息即可。

(如果是集群外的温度计,我们可以通过 Kubernetes Service 来开放 External IP 供访问)

对于摄像头,Shifu 的仓库已经包括一个使用 RTSP 的海康威视摄像头的配置文件,我们可以轻松更改配置文件中的IP、用户名、密码,将它接入 Shifu

至此,我们的设备已经连接完毕,下面就可以开始联动了。

联动应用

我们简单写一个 Python 应用,用来实现下面的逻辑:

该应用向 EMQX 订阅 temperature-shifu-mqtt 的消息,每次消息都只包括一个表示当前温度的数字;如果当前温度大于37度,则操作摄像头拍摄一张照片并保存在本地。

以下是应用代码:

加个 capture function 封装所有摄像头的动作。接着我们就可以将其部署到集群中,开始监视了:

python3 app.py 10.244.0.33

总结

本文描述了如何让 EMQXShifu 赋予更高效的 MQTT Broker 能力,同时让ShifuMQTT 合作为设备提供联动能力。在现实的应用场景之中,我们可以使用一个仅需一百余元的的红外温度计+摄像头组合,来代替数千元且表现并不稳定的测温摄像头,在大规模部署的情况下节省巨额成本。