使用RestTemplate调用EMQX API查询MQTT客户端列表信息

项目中集成mqtt客户端查询功能,使用到了EMQX api-v5,具体步骤:

一、准备工作

首先在EMQX dashboard中添加API 密钥
在这里插入图片描述
填写密钥名称,点击确定,会生成API KeySecret Key,保存起来备用。
在这里插入图片描述

二、配置文件

在springboot的配置文件中添加如下配置

spring:# mqtt 配置mqtt:api:# mqtt dashboard的访问地址host: http://xxx.xxx.xxx.xxx:18083# 上图中的apiKeyapiKey: xxxxxxxxxxxx# 上图中的secretKeysecretKey: xxxxxxxxxxxx
三、后端实现

创建配置类MqttApiConfig

@Data
@Configuration
@ConfigurationProperties(prefix = "spring.mqtt.api")
public class MqttApiConfig {private String host;private String apiKey;private String secretKey;
}

查询参数DeviceStatusRequest

@Data
public class DeviceStatusRequest {private String deviceId;private int pageNum = 1;private int pageSize = 20;
}

接收参数DeviceStatusInfo

@Data
public class DeviceStatusInfo {private Boolean connected;private String node;private Integer port;private Integer keepalive;private String ip_address;private String username;private String created_at;private String clientid;private String connected_at;private Boolean clean_start;
}

创建Controller的接口

