消息通讯——MQTT WebHookSpringBoot案例

目录

  • EMQX WebHook介绍
    • EMQX WebHook是什么
    • EMQX WebHook配置项
    • 如何使用EMQX WebHook配置
    • WebHook配置事件推送参数详解
  • SpringBoot集成Webhook实现客户端断连监控
    • 1. 实现前提
    • 2. 代码实现接口
    • 3. 监听结果
  • 总结

EMQX WebHook介绍

EMQX WebHook是什么

EMQX WebHook 是由 emqx_web_hook (opens new window)插件提供的将EMQX中的钩子事件通知到某个Web服务的功能。
WebHook 的内部实现是基于钩子,借助 Webhook 可以完成设备在线、上下线记录,订阅与消息存储、消息送达确认等诸多业务。

它通过在钩子上的挂载回调函数,获取到 EMQX 中的各种事件,并转发至 emqx_web_hook 中配置的 Web 服务器。

以 客户端成功接入(client.connected) 事件为例,其事件的传递流程如下:

    Client      |    EMQX     |  emqx_web_hook |   HTTP       +------------+
  =============>| - - - - - - -> - - - - - - - ->===========>  | Web Server |
                |    Broker    |                |  Request     +------------+

注意:WebHook 对于事件的处理是单向的,它仅支持将 EMQX 中的事件推送给 Web 服务,并不关心 Web 服务的返回。

EMQX WebHook配置项

Webhook 的配置文件位于 etc/plugins/emqx_web_hook.conf,配置项的详细说明可以查看官方文档配置

在默认etc/plugins/emqx_web_hook.conf中,官方为我们提供了如下的配置触发规则:

##====================================================================
## WebHook
##====================================================================

web.hook.api.url = http://127.0.0.1:80

## Format:
##   web.hook.rule.<HookName>.<No> = <Spec>
#web.hook.rule.client.connect.1       = {"action": "on_client_connect"}
#web.hook.rule.client.connack.1       = {"action": "on_client_connack"}
#web.hook.rule.client.connected.1     = {"action": "on_client_connected"}
#web.hook.rule.client.disconnected.1  = {"action": "on_client_disconnected"}
#web.hook.rule.client.subscribe.1     = {"action": "on_client_subscribe"}
#web.hook.rule.client.unsubscribe.1   = {"action": "on_client_unsubscribe"}
#web.hook.rule.session.subscribed.1   = {"action": "on_session_subscribed"}
#web.hook.rule.session.unsubscribed.1 = {"action": "on_session_unsubscribed"}
#web.hook.rule.session.terminated.1   = {"action": "on_session_terminated"}
#web.hook.rule.message.publish.1      = {"action": "on_message_publish"}
#web.hook.rule.message.delivered.1    = {"action": "on_message_delivered"}
#web.hook.rule.message.acked.1        = {"action": "on_message_acked"}

其中webhook支持的事件如下:
20231115-144152-B5.png

如何使用EMQX WebHook配置

  1. 手动修改Webhook的配置文件位于:etc/plugins/emqx_web_hook.conf.
    修改配置非常简单,打开指定文件后,官方已经写好这些了,如上面所示,
    只需要修改web.hook.url,和在你需要的钩子事件前的#号去掉即可

  2. emqx 启用插件 webhook插件(emqx有web控制台,在插件里启用就可以)
    20231115-145554-C0.png
    刷新后emqx_web_hook插件运行中即启动成功

  3. 然后就是自行搭建一个web接口服务,当客户端有指定事件后会主动推送,
    接口地址即为Webhook的配置文件中配置的web.hook.api.url

WebHook配置事件推送参数详解

  1. client.connect(处理连接报文)
    20231115-150054-c3.png

  2. client.connack(下发连接应答)
    20231115-150122-uT.png

  3. client.connected(成功接入)
    20231115-150142-3W.png

  4. client.disconnected(连接断开)
    20231115-150202-Fu.png

  5. client.subscribe(订阅主题)
    20231115-150231-HQ.png

  6. client.unsubscribe(取消订阅)
    20231115-150348-Fz.png

  7. session.subscribed(会话订阅主题)
    同 client.subscribe,action 为 session_subscribed

  8. session.unsubscribed(会话取消订阅)
    同 client.unsubscribe,action 为 session_unsubscribe

  9. message.publish(消息发布)
    20231115-150421-nh.png

  10. message.delivered(消息投递)
    20231115-150443-Hy.png

  11. message.acked(消息回执)
    20231115-150506-wg.png

SpringBoot集成Webhook实现客户端断连监控

通过使用Emqx的Webhook插件实现监控所有客户端的连接状态,并做出客户端上线和下线后的逻辑处理

1. 实现前提

修改 etc/plugins/emqx_web_hook.conf 文件,设置事件转发的url和地址和触发规则

# 事件需要转发的目的服务器地址
web.hook.api.url = http://127.0.0.1:8000/api/mqtt/webhook

