当前位置: 首页 > news >正文

[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

image.png

Path中添加:

%PROTOCBUF_HOME%\bin

image.png

命令行验证

protoc

image.png

配置protoc到Ubuntu 22.04.4

安装

apt-get install libprotobuf-dev protobuf-compiler

验证

protoc

image.png

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生成,但是实测有时候会卡住,反而命令行生成速度更快,这里推荐使用命令行。)
image.png
复制生成的3个文件
image.png

发送数据与解析数据

发送数据

初始化数据

    @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;}

效果如下

image.png

image.png

相关文章:

[Spring Boot]Protobuf解析MQTT消息体

简述 本文主要针对在MQTT场景下&#xff0c;使用Protobuf协议解析MQTT的消息体 Protobuf下载 官方下载 https://github.com/protocolbuffers/protobuf/releases网盘下载 链接&#xff1a;https://pan.baidu.com/s/1Uz7CZuOSwa8VCDl-6r2xzw?pwdanan 提取码&#xff1a;an…...

什么是Mappers?Mappers的作用是什么?

在软件开发中&#xff0c;“mappers” 通常指的是数据映射器&#xff08;Data Mappers&#xff09;&#xff0c;它们的主要作用是在应用程序的数据持久化层&#xff08;通常是数据库或其他持久化存储&#xff09;与应用程序的业务逻辑之间建立一个映射层。 具体来说&#xff0…...

python-多任务编程

2. 多任务编程 2.1 多任务概述 多任务 即操作系统中可以同时运行多个任务。比如我们可以同时挂着qq&#xff0c;听音乐&#xff0c;同时上网浏览网页。这是我们看得到的任务&#xff0c;在系统中还有很多系统任务在执行,现在的操作系统基本都是多任务操作系统&#xff0c;具备…...

IDEA创建Java工程、Maven安装与建立工程、Web工程、Tomcat配置

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …...

使用工作流产生高质量翻译内容的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...

笔记:Few-Shot Learning小样本分类问题 + 孪生网络 + 预训练与微调

内容摘自王老师的B站视频&#xff0c;大家还是尽量去看视频&#xff0c;老师讲的特别好&#xff0c;不到一小时的时间就缕清了小样本学习的基础知识点~Few-Shot Learning (1/3): 基本概念_哔哩哔哩_bilibili Few-Shot Learning&#xff08;小样本分类&#xff09; 假设现在每类…...

初学Mybatis之 CRUD 增删改查

namespace 中的包名要和 Dao/Mapper 接口的包名一致 select&#xff1a;选择&#xff0c;查询语句 同理&#xff0c;还有 insert、update、delete 标签 id&#xff1a;对应的 namespace 中的方法名 resultType&#xff1a;sql 语句执行的返回值 parameterType&#xff1a;…...

Kali Linux APT 设置指南:如何控制软件包更新行为

在我浏览 CSDN 的问答社区时&#xff0c;我发现一篇求助内容是一位用户对于如何在使用 APT 更新时避免更新 Arduino 这个问题感到困惑。这激发了我写这篇博客的灵感。我希望通过这篇文章&#xff0c;帮助那些在 Kali Linux 上使用 APT 管理软件包更新的朋友们&#xff0c;特别是…...

Android 10.0 Settings 加载流程

一、系统设置首页 代码路径&#xff1a;packages/app/Settings/ 1 主界面加载&#xff1a; <!-- 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 的链路追踪的文章&#xff1a; 基于trace_id的链路追踪&#xff08;含Feign、Hystrix、线程池等场景&#xff09;基于trace_id的链路追踪&#xff08;ForkJoinPool场景&#xff09; 一、引言 在之前的文章中&#xff0c;我们讨论了基于 trace…...

Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024)

Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024) Windows 11, version 22H2&#xff0c;企业版 arm64 x64 请访问原文链接&#xff1a;https://sysin.org/blog/windows-11/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者…...

【C语言】动态内存管理(上)

文章目录 前言1.为什么要存在动态内存2. malloc和free2.1 malloc2.2 free2.3 使用实例&#xff08;malloc和free&#xff09; 3. calloc3.1 calloc例子 前言 本文开始将开始学习C语言中一个比较重要的知识点或者是操作——动态内存管理。由于本次的知识比较重要&#xff0c;为…...

【BUG】已解决:ModuleNotFoundError: No module named‘ pip‘

已解决&#xff1a;ModuleNotFoundError: No module named‘ pip‘ 目录 已解决&#xff1a;ModuleNotFoundError: No module named‘ pip‘ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰…...

