EMQX 学习

1:概览

EMQX (Erlang/Enterprise/Elastic MQTT Broker) 是基于 Erlang/OTP 平台开发的开源物联网 MQTT 消息服务器。
Erlang/OTP是出色的软实时 (Soft-Realtime)、低延时 (Low-Latency)、分布式 (Distributed)的语言平台。
MQTT 是轻量的 (Lightweight)、发布订阅模式 (PubSub) 的物联网消息协议。
EMQX 设计目标是实现高可靠,并支持承载海量物联网终端的 MQTT 连接,支持在海量物联网设备间低延时消息路由:
1:稳定承载大规模的 MQTT 客户端连接,单服务器节点支持 200 万连接。
2:分布式节点集群,快速低延时的消息路由。
3:消息服务器内扩展,支持定制多种认证方式、高效存储消息到后端数据库。
4:完整物联网协议支持,MQTT、MQTT-SN、CoAP、LwM2M、WebSocket 或私有协议支持。

2:EMQX 消息服务器功能列表

1:完整的 MQTT V3.1/V3.1.1 及 V5.0 协议规范支持
	1.1:QoS0, QoS1, QoS2 消息支持
	1.2:持久会话与离线消息支持
	1.3:Retained 消息支持
	1.4:Last Will 消息支持
2:MQTT/WebSocket TCP/SSL 支持
3:HTTP 消息发布接口支持
4:$SYS/# 系统主题支持
5:客户端在线状态查询与订阅支持
6:客户端 ID 或 IP 地址认证支持
7:用户名密码认证支持
8:LDAP、Redis、MySQL、PostgreSQL、MongoDB、HTTP 认证集成
9:浏览器 Cookie 认证
10:基于客户端 ID、IP 地址、用户名的访问控制 (ACL)
11:多服务器节点集群 (Cluster)
12:支持 manual、mcast、dns、etcd、k8s 等多种集群发现方式
13:网络分区自动愈合
14:消息速率限制
15:连接速率限制
16:按分区配置节点
17:多服务器节点桥接 (Bridge)
18:MQTT Broker 桥接支持
19:Stomp 协议支持
20:MQTT-SN 协议支持
21:CoAP 协议支持
22:LwM2M 协议支持
23:Stomp/SockJS 支持
24:延时 Publish ($delay/topic)
25:Flapping 检测
26:黑名单支持
27:共享订阅 ($share/:group/topic)
28:TLS/PSK 支持
29:规则引擎
	29.1:空动作 (调试)
	29.2:消息重新发布
	29.3:桥接数据到 MQTT Broker
	29.4:检查 (调试)
	29.5:发送数据到 Web 服务

3:Start Apply

EMQX 提供开源版和企业版下载安装,也提供了全托管的 MQTT 云服务 EMQX Cloud,您可以选择合适您的部署方式,快速开始使用。

3.1:EMQX 开源版

大规模可弹性伸缩的云原生分布式物联网 MQTT 消息服务器,高效可靠连接海量物联网设备,高性能实时处理消息与事件流数据,助力构建关键业务的物联网平台与应用。

1:基于 APL 2.0 开放源码协议
2:完整 MQTT 3.x 和 5.0 规范
3:Masterless 高可用集群架构
4:高并发、低时延、高性能
5:可扩展的网关和插件体系

地址:https://www.emqx.io/zh/downloads

3.2:EMQX Cloud

通过可靠、实时的物联网数据移动、处理和集成,连接您的海量物联网设备。加快您的物联网应用开发,免除基础设施管理维护负担。

1:全托管的 MQTT 5.0 服务
2:基于 SQL 的 IoT 规则引擎
3:多种数据库与云服务集成
4:关键业务的高可用高可靠
5:在任何地方运行,随用随付

免费试用:https://www.emqx.com/zh/try?product=cloud

3.3:EMQX 企业版