@Slf4j
@RequestMapping("/mqtt/client")
@RestController
public class ClientController extends BaseController {@Resourceprivate MqttApiConfig mqttConfig;@Resourceprivate RestTemplate restTemplate;/*** 获取所有MQTT客户端列表*/private final String GET_ALL_MQTT_CLIENTS_URL = "%s/api/v5/clients?page=%s&limit=%s&fields=clientid,username,connected,ip_address,port,keepalive,clean_start,connected_at,node,disconnected_at,created_at";/*** 获取单个MQTT客户端状态信息*/private final String GET_MQTT_CLIENT_STATUS_URL = "%s/api/v5/clients?clientid=%s&fields=clientid,username,connected,ip_address,port,keepalive,clean_start,connected_at,node,disconnected_at,created_at";/*** 分页查询所有MQTT客户端** @return*/@GetMapping("/all")public PageResult<List<DeviceStatusInfo>> getClients(DeviceStatusRequest request) {String deviceId = request.getDeviceId();String url = String.format(GET_ALL_MQTT_CLIENTS_URL, mqttConfig.getHost(), request.getPageNum(), request.getPageSize());if (StringUtils.isNotBlank(deviceId)) {url = String.format(GET_MQTT_CLIENT_STATUS_URL, mqttConfig.getHost(), deviceId);}JSONObject object = exchange(url);if (object != null) {List<DeviceStatusInfo> list = JSONArray.parseArray(object.getString("data"), DeviceStatusInfo.class);JSONObject meta = object.getJSONObject("meta");Page<DeviceStatusInfo> page = new Page<>();page.addAll(list);page.setPageNum(meta.getInteger("page"));page.setPageSize(meta.getInteger("limit"));page.setTotal(meta.getLong("count"));return PageResult.success(page);}return new PageResult(500, "没有查询到数据");}private JSONObject exchange(String url) {HttpHeaders headers = new HttpHeaders();headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));headers.setBasicAuth(mqttConfig.getApiKey(), mqttConfig.getSecretKey(), StandardCharsets.UTF_8);HttpEntity entity = new HttpEntity<>(headers);ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);log.info("response=>{}", response);if (response.getStatusCode() == HttpStatus.OK && response.getBody() != null) {String body = response.getBody();return JSONObject.parseObject(body);}return null;}
四、前端实现
<template><div class="app-container"><el-form :model="queryParams" ref="queryForm" size="small" :inline="true" label-width="68px"><el-form-item label="客户端" prop="deviceId"><el-inputv-model="queryParams.deviceId"placeholder="请输入设备id"clearable@keyup.enter.native="handleQuery"style="width: 160px"/></el-form-item><el-form-item><el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button><el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button></el-form-item></el-form><el-table v-loading="loading" :data="list" style="width: 100%;"><el-table-column label="序号" type="index" align="center"/><el-table-column label="客户端ID" align="left" prop="clientid" min-width="180" :show-overflow-tooltip="true"/><el-table-column label="用户名" align="center" prop="username" min-width="150" :show-overflow-tooltip="true"/><el-table-column label="节点" align="left" prop="node" width="180" :show-overflow-tooltip="true"/><el-table-column label="连接状态" align="center" width="120"><template v-slot="scope"><el-tag :type="scope.row.connected ? 'success' : 'danger'">{{ scope.row.connected ? '已连接' : '未连接' }}</el-tag></template></el-table-column><el-table-column label="IP地址" align="left" prop="ip_address" min-width="150" :show-overflow-tooltip="true"><template v-slot="scope"><span>{{ scope.row.ip_address}}:{{scope.row.port}}</span></template></el-table-column><el-table-column label="心跳" align="center" prop="keepalive" width="120"/><el-table-column label="清除会话" align="center" width="120"><template v-slot="scope"><el-tag>{{ scope.row.clean_start }}</el-tag></template></el-table-column><el-table-column label="会话创建时间" align="center" width="180"><template v-slot="scope"><span>{{ parseTime(scope.row.created_at) }}</span></template></el-table-column><el-table-column label="连接时间" align="center" width="180"><template v-slot="scope"><span>{{ parseTime(scope.row.connected_at) }}</span></template></el-table-column></el-table><paginationv-show="total>0":total="total":page.sync="queryParams.pageNum":limit.sync="queryParams.pageSize"@pagination="getList"/></div>
</template><script>
import {getMqttClient} from "@/api/mqtt";export default {name: "MqttClient",data() {return {// 遮罩层loading: true,// 总条数total: 0,// 表格数据list: [],// 查询参数queryParams: {deviceId: undefined,pageNum: 1,pageSize: 20}};},created() {this.getList();},methods: {/** 查询登录日志列表 */getList() {this.loading = true;getMqttClient(this.queryParams).then(response => {this.list = response.data;this.total = response.count;this.loading = false;});},/** 搜索按钮操作 */handleQuery() {this.pageNum = 1;this.getList();},/** 重置按钮操作 */resetQuery() {this.resetForm("queryForm");this.handleQuery();},}
};
</script>
五、实现效果

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AWS Network Firewall - IGW方式配置只应许白名单域名出入站

参考链接 https://repost.aws/zh-Hans/knowledge-center/network-firewall-configure-domain-ruleshttps://aws.amazon.com/cn/blogs/networking-and-content-delivery/deployment-models-for-aws-network-firewall/ 1. 创建防火墙 选择防火墙的归属子网&#xff08;选择公有…

基于Hive和Hadoop的共享单车分析系统

本项目是一个基于大数据技术的共享单车分析系统&#xff0c;旨在为用户提供全面的单车使用信息和深入的出行行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以 S…

【JavaEE】http/https 超级详解

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f98a;一.定义 HTTP&#xff08;HyperText Transfer Protocol&#xff09;即超文本传输协议&#xff0c;他是应用非常广泛的应用层协议&#xff0c;是…

【C#】StructLayout的使用

StructLayout 属性在 C# 中主要用于定义结构体或类在内存中的布局方式&#xff0c;这对于与非托管代码&#xff08;例如通过 P/Invoke 调用的 Win32 API&#xff09;进行交互时非常重要。StructLayout 属性位于 System.Runtime.InteropServices 命名空间下。使用此属性可以确保…

C语言、Eazy_X——五子棋

//五子棋#include<graphics.h>#define board_size 20 #define pixel 600 int pr pixel / board_size; char board_data[board_size][board_size]; char current_piece o; int count 0;//检测指定玩家是否获胜 bool CheckWin(char c) {int i, j;//检查行for (i 0; i &…

线程池:线程池的实现 | 日志

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

【git lfs 问题记录】

报错如下 WARNING: error running /usr/lib/git-core/git ‘config’ ‘–includes’ ‘–global’ ‘–replace-all’ ‘filter.lfs.smudge’ ‘git-lfs smudge – %f’: ‘error: could not write config file /root/.gitconfig: Device or resource busy’ ‘exit status 4…

基于STM32的智能家居交互终端:使用FreeRTOS与MQTT协议的流程设计

一、项目概述 简要介绍项目的目标和用途 随着智能家居的普及&#xff0c;家庭智能交互终端成为提升居住体验的重要设备。本文将介绍一个基于STM32的家庭智能交互终端的设计与实现&#xff0c;该终端能够通过触摸屏、语音识别和传感器数据采集等功能&#xff0c;提供家庭环境监…

数值计算的程序设计问题举例

### 数值计算的程序设计问题 #### 1. 结构静力分析计算 **涉及领域**&#xff1a;工程力学、建筑工程 **主要问题**&#xff1a;线性代数方程组&#xff08;Linear Algebraic Equations&#xff09; **解释说明**&#xff1a; 在结构静力分析中&#xff0c;我们需要解决复杂的…

linux系统解压zip文件名乱码

这是 zip 格式本身的缺陷导致的。zip 格式并没有指定文件名的编码格式&#xff0c;在压缩和解压时均使用操作系统本地编码&#xff0c;Windows 下简体中文为 GBK/GB2312 编码&#xff0c;Linux 下为 UTF-8 编码&#xff0c;两者不一致就造成了乱码。 解决方案&#xff1a; 如…

C++:类中的特殊关键字,运算重载符

1.My_string类中重载以下的运算符&#xff1a; 、[] 、>、<、、>、<、&#xff01;、、输入输出(>>、<<) 主函数&#xff1a; #include <iostream> #include "my_string.h"using namespace std;int main() {My_string s1("cat…

基于SpringBoot+Vue的个人健康管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【STM32-HAL库】自发电型风速传感器(使用STM32F407ZGT6)(附带工程下载链接)

一、自发电型风速传感器介绍 自发电型风速传感器&#xff0c;也称为风力发电型风速传感器或无源风速传感器&#xff0c;是一种不需要外部电源即可工作的风速测量设备。这种传感器通常利用风力来驱动内部的发电机构&#xff0c;从而产生电能来供电测量风速的传感器部分。以下是自…

GS-SLAM论文阅读笔记--GEVO

前言 这篇文章看着就让人好奇。众所周知&#xff0c;高斯是一个很不错的建图方法&#xff0c;但是本文的题目居然是只用高斯进行单目VO&#xff0c;咱也不知道这是怎么个流程&#xff0c;看了一下作者来自于MIT&#xff0c;说不定是个不错的工作&#xff0c;那就具体看看吧&am…

springboot实战学习(10)(ThreadLoacl优化获取用户详细信息接口)(重写拦截器afterCompletion()方法)

接着学习。之前的博客的进度&#xff1a;完成用户模块的注册接口的开发以及注册时的参数合法性校验、也基本完成用户模块的登录接口的主逻辑的基础上、JWT令牌"的组成与使用、完成了"登录认证"&#xff08;生成与验证JWT令牌&#xff09;以及完成获取用户详细信…

APISIX 联动雷池 WAF 实现 Web 安全防护

Apache APISIX 是一个动态、实时、高性能的云原生 API 网关&#xff0c;提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。 雷池是由长亭科技开发的 WAF 系统&#xff0c;提供对 HTTP 请求的安全请求&#xff0c;提供完整的 API 管理和…

解决 Sqoop 导入 Hive 时时间字段精度丢失问题

目录 一、背景介绍 二、问题描述 三、问题原因 四、解决方案 五、结论 一、背景介绍 介绍 Sqoop 数据导入过程&#xff0c;尤其是从 MySQL 导入 Hive 的场景。说明 MySQL 和 Hive 的数据类型差异&#xff0c;特别是 DATETIME 和 TIMESTAMP 类型的精度问题。 二、问题描述…

MySQL深度分页

在现代Web应用中&#xff0c;数据的逐步展示除了增强用户体验外&#xff0c;还有效提高了系统性能。然而&#xff0c;随着数据集的不断增大&#xff0c;尤其是在数据库表中记录数量达到百万甚至千万级别时&#xff0c;处理深度分页&#xff08;即访问较后页的数据&#xff09;就…

JetLinks物联网平台微服务化系列文章介绍

橙蜂智能公司致力于提供先进的人工智能和物联网解决方案&#xff0c;帮助企业优化运营并实现技术潜能。公司主要服务包括AI数字人、AI翻译、AI知识库、大模型服务等。其核心价值观为创新、客户至上、质量、合作和可持续发展。 橙蜂智农的智慧农业产品涵盖了多方面的功能&#x…

【CKA】二、节点管理-设置节点不可用

2、节点管理-设置节点不可用 1. 考题内容&#xff1a; 2. 答题思路&#xff1a; 先设置节点不可用&#xff0c;然后驱逐节点上的pod 这道题就两条命令&#xff0c;直接背熟就行。 也可以查看帮助 kubectl cordon -h kubectl drain -h 参数详情&#xff1a; –delete-empty…