# 打开下面两个触发规则
web.hook.rule.client.connected.1     = {"action": "on_client_connected"}
web.hook.rule.client.disconnected.1  = {"action": "on_client_disconnected"}

2. 代码实现接口

通过EMQX 的webhook将客户端的连接断开等事件通知到我们自建的服务上,通过事件类型获取客户端的连接状态,然后将客户端的连接状态进行存储,并且提供HTTP API供后台系统查询所有客户端的状态。

package com.team.modules.mqtt.controller;

import com.google.gson.Gson;
import com.team.modules.mqtt.client.MyMQTTClient;
import com.team.modules.mqtt.service.SenderService;
import com.team.modules.system.domain.vo.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.Map;

@RestController
@Slf4j
@RequestMapping("/api/mqtt")
public class SenderController {

    @Autowired
    private MyMQTTClient myMQTTClient;

    @PostMapping("/webhook")
    public void webhook(@RequestBody() Map<String, Object> message) {
// 监听连接的上线和下线
        System.out.println("收到的消息:" + message);

        String action = (String) message.get("action");
        String clientid = (String) message.get("clientid");
        if (action.equals("client_connected")) {
            log.info("client:{} 上线", clientid);
        }
        if (action.equals("client_disconnected")) {
            log.info("client:{} 下线", clientid);
        }
    }
}

3. 监听结果

启动服务后,模拟客户端连接emqx,查看服务记录的日志:
20231115-152113-Xu.png
20231115-152127-Cg.png

总结

由此看出客户端建立连接和断开连接后,Emqx服务都会给配置的接口web.hook.api.url = http://127.0.0.1:8000/api/mqtt/webhook发送一条数据,该数据字段可以参考上述的:WebHook配置事件推送参数详解。使用此方法可以将mqtt应用的更加灵活。其他的监听事件配置也类似,遇到合适场景可以自行发挥。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/149568.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型概述|亚马逊这些互联网公司为什么花巨资训练自己的模型?

2023年可谓是大语言模型元年&#xff0c;OpenAI、亚马逊、谷歌等互联网公司争先恐后推出了自己的大语言模型&#xff1a;GPT-4、Titan、PaLM 2&#xff0c;还有亚马逊即将推出的第二个大语言模型Olympus等等。这一革命性技术如今已经在全球范围内引发了广泛的讨论和关注&#x…

保姆级fastDFS安装教程

一、软件准备 环境需要准备四个包&#xff0c;分别是&#xff1a; 1. libfastcommon_1.0.36 2. FastdfsFastdfs_v5.11 3. fastdfs-nginx-module5.11 4. nginxnginx-1.12.2 二、环境准备 安装perl环境&#xff0c;后续编译fastdfs会用到 yum -y install perl* yum -y ins…

Python武器库开发-flask篇之URL重定向(二十三)

flask篇之URL重定向(二十三) 通过url_for()函数构造动态的URL&#xff1a; 我们在flask之中不仅仅是可以匹配静态的URL&#xff0c;还可以通过url_for()这个函数构造动态的URL from flask import Flask from flask import url_forapp Flask(__name__)app.route(/) def inde…

为忙碌的软件工程师精心准备的编码面试准备材料,超过 100,000 人受益!

这是一个针对技术面试准备的手册。它收集了大量的面试问题和答案&#xff0c;涵盖了算法、系统设计、前端等主题&#xff0c;并且还在不断更新和完善中。 这个项目是“Tech Interview Handbook”&#xff0c;解决了求职者在技术面试中遇到的各种难题&#xff0c;帮助他们更好地…

Jenkins的一些其他操作

Jenkins的一些其他操作 1、代码仓库Gogs的搭建与配置 Gogs 是一款极易搭建的自助 Git 服务&#xff0c;它的目标在于打造一个最简单、快速和轻松的方式搭建 Git 服务。使用 Go 语言开发的它能够通过独立的二进制进行分发&#xff0c;支持了 Go 语言支持的所有平台&#xff0…

vivado产生报告阅读分析-Report Power4

在布线后会生成“ Power Report ” &#xff08; 功耗报告 &#xff09;&#xff0c; 它基于当前器件工作条件和设计的切换率来报告功耗详情。功耗分析要求网表已完成综合或设计已完成布局布线。 • set_operating_conditions 命令用于设置工作条件。 • set_switching_ac…

【深度学习】SimSwap: An Efficient Framework For High Fidelity Face Swapping 换脸,实战

代码&#xff1a;https://github.com/neuralchen/SimSwap 文章目录 摘要介绍RELATED WORK实验结论代码实操 SimSwap是一个高保真度人脸交换的高效框架。它将源脸的身份转移到目标脸上&#xff0c;同时保留目标脸的属性。该框架包括ID注入模块&#xff08;IIM&#xff09;&#…

【Python基础篇】标识符