网络安全-网络安全及其防护措施11

51.网络容量规划 网络容量规划的概念和重要性 网络容量规划&#xff1a; 是指根据业务需求和预期增长&#xff0c;合理规划和设计网络的带宽、设备和资源&#xff0c;以满足未来网络流量和服务质量的需求。通过有效的网络容量规划&#xff0c;确保网络性能稳定和用户体验良好…...

使用IDEA编写lua脚本并运行

下载lua https://github.com/rjpcomputing/luaforwindows/releases 是否创建桌面快捷方式&#xff1a;我们的目标是使用IDEA编写lua脚本&#xff0c;所以不需要勾选。后面需要的话&#xff0c;可以到安装目录下手动创建快捷方式 环境变量自动配置 安装后会自动配置好环境变量…...

CentOS 7 安装MySQL 5.7.30

CentOS 7 安装MySQL卸载&#xff08;离线安装&#xff09; 安装配置MySQL之前先查询是否存在&#xff0c;如存在先卸载再安装 rpm -qa|grep -i mysql rpm -qa|grep -i mariadb rpm -e --nodeps mariadb-libs-5.5.68-1.el7.x86_64如下命令找到直接 rm -rf 删除&#xff08;删除…...

Bash 学习摘录

文章目录 1、变量和参数的介绍&#xff08;1&#xff09;变量替换$(...) &#xff08;2&#xff09;特殊的变量类型export位置参数shift 2、引用&#xff08;1&#xff09;引用变量&#xff08;2&#xff09;转义 3、条件判断&#xff08;1&#xff09;条件测试结构&#xff08…...

GD32 MCU是如何进入中断函数的

用过GD32 MCU的小伙伴们都知道&#xff0c;程序是顺序执行的&#xff0c;但当有中断来的时候程序会跳转到中断函数&#xff0c;执行完中断函数后程序又继续回到原来的位置继续执行&#xff0c;那么你们知道MCU是如何找到中断函数入口的吗&#xff1f; 今天我们就以GD32F303系列…...

Ruby 循环

Ruby 循环 在编程中&#xff0c;循环是一种常用的控制结构&#xff0c;它允许我们重复执行一段代码多次。Ruby 作为一种灵活的编程语言&#xff0c;提供了多种循环方法&#xff0c;包括 while、until、for、each 和 loop 等。本文将详细介绍 Ruby 中的循环机制&#xff0c;并通…...

三字棋游戏(C语言详细解释)

hello&#xff0c;小伙伴们大家好&#xff0c;算是失踪人口回归了哈&#xff0c;主要原因是期末考试完学校组织实训&#xff0c;做了俄罗斯方块&#xff0c;后续也会更新&#xff0c;不过今天先从简单的三字棋说起 话不多说&#xff0c;开始今天的内容 一、大体思路 我们都知…...

H3CNE(计算机网络的概述)

1. 计算机网络的概述 1.1 计算机网络的三大基本功能 1. 资源共享 2. 分布式处理与负载均衡 3. 综合信息服务 1.2 计算机网络的三大基本类型 1.3 网络拓扑 定义&#xff1a; 网络设备连接排列的方式 网络拓扑的类型&#xff1a; 总线型拓扑&#xff1a; 所有的设备共享一…...

【极客日常】Golang一个的slice数据替换的bug排查

上周某天下班前&#xff0c;接到同事转来一个bug要排查&#xff0c;症状是代码重构之后某些业务效果不符合预期&#xff0c;由于代码重构人是笔者&#xff0c;于是blame到笔者这边。经过10min左右的排查和尝试后&#xff0c;解决了这个问题&#xff1a;既往逻辑没有改动&#x…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号3

基础认证题库请移步&#xff1a;HarmonyOS应用开发者基础认证题库 注&#xff1a;有读者反馈&#xff0c;题库的代码块比较多&#xff0c;打开文章时会卡死。所以笔者将题库拆分&#xff0c;单选题20个为一组&#xff0c;多选题10个为一组&#xff0c;题库目录如下&#xff0c;…...

UE4-光照重建

当我们拉入新的光源和模型到我们的场景中后&#xff0c;会产生这样的情况&#xff1a; Preview:预览 表示此时由于光照物体所产生的阴影都是预览级别的并不是真正的效果。 方法一&#xff1a; 或者也可以在世界大纲中选中我们的光源&#xff0c;然后将我们的光源改变为可以…...

