试图了解protoBuf二进制流

时间:2017-05-02 20:53:34

标签: arduino protocol-buffers

编辑:反映@jpa回复。

我正在访问使用Arduino和以太网屏蔽通过UDP生成数据的服务器。数据是protobuf的形式,我有.proto文件,但实施nanopb对我来说是一个挑战。与此同时,我试图使用此reference手动解码二进制流 - 这对我来说可能更容易。

我仍然不确定如何解码(在HEX中)。例如,为什么数据包2-9充斥着FF?我相信这里是int64时间戳所在的位置。我还注意到数据包12-15也可以保存FF,我假设因为这是浮动所在的位置。

默认情况下,ProtoBufData的数据类型为:int64,float,bool。但是能够流ExtProtoBufData:int64,float,bool, float,float (扩展)。

.proto文件:

select 
    t.[Record#]
  , t.Date 
from tbl t 
where t.Date >= @start_date
  and t.Date <= @end_date 
  and exists (
  select 1
  from tbl i
  where i.[Record#] = t.[Record#]
    and i.Date >= @start_date
    and i.Date <= @end_date
  group by dateadd(month, datediff(month, 0, i.Date), 0)
  having count(distinct dateadd(month, datediff(month, 0, i.Date), 0)) = 12
  )
order by [Record#]

下面是输出(ProtoBufData)。我注意到大部分时间我收到了17个“字节”,但有时我收到了15个。如果有人可以帮忙解码,我会非常感激:

package ProtoBufData;

message ExtendedProtoBufSensorData {
   optional float Angle1 = 4 [default = 0];
   optional float Angle2 = 5 [default = 0];
}
message ProtoBufSensorData {
   required int64 Timestamp = 1 [default = 0];
   optional float SensorValue = 2 [default = 0];
   optional bool State = 3 [default = false];
   // the following represent sub-types; at most 1 should have a value
   optional ExtendedProtoBufSensorData ExtendedProtoBufSensorData = 100;
}

这是ExtendedProtoBufData的输出。大多数时候我得到30“字节”但有时我得到28。

PACKET 1: 8
PACKET 2: FFFFFFB3
PACKET 3: FFFFFFE7
PACKET 4: FFFFFFAB
PACKET 5: FFFFFFA9
PACKET 6: FFFFFF97
PACKET 7: FFFFFFAF
PACKET 8: FFFFFFA4
PACKET 9: FFFFFFEA
PACKET 10: 8
PACKET 11: 15
PACKET 12: 2B
PACKET 13: 28
PACKET 14: 3
PACKET 15: 42
PACKET 16: 18
PACKET 17: 1

谢谢,

1 个答案:

答案 0 :(得分:0)

打印字节的方式有问题。部分原因似乎是您在无意中某处将unsigned值投射到signed,这会导致0xB3打印为0xFFFFFFB3

这是您的数据包,其中包含了这个混乱:

0x08 0xB3 0xE7 0xAB 0xA9 0x97 0xAF 0xA4
0xEA 0x08 0x15 0x2B 0x28 0x03 0x42 0x18
0x01

现在我们可以手动解码:

0x08  Tag 1, varint
0xB3 0xE7 0xAB 0xA9 0x97 0xAF 0xA4 0xEA   Varint field value

0x08 Tag 1, varint

0x15 0x2B 0x28 0x03 0x42 0x18 0x01 .. didn't bother this far ..

这没有多大意义。我假设您的打印中存在一些剩余的错误,因此请专注于首先使其可靠地工作。

也许尝试检查调试器或网络记录器中的消息数据,以验证您的打印功能是否正确打印。