将Python字典转换为Protobuf

4
如何将以下字典转换为 protobuf 格式? 我需要将 protobuf 作为有效载荷发送到 mqtt broker。 我正在使用 Python 3.8。
publish_msg = {
        "token":"xxxxxxxx",
        "parms":{
            "fPort":8,
            "data":b"MDQzYzAwMDE=",
            "confirmed":False,
            "devEUI":"8CF9572000023509"
        }
    }

我的protobuf定义如下:

syntax = "proto3";
package publish;


message DLParams{
    string DevEUI = 1;
    int32 FPort = 2;
    bytes Data = 3;
    bool Confirm = 4;
}

message DeviceDownlink {
    string Token = 1;
    DLParams Params = 2;
}

也许你可以添加一些示例Python代码,以说明你想要做什么。 - Dima Daron
我已经解决了这个问题。我想以protobuf的形式发送消息。谢谢。 - leauradmin
1个回答

4

这个怎么样?

import json
from google.protobuf import json_format

# Create an empty message
dl = DeviceDownlink_pb2.DeviceDownlink()

# Get the json string for your dict
json_string = json.dumps(publish_msg)

# Put the json contents into your message
json_format.Parse(json_string, dl)

如果proto有任何类型为google.protobuf.Timestamp的字段,并且字典将它们作为子字典,例如"my_timestamp_field": {"seconds": 1234567, "nanos": 1234567},则会导致崩溃。对于这种方法,您有什么想法如何处理这些字段? - kilgoretrout
我只能猜测你的错误信息,但是要确保字典键精确匹配protobuf消息的定义。您可以尝试手动构建消息并将其打印出来以查看确切的字段名称。或者检查.proto文件。 - thayne
这个稳定吗? - Amir reza Riahi
我无法从软件维护者的角度评论其稳定性,但它由通常具有良好软件质量的谷歌公司维护。从用户的角度来看,我没有遇到任何稳定性问题。 - thayne
3
您可以跳过将中间结果转换为JSON字符串的步骤,直接使用json_format.ParseDict(publish_msg, dl) - Michael Schock

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接