博主&#xff1a;&#x1f44d;不许代码码上红 欢迎&#xff1a;&#x1f40b;点赞、收藏、关注、评论。 格言&#xff1a; 大鹏一日同风起&#xff0c;扶摇直上九万里。 文章目录 一 Python中的标识符二 Python中常见的关键字三 合法的标识符 一 Python中的标识符 定义&…

计算机视觉的应用16-基于pytorch框架搭建的注意力机制,在汽车品牌与型号分类识别的应用

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用16-基于pytorch框架搭建的注意力机制&#xff0c;在汽车品牌与型号分类识别的应用&#xff0c;该项目主要引导大家使用pytorch深度学习框架&#xff0c;并熟悉注意力机制模型的搭建&#xff0c;这个…

Spring Framework 核心容器详解:Core、Beans、Context 和 Expression Language 模块

Spring可能成为您的所有企业应用程序的一站式商店。但是&#xff0c;Spring是模块化的&#xff0c;允许您挑选适用于您的模块&#xff0c;而无需引入其他模块。下面的部分提供了Spring Framework中所有可用模块的详细信息。 Spring Framework提供了大约20个模块&#xff0c;可…

本地顺风车小程序源码系统 源码开源可二次开发 出行无忧:一键预约顺风车 带完整搭建教程

共享经济和互联网技术的发展。随着人们出行需求的不断增加&#xff0c;顺风车作为一种绿色、共享的出行方式&#xff0c;越来越受到广大用户的青睐。为了满足这种需求&#xff0c;本地顺风车小程序应运而生&#xff0c;为用户提供了一种方便、快捷、可靠的顺风车出行服务。 以…

栈和队列:队列

目录 队列概念&#xff1a; 队列&#xff1a; 先进先出&#xff1a; 与栈的区别&#xff1a; 队列的实现&#xff1a; 关于节点指针的封装&#xff1a; 初始化&#xff1a; 入队&#xff1a; 出队&#xff1a; 获取队头元素和获取队尾元素&#xff1a; 判断队列是…

如何以编程方式获取Android手机的电话号码?

在创建Android应用程序时,很多时候我们需要通过手机号码进行身份验证。为了增强用户体验,我们可以在移动系统中自动检测手机号码。因此,让我们开始一个android项目吧!我们将创建一个按钮,单击它时将获得一个手机号码并将其显示在 TextView 中。 分步实施 步骤 1:创建新项…

程序员突如其来的生日惊喜

不得不说&#xff0c;今天就是我的生日。也就是吹个蜡烛吃个蛋糕&#xff0c;但是我非常惊讶&#xff0c;我的博客在今天突然飙涨&#xff01; Top1 我自己看的时候都懵了&#xff0c;就是存了一下自己的程序&#xff0c;然后这个阅读&#xff0c;是真的出乎我的意料。我完全没…

掌握接口自动化测试,看这篇文章就够了,真滴简单

前言&#xff1a; 接口测试在我们测试工作当中&#xff0c;经常会遇到&#xff0c;对于接口自动化操作&#xff0c;也越来越多的公司进行实践起来了&#xff0c;市面上有很多工具可以做接口自动化比如&#xff1a;Postman、JMeter、SoapUI等。这一篇安静主要介绍通过代码的形式…

CCF CSP认证历年题目自练Day46

兄弟们记得去官网报名CSP认证。 题目 试题编号&#xff1a; 201709-3 试题名称&#xff1a; JSON查询 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 256.0MB 问题描述&#xff1a; 问题描述   JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式&#xff…

“大数据分析师”来了,提高职业含金量,欢迎来领

大数据分析师是指在不同行业中&#xff0c;专门从事相关数据的收集、整理、分析&#xff0c;并依据数据通过科学算法模型进行行业研究、评估和预测等工作的专项人才。应用行业涉及互联网信息技术企业、科研院校、金融行业、制造业、物流、生物医疗、农业等大数据相关行业。 常…

IDEA如何打断点调试

目录 1. 设置断点2. 调试3. 调试的基本操作3.1 step over3.2 step into 跟 Force step into3.3 step out3.4 resume program3.5 mute breakpoints3.6 view breakpoints3.6 条件断点 编写代码的时候&#xff0c;有时候我们需要跟踪代码的运行情况&#xff0c;使用断点调试就是一…

基于Vue+SpringBoot的农村物流配送系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统登录、注册界面2.2 系统功能2.2.1 快递信息管理&#xff1a;2.2.2 位置信息管理&#xff1a;2.2.3 配送人员分配&#xff1a;2.2.4 路线规划&#xff1a;2.2.5 个人中心&#xff1a;2.2.6 退换快递处理&#xff1a;…

【Machine Learning in R - Next Generation • mlr3】

本篇主要介绍mlr3包的基本使用。 一个简单的机器学习流程在mlr3中可被分解为以下几个部分&#xff1a; 创建任务 比如回归、分裂、生存分析、降维、密度任务等等挑选学习器&#xff08;算法/模型&#xff09; 比如随机森林、决策树、SVM、KNN等等训练和预测 创建任务 本次示…