库选用
C#使用protobuf-net
Arduino使用nanopb
数据格式定义
创建 .proto
文件
syntax = "proto3"; // 使用的 Protocol Buffers 版本
import "other_file.proto"; // 引入其他定义文件
//定义消息
message MessageName {
int32 id = 1; // 类型 + 字段名称 + 标签
string name = 2; // 标签用于标识字段顺序
repeated string tags = 3; // 重复字段 Array
}
// 定义枚举
enum Status {
UNKNOWN = 0;
ACTIVE = 1;
INACTIVE = 2;
}
数据类型 说明
double 64 位浮点数
float 32 位浮点数
int32 32 位有符号整数(适合小范围整数)
int64 64 位有符号整数(适合大范围整数)
uint32 32 位无符号整数
uint64 64 位无符号整数
sint32 32 位有符号整数,使用 ZigZag 编码以节省空间
sint64 64 位有符号整数,使用 ZigZag 编码以节省空间
fixed32 32 位固定宽度的有符号整数
fixed64 64 位固定宽度的有符号整数
sfixed32 32 位固定宽度的无符号整数
sfixed64 64 位固定宽度的无符号整数
bool 布尔值,true 或 false
string UTF-8 编码的字符串
bytes 原始二进制数据(字节数组)
C#使用protobuf-net后则简单的多,不需要单独编写.proto
文件 直接像使用数据类一样使用即可
using ProtoBuf;
using System.Collections.Generic;
namespace ProtobufExample
{
// 定义消息类
[ProtoContract]
public class MessageName
{
[ProtoMember(1)] // 标签对应字段顺序
public int Id { get; set; }
[ProtoMember(2)]
public string Name { get; set; }
[ProtoMember(3)]
public List<string> Tags { get; set; } = new List<string>(); // 重复字段,使用 List
}
// 定义枚举
[ProtoContract]
public enum Status
{
[ProtoEnum]
UNKNOWN = 0,
[ProtoEnum]
ACTIVE = 1,
[ProtoEnum]
INACTIVE = 2
}
}
生成protoc文件
Arduino
在Arduino 编写完.proto文件后 需要生成.pb.c和.pb.h才可以使用 具体命令如下python generator/nanopb_generator.py 你写的.proto
nanopb_generator.py可在Nanopb – downloads这里下载解压后使用
使用它要先安装依赖 pip install --upgrade protobuf grpcio-tools
C#
虽然他可以不用写.proto文件 但我们也一样可以使用工具将.proto文件转为C#的实体
可以使用NuGet 库 |protobuf-net 的Protogen 安装他 他可以作为全局工具使用dotnet tool install --global protobuf-net.Protogen
生成命令protogen --proto_path=. --csharp_out=Generated 你写的.proto