[Spring Boot]Protobuf解析MQTT消息体
简述
本文主要针对在MQTT场景下,使用Protobuf协议解析MQTT的消息体
Protobuf下载
官方下载
https://github.com/protocolbuffers/protobuf/releases
网盘下载
链接:https://pan.baidu.com/s/1Uz7CZuOSwa8VCDl-6r2xzw?pwd=anan
提取码:anan
本文项目代码
java_fir_mqtt-proto
https://gitee.com/dong-puen/fir_public
配置protoc到Windows系统
解压文件,配置环境变量:
PROTOCBUF_HOME

Path中添加:
%PROTOCBUF_HOME%\bin

命令行验证
protoc

配置protoc到Ubuntu 22.04.4
安装
apt-get install libprotobuf-dev protobuf-compiler
验证
protoc

Java集成
MQTT依赖
<!-- mqtt连接依赖--><dependency><groupId>com.hivemq</groupId><artifactId>hivemq-mqtt-client</artifactId><version>1.3.3</version></dependency>
编辑proto文件
syntax = "proto3";// 是否开启多文件
option java_multiple_files = true;
// 包命
option java_package = "com.fir.proto.protobuf.info";
// Java外部类名
option java_outer_classname = "Info";message Info {// 字符串string name = 1;// 整数类型int32 int32_value = 3;int64 int64_value = 4;uint32 uint32_value = 5;uint64 uint64_value = 6;sint32 sint32_value = 7;sint64 sint64_value = 8;fixed32 fixed32_value = 9;fixed64 fixed64_value = 10;sfixed32 sfixed32_value = 11;sfixed64 sfixed64_value = 12;// 布尔类型bool bool_value = 13;// 浮点类型float float_value = 14;double double_value = 15;// 字节类型bytes bytes_value = 16;// 枚举类型enum EnumType {DEFAULT = 0;TYPE1 = 1;TYPE2 = 2;
}EnumType enum_value = 17;// 映射类型map<string, int32> map_value = 18;// 内嵌消息类型message NestedMessage {string nested_field = 1;
}NestedMessage nested_message = 19;// 重复字段repeated string repeated_strings = 20;
}
命令行生成Java文件
protoc --java_out=C:\proto test.proto
(ps:虽然有地方推荐使用idea生成,但是实测有时候会卡住,反而命令行生成速度更快,这里推荐使用命令行。)

复制生成的3个文件

