第三节——pcbook项目建立
Posted 想学习安全的小白
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第三节——pcbook项目建立相关的知识,希望对你有一定的参考价值。
第三章——定义pcbook项目中的protobuf 消息并生成 Go 代码
3.1、安装 vscode 插件
- 市场搜索
ext:proto
,安装插件vscode-proto3
- 新建项目,命令:
mkdir -p pcbook/proto
- 在proto目录下创建proto文件,命令:
touch processor_message.proto
- 设置proto3插件
- file->Preferences->settings->proto3->Edit in settings.jons
- 输入
"protoc":
"path": "/usr/local/bin/protoc",
"options": [
"--proto_path=proto",
]
- 安装clang-format插件,vscode安装好后,执行命令:
sudo apt-get install clang-format
3.2、定义 protobuf 消息
- 定义一个名为CPU的message消息
- 字符串类型的品牌(brand)与名称(name)
- 无符号32为整型的内核(number_cores)与线程(number_threads)
- double类型的最小(min_ghz)和最大频率(max_ghz)
syntax = "proto3";
option go_package="../pb;pb";
message CPU
string brand = 1;
string name = 2;
uint32 number_cores = 3;
uint32 number_threads = 4;
double min_ghz = 5;
double max_ghz = 6;
3.3、生成go代码
- 使用命令:
go mod init pcbook
创建go.mod文件 - 使用命令获取grpc包,命令:
go get -u google.golang.org/grpc
- 创建pb文件夹
- 在工程目录下使用命令:
protoc --proto_path=proto --go_out=pb --go-grpc_out=pb proto/*.proto
生成pb文件 - 创建Makefile文件用于执行便捷化命令
gen:
protoc --proto_path=proto --go_out=pb --go-grpc_out=pb proto/*.proto
clean:
rm pb/*.go
3.4、定义其它类型的proto文件
3.4.1、定义GPU消息
-
字符串类型的品牌(brand)与名称(name)
-
double类型的最小(min_ghz)和最大频率(max_ghz)
message GPU
string brand = 1;
string name = 2;
double min_ghz = 3;
double max_ghz = 4;
3.4.2、定义Memory消息
-
在proto文件夹中创建memory_message.proto文件
-
在Memory消息类型中定义一个枚举类型,从 BIT 到 TERABYTE
-
定义Memory消息的属性:一个用于值,另一个用于单位
message Memory
enum Unit
UNKNOWN = 0;
BIT = 1;
BYTE = 2;
KILOBYTE = 3;
MEGABYTE = 4;
GIGABYTE = 5;
TERABYTE = 6;
uint64 value = 1;
Unit unit = 2;
-
在GPU消息中引用Memory类型
-
使用import引入memory_message.proto文件
-
在GPU消息中使用Memory类型
-
syntax = "proto3";
option go_package="../pb;pb";
import "memory_message.proto";
message CPU
string brand = 1;
string name = 2;
uint32 number_cores = 3;
uint32 number_threads = 4;
double min_ghz = 5;
double max_ghz = 6;
message GPU
string brand = 1;
string name = 2;
double min_ghz = 3;
double max_ghz = 4;
Memory memory =5;
3.4.3、定义存储消息
- 创建文件
storage_message.proto
- 用Driver定义两个枚举——HDD与SSD
- 在存储消息中添加 2 个字段:驱动程序类型和内存大小(引入memory包)
syntax = "proto3";
option go_package="../pb;pb";
import "memory_message.proto";
message Storage
enum Driver
UNKNOWN = 0;
HDD = 1;
SSD = 2;
Driver driver = 1;
Memory memory = 2;
3.4.4、定义键盘消息
- 新建一个proto文件——
keyboard_message.proto
- 定义一个Keyboard消息
- 消息里定义一个Layout枚举类,具有 QWERTY、QWERTZ 或 AZERTY 布局
- 定义bool类型的backlit,用于表示键盘是否背光
3.4.5、定义屏幕消息
- 新建一个proto文件——screen_message.proto
- 定义一个Screen消息
- 在Screen消息体里嵌套一个Resolution消息体用于指明分辨率
- 定义unint32类型的width与height
- 在Screen消息体里定义一个面板材料(Panel)枚举类型——IPS与OLED
- 定义Screen消息体的属性
- float size_inch 大小(单位:英寸)
- Resolution resolution 分辨率
- Panel panel 面板材料
- bool multitouch 是否是触屏
message Screen
message Resolution
uint32 width=1;
uint32 height=2;
enum Panel
UNKNOW=0;
IPS=1;
OLED=2;
float size_inch=1;
Resolution resolution=2;
Panel panel=3;
bool multitouch=4;
3.4.6、定义笔记本电脑消息
- 创建proto文件——laptop_message.proto
- 定义字符型id,brand,name;CPU cpu;memory ram;
- 一台笔记本电脑可以有多个 GPU,所以我们使用
repeated
关键字告诉 protoc 这是一个 GPU 列表 - 储存也是多个,也使用关键字
repeated
定义 - 再定义屏幕与键盘
- 用double定义重量,但这里允许使用公斤与磅两个单位,所以使用oneof定义weigth
- 再添加 2 个字段:美元价格(double price_usd)和笔记本电脑的发布年份(uint32 release_year)
syntax="proto3";
option go_package="../pb;pb";
import "processor_message.proto";
import "memory_message.proto";
import "storage_message.proto";
import "screen_message.proto";
import "keyboard_message.proto";
message Laptop
string id=1;
string brand=2;
string name=3;
CPU cpu=4;
Memory memory=5;
repeated GPU gpu=6;
repeated Storage storage=7;
Screen screen=8;
Keyboard keyboard=9;
oneof weight
double weight_kg=10;
double weight_lb=11;
double price_usd = 12;
uint32 release_year = 13;
以上是关于第三节——pcbook项目建立的主要内容,如果未能解决你的问题,请参考以下文章