「随处运行,无限连接,任意集成」 云原生分布式物联网接入平台,一体化的分布式 MQTT 消息服务和强大的 IoT 规则引擎,为高可靠、高性能的物联网实时数据移动、处理和集成提供动力,助力企业快速构建关键业务的 IoT 平台与应用。

1:标准或专有多协议支持
2:基于 SQL 的 IoT 规则引擎
3:数据持久化与数据桥接
4:管理与监控中心
5:7x24 小时技术支持服务

免费试用:https://www.emqx.com/zh/try?product=enterprise

4:安装 EMQX

# 在 EMQX Cloud 中运行
EMQX Cloud 是全球首个全托管的 MQTT 5.0 公有云服务。在 EMQX Cloud (opens new window)支持下,您可以在云上创建 EMQX 集群并使用 EMQX 企业版全部功能。这使您可以将更多的时间花费在业务对接上,而将较少的时间用于 EMQX 的运维和管理。

4.1:创建并登录 EMQX Cloud 账户

4.2:创建免费试用部署(opens new window)

5:Docker容器部署

EMQX 提供了一个容器镜像,您可以在 Docker Hub (opens new window)上了解该镜像的详细信息。通过容器化部署是快速开始体验 EMQX 的最快方式。

1:获取 Docker 镜像
[root@emqx ~]# docker pull emqx/emqx:latest
2:启动 Docker 容器
[root@emqx ~]# docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:latest

更多 Docker 安装、Docker Compose 快速搭建集群集群请参考:
# 通过 Docker 运行 (包含简单的 docker-compose 集群
https://www.emqx.io/docs/zh/v4.4/getting-started/install.html#%E9%80%9A%E8%BF%87-docker-%E8%BF%90%E8%A1%8C-%E5%8C%85%E5%90%AB%E7%AE%80%E5%8D%95%E7%9A%84-docker-compose-%E9%9B%86%E7%BE%A4

image

账号:admin
密码:public

6:Kubernetes_operator部署