发送数据与解析数据
发送数据
初始化数据
@GetMapping("/send")public Object pageData() {// 构建MesInfo对象MesInfo mesInfo = MesInfo.newBuilder().setName("测试数据").build();mqttClient.send(mqttClient.TEST_MSG, mesInfo.toByteArray());return true;}
也可以初始化所有数据对象
@GetMapping("/send")public Object pageData() {// 初始化MesInfo对象MesInfo.Builder mesInfoBuilder = MesInfo.newBuilder();// 设置字符串字段mesInfoBuilder.setName("测试数据");// 设置整数类型字段mesInfoBuilder.setInt32Value(32);mesInfoBuilder.setInt64Value(64L);mesInfoBuilder.setUint32Value(32);mesInfoBuilder.setUint64Value(64L);mesInfoBuilder.setSint32Value(32);mesInfoBuilder.setSint64Value(64L);mesInfoBuilder.setFixed32Value(32);mesInfoBuilder.setFixed64Value(64L);mesInfoBuilder.setSfixed32Value(32);mesInfoBuilder.setSfixed64Value(64L);// 设置布尔类型字段mesInfoBuilder.setBoolValue(true);// 设置浮点类型字段mesInfoBuilder.setFloatValue(3.14f);mesInfoBuilder.setDoubleValue(3.141592653589793);// 设置字节类型字段mesInfoBuilder.setBytesValue(ByteString.copyFromUtf8("字节字符串"));// 设置枚举类型字段mesInfoBuilder.setEnumValue(MesInfo.EnumType.TYPE1);// 设置映射类型字段mesInfoBuilder.putMapValue("key1", 100);mesInfoBuilder.putMapValue("key2", 200);// 设置内嵌消息类型字段MesInfo.NestedMessage.Builder nestedMessageBuilder = MesInfo.NestedMessage.newBuilder();nestedMessageBuilder.setNestedField("内嵌字段值");mesInfoBuilder.setNestedMessage(nestedMessageBuilder.build());// 设置重复字段mesInfoBuilder.addRepeatedStrings("字符串1");mesInfoBuilder.addRepeatedStrings("字符串2");// 构建MesInfo对象MesInfo mesInfo = mesInfoBuilder.build();mqttClient.send(mqttClient.TEST_MSG, mesInfo.toByteArray());return true;}
解析数据
@Bean(name = "mqttBackBean")public Consumer<Mqtt3Publish> mqttBackBean() {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String datetime = sdf.format(new Date());log.info("[MQTT]:" + datetime);Consumer<Mqtt3Publish> callback = mqtt3Publish -> {String topic;topic = mqtt3Publish.getTopic().toString();byte[] mqttData = mqtt3Publish.getPayloadAsBytes();log.info("[MQTT] 主题{} 消息体 {}}", topic, Arrays.toString(mqttData));try {MesInfo mesInfo = MesInfo.parseFrom(mqttData);System.out.println("mesInfo============================================================");System.out.println(mesInfo.toString());System.out.println(mesInfo);System.out.println("mesInfo============================================================");// 打印所有字段for (Map.Entry<Descriptors.FieldDescriptor, Object> entry : mesInfo.getAllFields().entrySet()) {Descriptors.FieldDescriptor field = entry.getKey();Object value = entry.getValue();System.out.println(field.getName() + ": " + value);}} catch (Exception e) {e.printStackTrace();// pass}};log.info("[MQTT] 处理结束:" + datetime);return callback;}
效果如下


相关文章:
[Spring Boot]Protobuf解析MQTT消息体
简述 本文主要针对在MQTT场景下,使用Protobuf协议解析MQTT的消息体 Protobuf下载 官方下载 https://github.com/protocolbuffers/protobuf/releases网盘下载 链接:https://pan.baidu.com/s/1Uz7CZuOSwa8VCDl-6r2xzw?pwdanan 提取码:an…...
什么是Mappers?Mappers的作用是什么?
在软件开发中,“mappers” 通常指的是数据映射器(Data Mappers),它们的主要作用是在应用程序的数据持久化层(通常是数据库或其他持久化存储)与应用程序的业务逻辑之间建立一个映射层。 具体来说࿰…...
python-多任务编程
2. 多任务编程 2.1 多任务概述 多任务 即操作系统中可以同时运行多个任务。比如我们可以同时挂着qq,听音乐,同时上网浏览网页。这是我们看得到的任务,在系统中还有很多系统任务在执行,现在的操作系统基本都是多任务操作系统,具备…...
IDEA创建Java工程、Maven安装与建立工程、Web工程、Tomcat配置
《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试(Debug) 第七章 …...
使用工作流产生高质量翻译内容的实战教程
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
笔记:Few-Shot Learning小样本分类问题 + 孪生网络 + 预训练与微调
内容摘自王老师的B站视频,大家还是尽量去看视频,老师讲的特别好,不到一小时的时间就缕清了小样本学习的基础知识点~Few-Shot Learning (1/3): 基本概念_哔哩哔哩_bilibili Few-Shot Learning(小样本分类) 假设现在每类…...
初学Mybatis之 CRUD 增删改查
namespace 中的包名要和 Dao/Mapper 接口的包名一致 select:选择,查询语句 同理,还有 insert、update、delete 标签 id:对应的 namespace 中的方法名 resultType:sql 语句执行的返回值 parameterType:…...
Kali Linux APT 设置指南:如何控制软件包更新行为
在我浏览 CSDN 的问答社区时,我发现一篇求助内容是一位用户对于如何在使用 APT 更新时避免更新 Arduino 这个问题感到困惑。这激发了我写这篇博客的灵感。我希望通过这篇文章,帮助那些在 Kali Linux 上使用 APT 管理软件包更新的朋友们,特别是…...
Android 10.0 Settings 加载流程
一、系统设置首页 代码路径:packages/app/Settings/ 1 主界面加载: <!-- Alias for launcher activity only, as this belongs to each profile. --><activity-alias android:name"Settings"android:label"string/settings_la…...
mysql的索引、事务和存储引擎
目录 索引 索引的概念 索引的作用 作用 索引的副作用 创建索引 创建索引的原则和依据 索引的类型 创建索引 查看索引 删除索引 drop 主键索引 普通索引 添加普通索引 唯一索引 添加唯一索引 组合索引 添加组合索引 查询组合索引 全文索引 添加全文索引 …...
基于trace_id实现SpringCloudGateway网关的链路追踪
之前写的两篇关于基于 trace_id 的链路追踪的文章: 基于trace_id的链路追踪(含Feign、Hystrix、线程池等场景)基于trace_id的链路追踪(ForkJoinPool场景) 一、引言 在之前的文章中,我们讨论了基于 trace…...
Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024)
Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024) Windows 11, version 22H2,企业版 arm64 x64 请访问原文链接:https://sysin.org/blog/windows-11/,查看最新版。原创作品,转载请保留出处。 作者…...
【C语言】动态内存管理(上)
文章目录 前言1.为什么要存在动态内存2. malloc和free2.1 malloc2.2 free2.3 使用实例(malloc和free) 3. calloc3.1 calloc例子 前言 本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要,为…...
【BUG】已解决:ModuleNotFoundError: No module named‘ pip‘
已解决:ModuleNotFoundError: No module named‘ pip‘ 目录 已解决:ModuleNotFoundError: No module named‘ pip‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰…...
网络安全-网络安全及其防护措施11
51.网络容量规划 网络容量规划的概念和重要性 网络容量规划: 是指根据业务需求和预期增长,合理规划和设计网络的带宽、设备和资源,以满足未来网络流量和服务质量的需求。通过有效的网络容量规划,确保网络性能稳定和用户体验良好…...
使用IDEA编写lua脚本并运行
下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式:我们的目标是使用IDEA编写lua脚本,所以不需要勾选。后面需要的话,可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…...
CentOS 7 安装MySQL 5.7.30
CentOS 7 安装MySQL卸载(离线安装) 安装配置MySQL之前先查询是否存在,如存在先卸载再安装 rpm -qa|grep -i mysql rpm -qa|grep -i mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64如下命令找到直接 rm -rf 删除(删除…...
Bash 学习摘录
文章目录 1、变量和参数的介绍(1)变量替换$(...) (2)特殊的变量类型export位置参数shift 2、引用(1)引用变量(2)转义 3、条件判断(1)条件测试结构(…...
GD32 MCU是如何进入中断函数的
用过GD32 MCU的小伙伴们都知道,程序是顺序执行的,但当有中断来的时候程序会跳转到中断函数,执行完中断函数后程序又继续回到原来的位置继续执行,那么你们知道MCU是如何找到中断函数入口的吗? 今天我们就以GD32F303系列…...
Ruby 循环
Ruby 循环 在编程中,循环是一种常用的控制结构,它允许我们重复执行一段代码多次。Ruby 作为一种灵活的编程语言,提供了多种循环方法,包括 while、until、for、each 和 loop 等。本文将详细介绍 Ruby 中的循环机制,并通…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
基于Java+MySQL实现(GUI)客户管理系统
客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
在 Visual Studio Code 中使用驭码 CodeRider 提升开发效率:以冒泡排序为例
目录 前言1 插件安装与配置1.1 安装驭码 CodeRider1.2 初始配置建议 2 示例代码:冒泡排序3 驭码 CodeRider 功能详解3.1 功能概览3.2 代码解释功能3.3 自动注释生成3.4 逻辑修改功能3.5 单元测试自动生成3.6 代码优化建议 4 驭码的实际应用建议5 常见问题与解决建议…...