【2024德国签证】留学面签问题汇总

在去交材料的时候&#xff0c;可能会被随机安排面试。这些面试问题一般都很简单&#xff0c;主要是测试你的基本英文交流能力。无需担心&#xff0c;签证官不会问太专业的问题&#xff0c;因为他们也不懂专业内容。到目前为止&#xff0c;没有一个博士生因为这个面试被拒签。毕…...

知识点大纲

学习方法 学习、整理笔记过程中&#xff0c;顺便整理出一个以问题为模版的大纲&#xff0c;到时候对着问题&#xff0c;就像是在和面试官讲解那样&#xff0c;相当于升级版的费曼学习法 除了看博客&#xff0c;问gpt外&#xff0c;亲自实验也是获取知识及加深印象的关键点 很…...

MySQL:库表操作

MySQL&#xff1a;库表操作 库操作查看创建字符编码集 删除修改备份 表操作创建查看删除修改 库操作 查看 查看存在哪些数据库&#xff1a; show databases;示例&#xff1a; 查看自己当前处于哪一个数据库&#xff1a; select database();示例&#xff1a; 此处由于我不处于任…...

8.3 End-to-end Data Protection (Optional)

8.3 End-to-end Data Protection (Optional) 为了提供从应用程序到NVM介质并返回到应用程序本身的稳健数据保护,可以使用端到端数据保护。如果启用了此可选机制,则将额外的保护信息(例如CRC)添加到逻辑块中,控制器和/或主机软件可以对其进行评估,以确定逻辑块的完整性。…...

python实现图像对比度增强算法

python实现直方图均衡化、自适应直方图均衡化、连接组件标记算法 1.直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 2.自适应直方图均衡化算法详解算法步骤公式Python 实现详细解释优缺点 3.连接组件标记算法详解算法步骤8连通与4连通公式Python 实现详细解释优缺…...

开发区建设集团网站/使用百度地图导航收费吗

1、 一个".java"源文件中是否可以包括多个类&#xff08;不是内部类&#xff09;&#xff1f;有什么限制&#xff1f;、 可以有多个类&#xff0c;但只能有一个public的类&#xff0c;并且public的类名与文件名相同 2、 Java有没有goto? Java中的保留字&#xff0…...

绍兴市高速公路建设指挥部网站/今日头条新闻手机版

1 SWUpdata 概述 SWUpdata 是一个开源项目&#xff0c;该项目可以从存储介质或网络为嵌入式设备更新嵌入式系统。但是&#xff0c;它应该主要被视为一个框架&#xff0c;可以轻松地将更多协议或安装程序&#xff08;在 SWUpdate 中称为处理程序&#xff09;添加到应用程序中。 …...

设计师找图网站/网站推广怎么推广

“天哪&#xff01;这么多&#xff0c;这真的一年估计都吃不完” 尽管早有心理准备&#xff0c;但当王宏旻面对农村淘宝送的整整1200斤大米时&#xff0c;仍不禁感叹。 农村淘宝推出共享丰收喜悦“随手拍丰收”活动。一周时间内全国32个省市区上万名网友参与&#xff0c;随手拍…...

做网站主播要什么条件/小说搜索风云榜排名

苯四乙酸 cas1820793-31-4 齐岳中间体|单体材料 英文名称&#xff1a; NA 中文名称&#xff1a; 苯四乙酸 MF&#xff1a; C14H14O8 MW&#xff1a; 310.26 CAS&#xff1a; 1820793-31-4 氟代功能单体53 丙烯酸三氟乙酯 407-47-6 TFEA 58519-06-5 甲基丙烯酸2,2,2-三氟…...

免费门户网站搭建/淘宝指数官网的网址

Google收购聊天机器人开发平台API.AI 责任编辑&#xff1a;editor005 作者&#xff1a;boxi | 2016-09-20 15:10:32 本文摘自&#xff1a;36kr Google刚刚在官方博客宣布&#xff0c;已经收购了为开发者提供Siri式会话机器人开发工具的API.AI背后的团队&#xff0c;但具体交易…...

中建建设银行网站/焊工培训技术学校

万事开头难哈&#xff01;历经千辛万苦&#xff0c;博客终于开通了 &#xff08;并不是申请博客难&#xff0c;而是本人很懒&#xff0c;下班之后只顾得上LOL了。千辛万苦是内心里懒虫那条坎&#xff09; 这也是一个新的开始以及新的挑战吧。不能再为了打游戏而不更新博客&…...