[Spring Boot]Protobuf解析MQTT消息体

news2024/11/16 0:55:58

简述

本文主要针对在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

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

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

相关文章

C语言:数组-学习笔记(万字笔记)——翻新版

目录 前言&#xff1a; 1、 数组的概念 1.1 什么是数组 1.2 为什么学习数组&#xff1f; 2. ⼀维数组的创建和初始化 2.1 数组创建 2.2 数组的初始化 2.3 数组的类型 2.3.1 什么是数组类型&#xff1f; 2.3.2 数组类型的作用 3、 一维数组的使用 3.1 数组下标 3.2 数…

ZYNQ 入门笔记(零):概述

文章目录 引言产品线Zynq™ 7000 SoCZynq UltraScale™ MPSoCZynq UltraScale RFSoCVersal™ Adaptive SoC 开发环境 引言 Xilinx FPGA 产品线从经济型的 Spartan、Artix 系列到高性能的 Kintex、Virtex、Versal 系列&#xff0c;可以说涵盖了 FPGA 的绝大部分应用场景&#x…

SpringBoot 最大连接数及最大并发数是多少

SpringBoot 最大连接数及最大并发数 Spring Boot 是一个基于 Spring 框架的快速开发框架&#xff0c;它本身并不直接管理数据库连接或网络连接的最大连接数和最大并发数。这些参数通常由底层的基础设施和组件来控制&#xff0c;例如&#xff1a; 数据库连接池&#xff1a;Spri…

Web 3.0革新:社交金融与边玩边赚开启用户数据主权时代

目录 Web 3.0与社交商业模式 传统社交平台的问题 去中心化社交创新 Mirror&#xff1a;去中心化内容发布平台 Lens Protocol&#xff1a;去中心化社交图谱 Maskbook&#xff1a;隐私保护的社交方式 Web 3.0与与边玩边赚模式 经济模型解析 新商业模式的探索 Axie Infi…

C++——模板初阶 | STL简介

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 博主主页&#xff1a;Yan. yan.                        …

maven私服上传jar包 400 Bad Request 错误

