[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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网易易盾图标点选验证码识别代码

简介 网易图标点选一直都是一个大难题&#xff0c;如上图所示。难点之一是图标变幻莫测&#xff0c;很难刷出有重复的图标&#xff0c;所以使用传统等等方式去标注、识别具有较大的难度。 经过我们大量的数据标注&#xff0c;终于完成了这款验证码的识别。 目前我们提供两种识…

基于若依的ruoyi-nbcio流程管理系统修正自定义业务表单的回写bug

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

均值滤波算法及实现

均值滤波器的使用场景&#xff1a; 均值滤波器使用于处理一些如上述蓝色线的高斯噪声场景 红色曲线是经过均值滤波处理后的数据。主要因为均值滤波设置数据缓冲区&#xff08;也即延时周期&#xff09;&#xff0c;使得测量值经过缓冲不会出现特别大的变化。 黄色曲线为高斯噪声…

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

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

linux进程优先级——优先值、调度算法、进程性质

前言&#xff1a;本篇内容主要讲解linux下进程的优先级。 优先级的内容相对较少&#xff0c; 最重要的内容就是cpu的调度方法。 内容相对容易理解。 ps&#xff1a;本节内容适合了解冯诺依曼和操作系统的管理方式以及进程PCB的友友们进程观看 进程的优先级是什么 进程的优先级…

Android11 framework 禁止三方应用开机自启动

Android11应用自启动限制 大纲 Android11应用自启动限制分析验证猜想&#xff1a;Android11 AOSP是否自带禁止三方应用监听BOOT_COMPLETED​方案禁止执行非系统应用监听到BOOT_COMPLETED​后的代码逻辑在执行启动时判断其启动的广播接收器一棍子打死方案&#xff08;慎用&#…

【Spark官方文档部分翻译】RDD编程指南(RDD Programming Guide)

写在前面 内容如何选择 本翻译只翻译本人认为精华的部分&#xff0c;本人认为的Spark的一些核心理念&#xff0c;编程思想。一些特别基础的操作包括但不限于搭建环境就不在此赘述了。 配套版本 本系列基于Spark 3.3.1&#xff0c;Scala 2.12.10&#xff0c;进行翻译总结 原…

专业PDF编辑工具:Acrobat Pro DC 2024.002.20933绿色版,提升你的工作效率!

软件介绍 Adobe Acrobat Pro DC 2024绿色便携版是一款功能强大的PDF编辑和转换软件&#xff0c;由Adobe公司推出。它是Acrobat XI系列的后续产品&#xff0c;提供了全新的用户界面和增强功能。用户可以借助这款软件将纸质文件转换为可编辑的电子文件&#xff0c;便于传输、签署…

stm32:CAN通讯

目录 介绍 物理层​编辑 差分信号 总线网络 协议层 CAN的 帧/报文 种类 数据帧 远程帧&#xff08;遥控帧&#xff09; 错误帧 过载帧 帧间隔 总线仲裁 位同步 数据同步 波特率 stm32的CAN外设 工作模式 测试模式 功能框图 时序 标准时序 例子 环回静默…

应用层——HTTP

像我们电脑和手机使用的应用软件就是在应用层写的&#xff0c;当我们的数据需要传输的时候换将数据传递到传输层。 应用层专门给用户提供应用功能&#xff0c;比如HTTP,FTP… 我们程序员写的一个个解决我们实际的问题都在应用层&#xff0c;我们今天来聊一聊HTTP。 协议 协议…

游泳耳机哪个牌子最好?公认最好的四大游泳耳机测评分享

游泳耳机&#xff0c;作为水上运动爱好者的贴心伴侣&#xff0c;已被公认为提升水下体验的利器。然而&#xff0c;在抖音、贴吧等社交平台上&#xff0c;我们也不难发现一些关于游泳耳机性能不佳、使用效果差&#xff0c;甚至对耳朵造成不适的反馈。这种矛盾现象的出现&#xf…

HTML5大作业三农有机,农产品,农庄,农旅网站源码

文章目录 1.设计来源1.1 轮播图页面头部效果1.2 栏目列表页面效果1.3 页面底部导航效果 2.效果和源码2.1 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4…

基于pytorch演练线性回归模型

引言 本文的目的是在前文基于numpy演练可视化梯度下降的代码基础上&#xff0c;使用pytorch来实现一个功能齐全的线性回归训练模型。 为什么仍然使用线性回归模型&#xff1f; 线性回归模型简单&#xff0c;它能让我们聚集在pytorch是如何工作的&#xff0c;而不是模型内部的…

使用百度语音技术实现文字转语音

使用百度语音技术实现文字转语音 SpringBootVue前后端分离项目 调用api接口需要使用AK和SK生成AccessToken,生成getAccessToken的接口有跨域限制,所以统一的由后端处理了 部分参数在控制台->语音技术->在线调试里面能找到 Controller RestController RequestMapping(&q…

C++ | Leetcode C++题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; class Solution { public:int missingNumber(vector<int>& nums) {int n nums.size();int total n * (n 1) / 2;int arrSum 0;for (int i 0; i < n; i) {arrSum nums[i];}return total - arrSum;} };

探索 Framer Motion 高级动画技巧:提升前端设计水平

在现代的网页和应用设计中&#xff0c;动画不仅仅是视觉的点缀&#xff0c;更是用户体验的重要组成部分。它能够使界面更具吸引力&#xff0c;提升交互的流畅性&#xff0c;甚至在不经意间传达品牌的个性和态度。然而&#xff0c;要创造出令人惊叹的动效并不容易——直到有了 F…

Edge侧边栏copilot消失

Edge侧边栏copilot消失 当前环境 自己ip问题已解决&#xff0c;edge中已登录账号&#xff0c;地区已设置为美国&#xff0c;语言已设置为英文。具体可以通过空白页右上角的setting验证 解决方案 首先&#xff0c;打开“任务管理器”&#xff0c;在其中找到 Microsoft Edge…

【SASS/SCSS(三)】样式的复用与动态计算(@mixin和@function)

目录 一、mixin 1、定义复用的样式代码&#xff0c;接受传参&#xff0c;搭配include使用。 位置传参 关键词传参 ...语法糖接受传入的任意参数 2、在mixin中使用content&#xff0c;获取外部对mixin的追加内容 二、function 三、字符串——值得注意的点 很多时候&#…

[Doris]阿里云搭建Doris,测试环境1FE 1BE

首先&#xff1a;阿里云的国内服务器千万不要用容器搭建&#xff0c;或者自己Dockfile构建镜像。两种方式都不得行&#xff0c;压根拉不到github的镜像&#xff0c;开了镜像加速器也拉不到&#xff0c;不要折腾了&#xff0c;极其愚蠢。 背景&#xff1a;现在测试环境&#xff…

算法力扣刷题记录 五十六【501.二叉搜索树中的众数】

前言 二叉搜索树操作&#xff0c;继续。 记录 五十六【501.二叉搜索树中的众数】 一、题目阅读 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;…