ProtoBuf协议由Google出品的一个适用于IOT或其他硬件通信场景的数据协议。
ProtoBuf协议较一般APP与硬件交互使用的字节流而言更简单,对于byte和bit与多类型数据结构间转换不熟悉的小伙伴而言是个福音,同时ProtoBuf也可以有效避免byte数组中无用数据占位问题,减小数据传输量。
以上废话可以不看!!!
1、Probuf的引用
在Project的build.gradle中
步骤1. dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.19' } 步骤2.
plugins {
id 'com.google.protobuf' version '0.8.18' apply false
}
在moudule的build.gradle中
步骤1. plugins { id 'com.google.protobuf' }
步骤2.android标签根下,自定义protobuf文件存放位置
sourceSets {
main {
proto { //你的proto文件放置在此文件夹中
srcDir 'src/main/proto'
}
}
}
步骤3. 添加dependencies
implementation 'com.google.protobuf:protobuf-java:3.17.2' implementation 'com.google.protobuf:protoc:3.5.1'
步骤4.生成protobuf对应Java源码
protobuf { protoc { artifact = 'com.google.protobuf:protoc:3.5.1' // 也可以配置本地编译器路径 } generateProtoTasks { all().each { task -> task.builtins { remove java } task.builtins { java {}// 生产java源码 } } } }
2、ProtoBuf的简单使用
//byte数组生成ProtoBuf
XxxProtoMsg xxxProtoMsg = XxxProtoMsg.parseFrom(byteArrays);
//ProtoBuf解析
String xxx = "";
if (xxxProtoMsg.hasXxx()) {
xxx = xxxProtoMsg.getXxx();
}
//ProtoBuf对象设置参数
XxxProtoMsg commandHeader = XxxProtoMsg.newBuilder().setXxx("xxx").build();
//ProtoBuf对象转字节数组
byte[] bytes = xxxProtoMsg.toByteArray();
3、部分ProtoBuf关键字
//指定proto版本 syntax = "proto3"; //此proto文件名 package proto.demoProto; //指定生成的proto java类地址,一般用app包名 option java_package = "com.company.project"; //指定生成的java类名XxxProto option java_outer_classname = "XxxProto"; //Message对象名,一般认为Message和Java中的Class关键字类似 message XxxProtoMsg { string xxx = 1; // 参数 }
2022年12月20日 于苏州姑苏