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

embedded/2024/12/22 1:03:04/

项目中集成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.ppmy.cn/embedded/121611.html

相关文章

【Bug】解决 Ubuntu 中 “error: Unable to Find Python3 Executable” 错误

解决 Ubuntu 中 “Unable to Find Python3 Executable” 错误 在 Ubuntu 系统上使用 Python 进行开发时&#xff0c;遇到找不到 python3 可执行文件的错误。 主要问题是无法正常打开终端&#xff08;原生与terminator&#xff09;&#xff0c;找不到python3&#xff0c;且无法…

数据结构编程实践20讲(Python版)—03栈

本文目录 03 栈 StackS1 说明S2 示例基于列表的实现基于链表的实现 S3 问题&#xff1a;复杂嵌套结构的括号匹配问题求解思路Python3程序 S4 问题&#xff1a;基于栈的阶乘计算VS递归实现求解思路Python3程序 S5 问题&#xff1a;逆波兰表示法(后缀表达式)求值求解思路Python3程…

算法种类丰富,分析准确率业内领先的智慧能源开源了

一、简介 AI视频监控平台, 是一款功能强大且简单易用的实时算法视频监控系统。愿景在最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;减少企业级应用约 95%的开发成本&#xff0c;在强大视频算…

list的模拟实现

目录 1.结构 2.用3个类实现list 3.单个节点的定义 4.迭代器的定义 5.list类的实现 6.vector与list的区别 1.结构 list底层是一个带头双向循环链表 2.用3个类实现list 1.链表中的单个节点 2.迭代器 3.list 由于链表中的迭代器已经不是原生指针&#xff0c;所以将迭代…

【环境配置】科研小白Windows下安装Git

2024年小白使用Win10安装Git 2.46.2教程&#xff1a; 1 下载安装包 访问下载地址 Git - Downloading Package (git-scm.com) 下载之后打开文件 2 安装过程 点击Next 2.1 选择安装路径 2.2 选择勾选必要组件 2.3 一路Next 这一步直接Next即可 继续点击Next 继续点击Ne…

算法打卡:第十一章 图论part10

今日收获&#xff1a;Bellman_ford 队列优化算法&#xff08;又名SPFA&#xff09;&#xff0c;bellman_ford之判断负权回路和单源有限最短路 1. Bellman_ford 队列优化算法&#xff08;又名SPFA&#xff09; 题目链接&#xff1a;94. 城市间货物运输 I (kamacoder.com) 思路…

在 Qt 项目中使用 spdlog 的全攻略

目录 1. 准备工作&#xff1a;安装 spdlog 方法一&#xff1a;使用 CMake 的 FetchContent&#xff08;推荐&#xff09; 方法二&#xff1a;手动下载并添加到项目中 2. 在 Qt 项目中集成 spdlog a. 初始化 spdlog b. 在 Qt 的各个部分使用 spdlog 3. 基本使用示例 4. …

rabbitmq----数据管理模块

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 交换机数据管理管理的字段持久化管理类内存管理类申明交换机删除交换机获取指定交换机 队列数据管理管理的字段持久化管理类内存管理类申明/删除/获取指定队列获取所…