文章目录 前言一、直接看报错二、问题处理三 maven 私服配置说明总结 前言 maven仓库的私服,一般会存放公司或者个人封装的jar包,用来共享给二次开发和协作伙伴用,很方便 第一次发布没有问题,但是我第二次发布,开始报错了 一、直接看报错 [外链图片转存失败,源站可能有防盗链…

十五届蓝桥杯JAVA B组题目详解(持续更新中)

试题 B: 类斐波那契循环数 我发现蓝桥杯的题目现在就是要费时间去理解&#xff0c;所以还是审题很重要&#xff0c;这道题的思路就是&#xff0c;一个n位数的前n个数&#xff0c;都是对应的位数上的值&#xff0c;比如说12345&#xff0c;五位数是吧&#xff0c;那数列S的前五位…

自主巡航,目标射击

中国机器人及人工智能大赛 参赛经验&#xff1a; 自主巡航赛道 【机器人和人工智能——自主巡航赛项】动手实践篇-CSDN博客 主要逻辑代码 #!/usr/bin/env python #coding: utf-8import rospy from geometry_msgs.msg import Point import threading import actionlib impor…

数据结构(Java):七大排序算法【多方法、多优化、多细节】

目录 1、排序的概念 1.1 排序 1.2 排序的稳定性 1.3 内部排序&外部排序 1.4 各排序算法总结对比 2、 插入排序 2.1 &#x1f338;直接插入排序 2.2 &#x1f338;希尔排序 3、 选择排序 3.1 &#x1f338;直接选择排序 3.2 直接选择排序优化 3.3 &#x1f338;…

【PyTorch】图像多分类项目

【PyTorch】图像二分类项目 【PyTorch】图像二分类项目-部署 【PyTorch】图像多分类项目 【PyTorch】图像多分类项目部署 多类图像分类的目标是为一组固定类别中的图像分配标签。 目录 加载和处理数据 搭建模型 定义损失函数 定义优化器 训练和迁移学习 用随机权重进行训…

HC-SR04超声波测距模块使用方法和例程(STM32快速移植)

基于STM32和HC-SR04模块实现超声波测距功能 HC-SR04硬件概述HC-SR04超声波距离传感器的核心是两个超声波传感器。一个用作发射器&#xff0c;将电信号转换为40 KHz超声波脉冲。接收器监听发射的脉冲。如果接收到它们&#xff0c;它将产生一个输出脉冲&#xff0c;其宽度可用于…

磁盘作业1

新添加一块硬盘&#xff0c;大小为5g&#xff0c;给这块硬盘分一个mbr格式的主分区&#xff08;大小为3g&#xff09;&#xff0c;给此主分区创建ext2的文件系统&#xff0c;挂载到/guazai1目录&#xff0c;并写入文件内容为 "this is fist disk" 文件名为1.txt的文件…

五分钟学会 Docker Registry 搭建私有镜像仓库

在上一篇文章《前端不懂 Docker &#xff1f;先用它换掉常规的 Vue 项目部署方式》中&#xff0c;我们学习了如何使用 aliyun 私有镜像仓库&#xff0c;也了解到可以使用 Docker Registry 搭建私有镜像仓库。这篇文章就分享下实操过程。 registry 是官方提供的 registry 镜像&…

【数据结构--查找】

目录 一、查找&#xff08;Searching&#xff09;的概念1.1、基本概念1.2、算法的评价指标 二、顺序查找2.1、算法思想2.2、算法实现2.2.1、常规顺序查找2.2.2、带哨兵的顺序查找 2.3、效率分析2.4、优化2.4.1、针对有序表2.4.2、被查效率不相等 三、折半查找3.1、算法思想3.2、…

<数据集>学生课堂行为识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13899张 标注数量(xml文件个数)&#xff1a;13899 标注数量(txt文件个数)&#xff1a;13899 标注类别数&#xff1a;8 标注类别名称&#xff1a;[js, tt, dk, zt, dx, zl, jz, xt] # 举手 js # 抬头听课 …

新版GPT-4omini上线!快!真TM快!

大半夜&#xff0c;OpenAI突然推出了GPT-4o mini版本。 当我看到这条消息时&#xff0c;正准备去睡觉。mini版本质上是GPT-4o模型的精简版本&#xff0c;没有什么革命性的创新&#xff0c;因此我并没有太在意。 结果今天早上一觉醒来发现伴随GPT-4o mini上线&#xff0c;官网和…

Vue3+ element plus 前后分离admin项目安装教程

前后分离admin项目安装 前后分离admin项目安装基于 vue3.x CompositionAPI typescript vite element plus vue-router-next pinia&#xff0c;适配手机、平板、pc 的后台开源免费模板&#xff0c;希望减少工作量&#xff0c;帮助大家实现快速开发。 下载源码 前往gite…

Flink SQL 实时读取 kafka 数据写入 Clickhouse —— 日志处理(三)

文章目录 前言Clickhouse 表设计adlp_log_local 本地表adlp_log 分布式表 Flink SQL 说明创建 Source Table (Kafka) 连接器表创建 Sink Table (Clickhouse) 连接器解析 Message 写入 Sink 日志查询演示总结 前言 在之前的文章中&#xff0c;我们总结了如何在 Django 项目中进…

甄选范文“论系统安全架构设计及其应用”,软考高级论文,系统架构设计师论文

论文真题 随着社会信息化进程的加快,计算机及网络已经被各行各业广泛应用,信息安全问题也变得愈来愈重要。它具有机密性、完整性、可用性、可控性和不可抵赖性等特征。信息系统的安全保障是以风险和策略为基础,在信息系统的整个生命周期中提供包括技术、管理、人员和工程过…

Noah-MP陆面生态水文模拟与多源遥感数据同化技术

了解陆表过程的主要研究内容以及陆面模型在生态水文研究中的地位和作用&#xff1b;熟悉模型的发展历程&#xff0c;常见模型及各自特点&#xff1b;理解Noah-MP模型的原理&#xff0c;掌握Noah-MP模型在单站和区域的模拟、模拟结果的输出和后续分析及可视化等方法&#xff1b;…