对于使用 Kubernetes 的用户,EMQX 提供了, EMQX Kubernetes Operator(https://www.emqx.com/zh/emqx-kubernetes-operator)
该 Operator 可以帮助您在 Kubernetes 环境下快速部署一个可用于生产环境的,功能完备的 EMQX 集群。

EMQX Kubernetes Operator 是基于 Kubernetes 原生 API 的应用编排工具,用于 EMQX 集群的自动化部署和生命周期管理。您可以查阅文档 (https://github.com/emqx/emqx-operator/blob/main/docs/zh_CN/getting-started/getting-started.md))来了解如何使用 Operator 部署 EMQX。
# 准备
我们使用 cert manager来给 webhook 服务提供证书。你可以通过 cert manager 文档来安装。
# https://cert-manager.io/docs/installation/
[root@kubernetes-master-1 ~]# kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.8.0/cert-manager.yaml

1:默认静态安装
安装默认静态配置文件
curl -f -L "https://github.com/emqx/emqx-operator/releases/download/1.1.6/emqx-operator-controller.yaml" | kubectl apply -f -

2:通过 Helm 安装
# 添加 EMQX Helm 仓库
[root@kubernetes-master-1 ~]# helm repo add emqx https://repos.emqx.io/charts
"emqx" has been added to your repositories
[root@kubernetes-master-1 ~]# helm repo update
\Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "emqx" chart repository
Update Complete. ?𷱈appy Helming!?

# 用 Helm 安装 EMQX Operator 控制器

[root@kubernetes-master-1 ~]# helm install emqx-operator emqx/emqx-operator \
--set installCRDs=true \
--namespace emqx-operator-system \
--create-namespace

# 检查 EMQX Operator 控制器和Cert-Manager状态
[root@kubernetes-master-1 ~]# kubectl get pod -A
NAMESPACE              NAME                                                READY   STATUS    RESTARTS   AGE
cert-manager           cert-manager-6868fddcb4-2nfhz                       1/1     Running   0          2m5s
cert-manager           cert-manager-cainjector-6d6bbc7965-5mkbm            1/1     Running   0          2m5s
cert-manager           cert-manager-webhook-59f66d6c7b-55mfl               1/1     Running   0          2m5s
emqx-operator-system   emqx-operator-controller-manager-555ffd7dcd-5lf7q   1/1     Running   0          35s
---

# 部署 EMQX Broker
[root@kubernetes-master-1 emqx]# cat emqx.broker.yaml 
apiVersion: apps.emqx.io/v1beta2
kind: EmqxBroker
metadata:
  name: emqx
spec:
  image: emqx/emqx:4.4.0
[root@kubernetes-master-1 emqx]# kubectl apply -f emqx.broker.yaml 
# 查看 EMQX Broker  (这里默认就是集群,StatusfulSet部署集群)
[root@kubernetes-master-1 emqx]# kubectl get pod
NAME     READY   STATUS    RESTARTS   AGE
emqx-0   1/1     Running   0          117s
emqx-1   1/1     Running   0          117s
emqx-2   1/1     Running   0          117s

# 检查集群
[root@kubernetes-master-1 emqx]# kubectl exec -it emqx-0 -- emqx_ctl status
Node 'emqx@emqx-0.emqx-headless.default.svc.cluster.local' 4.4.0 is started
[root@kubernetes-master-1 emqx]# kubectl exec -it emqx-0 -- emqx_ctl cluster status
Cluster status: #{running_nodes =>
                      ['emqx@emqx-0.emqx-headless.default.svc.cluster.local',
                       'emqx@emqx-1.emqx-headless.default.svc.cluster.local',
                       'emqx@emqx-2.emqx-headless.default.svc.cluster.local'],
                  stopped_nodes => []}

# 暴露Web提供操作
[root@kubernetes-master-1 emqx]# cat emqx-ingress.yaml 
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: emqx
spec:
  ingressClassName: nginx
  rules:
  - host: emqx.kubernetes-devops.cn
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service: 
            name: emqx
            port: 
              number: 18083
[root@kubernetes-master-1 emqx]# kubectl apply -f emqx-ingress.yaml 
[root@kubernetes-master-1 emqx]# kubectl get ingress
NAME   CLASS   HOSTS                       ADDRESS     PORTS   AGE
emqx   nginx   emqx.kubernetes-devops.cn   10.0.0.11   80      25s

# 测试访问

image

image

从上面可以看出,是集群

7:Terraform 安装部署

通过 Terraform 在主流公有云上一键部署包含 EMQX Enterprise 集群在内的所有基础设施。在公有云上部署 EMQX Enterprise 集群最快捷的方式:

1:在阿里云上部署(https://github.com/emqx/tf-alicloud)
2:在 AWS 上部署(https://github.com/emqx/tf-aws)
更多有关 Terraform 安装部署的信息请参考(EMQX Terraform:https://www.emqx.com/zh/emqx-terraform)

8:在虚拟机或物理机中运行

EMQX 可以直接部署在物理服务器或者虚拟机上。最小仅需 2 核 4G 的机器即可运行 EMQX 程序。可支持 CentOS, Debian, Ubuntu, MacOS 等操作系统。

1:Shell 脚本一键安装:https://www.emqx.io/docs/zh/v4.4/getting-started/install.html#shell-%E8%84%9A%E6%9C%AC%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85-linux
2:CentOS 系统安装:https://www.emqx.io/docs/zh/v4.4/getting-started/install.html#centos
3:Ubuntu、Debian 安装:https://www.emqx.io/docs/zh/v4.4/getting-started/install.html#ubuntu%E3%80%81debian
4:MacOS、Windows、Linux ZIP 包安装:https://www.emqx.io/docs/zh/v4.4/getting-started/install.html#zip-%E5%8E%8B%E7%BC%A9%E5%8C%85%E5%AE%89%E8%A3%85-linux%E3%80%81maxos%E3%80%81windows

如果您需要 FreeBSD、国产硬件平台以及操作系统适配(如麒麟、深度、红旗等)或其他 Linux 发行版安装包,可参考(https://www.emqx.io/docs/zh/v4.4/getting-started/install.html#%E6%BA%90%E7%A0%81%E7%BC%96%E8%AF%91%E5%AE%89%E8%A3%85)
# 启动 EMQX
安装成功后,可通过 systemctl 或 emqx 命令来启动 EMQX,更多启动方式和注意事项参考 启动 EMQX。
EMQX 成功启动之后可以通过浏览器打开http://IP:18083 

# 后台启动 EMQX
[root@emqx ~]# emqx start
# 启动成功后可以使用 emqx ping 命令检测节点运行状态,返回 pong 则表示正常运行:
[root@emqx ~]# emqx ping
# systemctl 启动
[root@emqx ~]# sudo systemctl start emqx
# 检查服务是否正常工作
[root@emqx ~]# sudo systemctl status emqx

# ZIP 安装包启动
切换到 EMQX 解压目录,执行以下命令启动 EMQX:
[root@emqx ~]# ./bin/emqx start
# 开发模式下可以使用 console 命令在控制台启动 EMQX,该模式可以实时查看 EMQX 启动和运行输出日志信息:
[root@emqx ~]# ./bin/emqx console

9:EMQX 快速体验

EMQX 提供了标准的 MQTT 协议支持,启动后即可接入 MQTT 客户端,您可以使用以下客户端工具或客户端库接入 EMQX 进行消息通信以完成某些场景或功能的测试验证。

# Dashboard Websocket 工具
打开 Dashboard,进入 工具 -> Websocket 页面中可以使用 MQTT over Websokcet 客户端快速接入 EMQX。
Websocket 页面为您提供了一个简易但有效的 WebSocket 客户端工具,它包含了连接、订阅和发布功能,同时还能查看自己发送和接收的报文数据。

image

10:MQTT X 桌面客户端工具

MQTT X 是一款优雅的跨平台 MQTT 5.0 开源桌面客户端工具,支持在 macOS, Linux 和 Windows 上运行。
MQTT X 有诸多特性,提供了简洁的图形界面和操作逻辑,支持 MQTT/MQTT over Websocket 接入以及单/双向 SSL 认证,同时支持 Payload 格式转换、自定义脚本模拟测试数据、 $SYS 主题自动订阅查看流量统计等诸多实用功能。
下载与使用可参考:MQTT X 官网(https://mqttx.app/zh)

image

# EMQX 客户端库
以下是各个编程语言中热门 MQTT 客户端库介绍说明,各个库的连接(包含 TLS 连接)、发布、订阅、取消订阅基本功能代码示例。

# 客户端库介绍
1:MQTT C 客户端库(https://www.emqx.io/docs/zh/v4.4/development/c.html)
2:MQTT Java 客户端库(https://www.emqx.io/docs/zh/v4.4/development/java.html)
3:MQTT Go 客户端库(https://www.emqx.io/docs/zh/v4.4/development/go.html)
4:MQTT Erlang 客户端库(https://www.emqx.io/docs/zh/v4.4/development/erlang.html)
5:MQTT JavaScript 客户端库(https://www.emqx.io/docs/zh/v4.4/development/javascript.html)
6:MQTT Python 客户端库(https://www.emqx.io/docs/zh/v4.4/development/python.html)
7:MQTT 微信小程序接入(https://www.emqx.io/docs/zh/v4.4/development/wechat-miniprogram.html)

11: 进阶操作

完成基本的安装、启动、接入测试之后,您可以继续阅读以下操作文档进行进阶操作配置。

# 认证鉴权
身份认证与是大多数应用的重要组成部分,启用身份认证能有效阻止非法客户端的连接。发布订阅 ACL 可以对客户端发布 /订阅操作进行权限控制。

1:认证简介(https://www.emqx.io/docs/zh/v4.4/advanced/auth.html):选择内置插件、外部数据库、JWT 或者 HTTP 服务作为认证数据源,验证客户端连接合法性。
2:发布订阅 ACL(https://www.emqx.io/docs/zh/v4.4/advanced/acl.html):选择内置插件、外部数据库、或者 HTTP 服务作为 ACL 数据源,验证客户端发布订阅权限。


# 规则引擎
基于 SQL 的内置规则引擎可以实时提取、过滤、丰富和转换设备与业务系统之间的 IoT 数据,无需编写代码即可将物联网数据转发到 Webhook、其他 MQTT Broker 中,在企业版中还能够与 Kafka、各类 SQL / NoSQL / 时序数据库以及 SAP 等企业系统集成。

1:规则引擎(https://www.emqx.io/docs/zh/v4.4/rule/rule-engine.html):规则引擎的概念、基础使用方式。
2:创建规则(https://www.emqx.io/docs/zh/v4.4/rule/rule-create.html):如何创建一条规则。
3:使用示例(https://www.emqx.io/docs/zh/v4.4/rule/rule-example.html#%E5%8F%91%E9%80%81%E6%95%B0%E6%8D%AE%E5%88%B0-web-%E6%9C%8D%E5%8A%A1):规则引擎使用各类数据源的教程。


# HTTP API
HTTP API 是物联网平台开发与 EMQX 运维中频繁使用的功能,HTTP API 可以实现与外部系统的集成,例如查询并管理客户端信息、代理订阅、发布消息和创建规则等。

1:HTTP API(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html	):包含 HTTP API 接入点、接入认证方式。
2:基本信息(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html#endpoint-brokers):获取 EMQX 版本、运行状态等基本信息。
3:节点(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html#endpoint-nodes):获取 EMQX 节点信息。
4:客户端(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html#endpoint-clients):查看在线客户端信息,支持踢出客户端
5:订阅信息(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html#endpoint-subscriptions):查看订阅主题列表与订阅关系。
6:路由(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html#endpoint-routes):查看已订阅的主题。
7:消息发布(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html#endpoint-publish):通过 HTTP 调用 EMQX 发布 MQTT 消息,应用程序与客户端通信可靠的方式。	
8:主题订阅(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html#endpoint-subscribe):动态管理客户端订阅列表,无需客户端主动发起订阅/取消订阅。
9:插件(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html#endpoint-plugins):插件的状态管理,启动、停止操作。

接入认证方式以及更多 API 请查看 HTTP API(https://www.emqx.io/docs/zh/v4.4/advanced/http-api.html#%E6%95%B0%E6%8D%AE%E9%81%A5%E6%B5%8B)

# 运维部署
包含官方使用指南、最佳实践等信息。

1:设备管理(https://www.emqx.io/docs/zh/v4.4/tutorial/device-management.html)
2:系统调优(https://www.emqx.io/docs/zh/v4.4/tutorial/tune.html)
3:生产部署(https://www.emqx.io/docs/zh/v4.4/tutorial/deploy.html)
4:Prometheus 监控告警(https://www.emqx.io/docs/zh/v4.4/tutorial/prometheus.html)
5:性能测试(https://www.emqx.io/docs/zh/v4.4/tutorial/benchmark.html)

12:常见问题

FAQ 常见问题解答(https://www.emqx.io/docs/zh/v4.4/faq/faq.html) 定期收集整理 EMQX 用户常见问题和经常遇到的错误,如 Topic 数量限制、外部资源连接错误、启动失败原因等。

除此之外,您可以访问 EMQ 问答社区 (https://askemq.com/)参与交流,提出、解答 EMQX 以及 EMQ 相关产品使用问题,与 EMQX 用户交流物联网相关技术的使用经验。

13:如何在Python使用它

Python 是一种广泛使用的解释型、高级编程、通用型编程语言。Python 的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。Python 让开发者能够用更少的代码表达想法,不管是小型还是大型程序,该语言都试图让程序的结构清晰明了

MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 ,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。

本文主要介绍如何在 Python 项目中使用 paho-mqtt 客户端库 ,实现客户端与 MQTT 服务器的连接、订阅、取消订阅、收发消息等功能。
# 确认Python版本
PS E:\Pycharm Professional\emqx> python --version
Python 3.9.5

# 选择 MQTT 客户端库
paho-mqtt 是目前 Python 中使用较多的 MQTT 客户端库,它在 Python 2.7 或 3.x 上为客户端类提供了对 MQTT v3.1 和 v3.1.1 的支持。它还提供了一些帮助程序功能,使将消息发布到 MQTT 服务器变得非常简单。

# Pip 安装 Paho MQTT 客户端
Pip 是 Python 包管理工具,该工具提供了对 Python 包的查找、下载、安装、卸载的功能。

# Python MQTT 使用
# 连接 MQTT 服务器,服务器接入信息如下:
Broker: emqx.kubernetes-devops.cn
TCP Port: 31852
Websocket Port:30599

# 导入 Paho MQTT客户端
from paho.mqtt import client as mqtt_client

# 设置 MQTT Broker 连接参数
设置 MQTT Broker 连接地址,端口以及 topic,同时我们调用 Python random.randint 函数随机生成 MQTT 客户端 id。

# 编写 MQTT 连接函数
编写连接回调函数 on_connect,该函数将在客户端连接后被调用,在该函数中可以依据 rc 来判断客户端是否连接成功。通常同时我们将创建一个 MQTT 客户端,该客户端将连接到 emqx.kubernetes-devops.cn

def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)
    # Set Connecting Client ID
    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client
    
# 发布消息
首先定义一个 while 循环语句,在循环中我们将设置每秒调用 MQTT 客户端 publish 函数向 /python/mqtt 主题发送消息。
def publish(client):
    msg_count = 0
    while True:
        time.sleep(1)
        msg = f"messages: {msg_count}"
        result = client.publish(topic, msg)
        # result: [0, 1]
        status = result[0]
        if status == 0:
            print(f"Send `{msg}` to topic `{topic}`")
        else:
           print(f"Failed to send message to topic {topic}")
        msg_count += 1

# 订阅消息
编写消息回调函数 on_message,该函数将在客户端从 MQTT Broker 收到消息后被调用,在该函数中我们将打印出订阅的 topic 名称以及接收到的消息内容。

def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")

    client.subscribe(topic)
    client.on_message = on_message
    
# 完整代码
# 消息发布代码

from paho.mqtt import client as mqtt_client
import random,time
broker = 'emqx.kubernetes-devops.cn'
port = 31852
topic = "/python/mqtt"
client_id = f'python-mqtt-{random.randint(0, 1000)}'

def connect_mqtt():
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def publish(client):
    msg_count = 0
    while True:
        time.sleep(1)
        msg = f"messages: {msg_count}"
        result = client.publish(topic, msg)
        # result: [0, 1]
        status = result[0]
        if status == 0:
            print(f"Send `{msg}` to topic `{topic}`")
        else:
            print(f"Failed to send message to topic {topic}")
        msg_count += 1


def run():
    client = connect_mqtt()
    client.loop_start()
    publish(client)


if __name__ == '__main__':
    run()

# 消息订阅代码
import random
from paho.mqtt import client as mqtt_client
broker = 'emqx.kubernetes-devops.cn'
port = 31852
topic = "/python/mqtt"
client_id = f'python-mqtt-{random.randint(0, 1000)}'


def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        print(f"Received `{msg.payload.decode()}` from `{msg.topic}` topic")

    client.subscribe(topic)
    client.on_message = on_message


def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()


if __name__ == '__main__':
    run()
posted @ 2022-05-29 03:04  Layzer  阅读(311)  评论(0编辑  收藏  举报