Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

converting python dict to protobuf

How can I convert the following dict to protobuf ?
I have to send a protobuf as a payload to an mqtt broker. I'm using python 3.8

publish_msg = {
        "token":"xxxxxxxx",
        "parms":{
            "fPort":8,
            "data":b"MDQzYzAwMDE=",
            "confirmed":False,
            "devEUI":"8CF9572000023509"
        }
    }

My protobuf is defined as follows:

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;
}
like image 588
leauradmin Avatar asked Jun 24 '26 04:06

leauradmin


2 Answers

How about this?

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)
like image 85
thayne Avatar answered Jun 26 '26 17:06

thayne


A good answer for converting from dict to protobuf, see: https://stackoverflow.com/a/60348876/249226. Reproduced in part here.

Example usage:

Given a protobuf message like this:

message Thing {
    string first = 1;
    bool second = 2;
    int32 third = 3;
}

You can use the ParseDict method provided by Google protobuf:

import json

from google.protobuf.json_format import ParseDict

d = {
    "first": "a string",
    "second": True,
    "third": 123456789
}

message = ParseDict(d, Thing())  

print(message.first)  # "a string"
print(message.second) # True
print(message.third)  # 123456789
like image 41
Jonathan Avatar answered Jun 26 '26 17:06

Jonathan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!