【发布时间】:2020-04-06 12:45:45
【问题描述】:
尝试使用 Ionic 4 中的协议缓冲区来编码和解码消息。曾尝试使用 protobufjs 和 google-protobuf,但都无法正常工作。
我已经下载了 protoc 并用它来生成一堆 _pb.js 文件,每个 .proto 文件一个。没关系。
首先关注 protobuf 示例。下面是示例代码:
import { load } from "protobufjs"; // respectively "./node_modules/protobufjs"
load("awesome.proto", function(err, root) {
if (err)
throw err;
// example code
const AwesomeMessage = root.lookupType("awesomepackage.AwesomeMessage");
let message = AwesomeMessage.create({ awesomeField: "hello" });
console.log(`message = ${JSON.stringify(message)}`);
let buffer = AwesomeMessage.encode(message).finish();
console.log(`buffer = ${Array.prototype.toString.call(buffer)}`);
let decoded = AwesomeMessage.decode(buffer);
console.log(`decoded = ${JSON.stringify(decoded)}`);
});
我做了一些更改以匹配我的文件。更改原始文件的名称。但是我的 proto 文件中没有包名。所以我只使用了消息名称。首先这是我的 .proto 文件的开始:
syntax = "proto3";
import "constants.proto";
import "wifi_constants.proto";
message CmdScanStart {
bool blocking = 1;
bool passive = 2;
uint32 group_channels = 3;
uint32 period_ms = 4;
}
message RespScanStart {
}
message CmdScanStatus {
}
message RespScanStatus {
bool scan_finished = 1;
uint32 result_count = 2;
}
下面是我修改后的代码:
load("../../assets/proto/wifi_scan.proto", function(err, root) {
if (err)
throw err;
// example code
const AwesomeMessage = root.lookupType("RespScanStatus");
let message = AwesomeMessage.create({ scan_finished: 1, result_count: 31 }); // uint32 result_count
console.log(`message = ${JSON.stringify(message)}`);
let buffer = AwesomeMessage.encode(message).finish();
console.log(`buffer = ${Array.prototype.toString.call(buffer)}`);
let decoded = AwesomeMessage.decode(buffer);
console.log(`decoded = ${JSON.stringify(decoded)}`);
});
它似乎不起作用。我的控制台显示:
[ng] [console.log]: "message = {}"
[ng] [console.log]: "buffer = "
[ng] [console.log]: "decoded = {}"
我相信我已经确定了该文件并选择了一个有效的消息名称。但是如果我有一个引用其他原始文件的原始文件。这在运行时如何解决?我认为使用预建的 _pb.js 文件会更有意义。什么是awesomepackage?我的 proto 文件没有包!为什么不断提到令人敬畏的事情?不太好:令人困惑!
这段代码看起来可以直接使用 .proto 文件。但是您不需要 protoc 来执行此操作吗?这不一定可用。如果您知道发生了什么,这似乎很明显,但对我来说并没有完全融合在一起。请帮忙。
【问题讨论】:
-
不熟悉您的原型加载方法。正如您最初提到的那样,我通常使用 protoc 提前生成 javascript pb.js 文件。也许你期待一种不存在的行为。 FWIW,我已经使用 protoc 生成了 js grpc 存根,所以我知道它可以工作。
-
谢谢@bvj。启发我专注于预生成的 _pb.js 方法。我使用了 google-protobuf 插件而不是 protobufjs,并且运气更好。
标签: angular ionic-framework protocol-buffers