首页 > 解决方案 > 使用“protoc --decode”解码二进制数据失败,出现错误“类型未定义”

问题描述

我在我的项目中使用谷歌的协议缓冲区进行通信,我正在尝试使用他们的命令行工具 protoc 手动解码一些二进制数据(十六进制格式)。这是我正在使用的命令:

echo 08015a325a300a0d313932 | xxd -r -p | protoc --decode=WiFiConfigPayload wifi_config.proto

我从此命令以及我为“--decode”指定的任何其他类型收到以下错误:

类型未定义:WiFiConfigPayload

这是我正在使用的主要 .proto 文件(它是由 espressif 创建的,用于他们的 esp32 芯片)。此文件还导入了其他 .proto 文件,如果有人认为它相关,可以在此处找到。

syntax = "proto3";
package espressif;

import "constants.proto";
import "wifi_constants.proto";

message CmdGetStatus {

}

message RespGetStatus {
    Status status = 1;
    WifiStationState sta_state = 2;
    oneof state {
        WifiConnectFailedReason fail_reason = 10;
        WifiConnectedState connected = 11;
    }
}

message CmdSetConfig {
    bytes ssid = 1;
    bytes passphrase = 2;
    bytes bssid = 3;
    int32 channel = 4;
}

message RespSetConfig {
    Status status = 1;
}

message CmdApplyConfig {

}

message RespApplyConfig {
    Status status = 1;
}

enum WiFiConfigMsgType {
    TypeCmdGetStatus = 0;
    TypeRespGetStatus = 1;
    TypeCmdSetConfig = 2;
    TypeRespSetConfig = 3;
    TypeCmdApplyConfig = 4;
    TypeRespApplyConfig = 5;
}

message WiFiConfigPayload {
    WiFiConfigMsgType msg = 1;
    oneof payload {
        CmdGetStatus cmd_get_status = 10;
        RespGetStatus resp_get_status = 11;
        CmdSetConfig cmd_set_config = 12;
        RespSetConfig resp_set_config = 13;
        CmdApplyConfig cmd_apply_config = 14;
        RespApplyConfig resp_apply_config = 15;
    }
}

关于为什么命令无法从 .protoc 文件解析 WifiConfigPayload 类型(或任何类型)的任何想法?

标签: iosesp32protocol-buffers

解决方案


我也遇到了这个问题,我认为你错过了实际的错误。protoc 可能会抱怨,因为您没有通过包引用该消息。

protoc --decode=<PackageName>.MessageName

在您的情况下,PackageName 是 espressif

echo 08015a325a300a0d313932 | xxd -r -p | protoc --decode=espressif.WiFiConfigPayload wifi_config.proto

推荐阅读