我收集的信息根据我的原型文件(列在下面)。然后使用SerializeToString()方法将其序列化为字节字符串。然后,使用ParseFromString()方法将字节字符串消息和反序列化转化为proto对象。但是,如果我填写一些字段零值并执行上面的算法,如下所示:
def test():
fdm = device_pb2.FromDeviceMessage()
fdm.deveui = bytes.fromhex('1122334455667788')
fdm.fcntup = 0
fdm.battery = 3.5999999046325684
fdm.mode = 0
fdm.event = 1
port = fdm.data.add()
port.port = 1 #device_pb2.PortData.Name(0)
port.value = 0
c = fdm.SerializeToString()
return c
def parse_test(data):
print(data)
res = device_pb2.FromDeviceMessage()
res.ParseFromString(data)
return res
print(parse_test(test())),然后python控制台将向我展示:
deveui: "\021\"3DUfw\210"
battery: 3.5999999046325684
event: PERIOD_EVENT
data {
port: VIBR2
}没有字段,值为零。
但我想看看:
deveui: "\021\"3DUfw\210"
fcntup: 0
battery: 3.5999999046325684
mode: BOUNDARY
event: PERIOD_EVENT
data {
port: VIBR2
value: 0
}为什么会发生这种事,如果它是固定的,我怎样才能解决它?
=============Proto_File================
message FromDeviceMessage{
bytes deveui = 1;
uint32 ts = 2;
int32 fcntup = 3;
float battery = 4;
int32 period = 5;
Mode mode = 6;
Event event = 7;
repeated PortData data = 8;
}
message PortData{
DevicePort port = 1;
int32 value = 2;
}
enum Mode{
BOUNDARY = 0;
PERIOD = 1;
BOUNDARY_PERIOD = 2;
}
enum Event{
BOUNDARY_EVENT = 0;
PERIOD_EVENT = 1;
}
enum DevicePort{
VIBR1 = 0;
VIBR2 = 1;
TEMPL2 = 3;
}发布于 2019-04-29 20:13:40
所以我想我猜到了原因。在情况下,enum type ( DevicePort,Event,Mode):默认值是第一个定义的枚举值,必须为0。因此,我将设置一个值来查看所需的字段。在其他情况下:不显示具有零值的字段以减少包的内存大小。但是,如果我使用这样的方式转到所需的字段:res.data[0].value (在def parse_test(data)中),它将向我显示0,例如,如果我在字段value中设置值0。这个规则在所有情况下都有效。
https://stackoverflow.com/questions/55871436
复制相似问题