当前位置: 首页 > 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

http://www.lryc.cn/news/404368.html

相关文章:

  • 什么是Mappers?Mappers的作用是什么?
  • python-多任务编程
  • IDEA创建Java工程、Maven安装与建立工程、Web工程、Tomcat配置
  • 使用工作流产生高质量翻译内容的实战教程
  • 笔记:Few-Shot Learning小样本分类问题 + 孪生网络 + 预训练与微调
  • 初学Mybatis之 CRUD 增删改查
  • Kali Linux APT 设置指南:如何控制软件包更新行为
  • Android 10.0 Settings 加载流程
  • mysql的索引、事务和存储引擎
  • 基于trace_id实现SpringCloudGateway网关的链路追踪
  • Windows 11 version 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jul 2024)
  • 【C语言】动态内存管理(上)
  • 【BUG】已解决:ModuleNotFoundError: No module named‘ pip‘
  • 网络安全-网络安全及其防护措施11
  • 使用IDEA编写lua脚本并运行
  • CentOS 7 安装MySQL 5.7.30
  • Bash 学习摘录
  • GD32 MCU是如何进入中断函数的
  • Ruby 循环
  • 三字棋游戏(C语言详细解释)
  • H3CNE(计算机网络的概述)
  • 【极客日常】Golang一个的slice数据替换的bug排查
  • HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号3
  • UE4-光照重建
  • 【2024德国签证】留学面签问题汇总
  • 知识点大纲
  • MySQL:库表操作
  • 8.3 End-to-end Data Protection (Optional)
  • python实现图像对比度增强算法
  • 【D3.js in Action 3 精译_020】2.6 用 D3 设置与修改元素样式 + 名人专访(Nadieh Bremer)+ 2.7 本章小结