Nanopb:子消息解码导致数据不正确
Nanopb: Submessage decoding results in incorrect data
我有各种传感器类型 运行,创建周期性事件并在线发布数据。有一个包含有关传感器信息的整体事件结构和一个包含数据的子消息,具体取决于它是什么类型的传感器。事件结构如下所示:
typedef struct _Event {
PayloadType type;
pb_callback_t address;
pb_size_t which_payload;
union {
UnknownEvent unknown_event;
Sensor1Event sensor1_event;
} payload;
} Event;
以及传感器 nr 1 结构的特定 Sensor1Event:
typedef struct _Sensor1Event {
uint64_t device_id;
uint64_t time;
Sensor1EventType type;
uint16_t lux;
uint16_t co2;
uint16_t voc;
uint8_t mic;
uint8_t temp;
uint8_t humidity;
uint16_t in_count;
uint16_t out_count;
int16_t aggregated_count;
} Sensor1Event;
我创建了一个编码 pb_callback_t 回调函数,旨在对子消息进行编码。
这是我的方法:
Event SEvent = Event_init_zero;
Sensor1Event s1evt = {0,0,0, 0, 0,0,temp_processed, 0,0,0,0}; //fill with dummy vals for now
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
...
...
SEvent.address = adr; //predetermined address assigned here
SEvent.type = PayloadType_Sensor1; // predefined value here
SEvent.sensor1_event.arg = &s1evt;
SEvent.sensor1_event.funcs.encode = &encode_sensor_data;
pb_encode(&stream, Event_fields, &SEvent);
encode_sensor_data函数:
bool encode_data(pb_ostream_t *stream, const pb_field_iter_t *field, void * const *arg)
{
Sensor1Event * evt = (Sensor1Event *)(*arg);
if (!pb_encode_tag_for_field(stream, field))
return false;
return pb_encode_submessage(stream, Sensor1Event_fields, &evt);
}
一旦数据被发送并在接收方解码,子消息数据就是垃圾。然而,类型和地址的编码总是正确的。我完全不知道原因是什么。任何帮助或建议将不胜感激!
bool encode_data(pb_ostream_t *stream, const pb_field_iter_t *field, void * const *arg)
{
Sensor1Event * evt = (Sensor1Event *)(*arg);
.....
return pb_encode_submessage(stream, Sensor1Event_fields, &evt);
}
我想你的问题可能出在这里。参数 &evt
将创建一个指向消息指针的指针。但是,pb_encode_submessage()
期望收到指向子消息的指针,而不是双指针。
因此,请尝试 pb_encode_submessage(stream, Sensor1Event_fields, evt)
。
不幸的是,C 语言的类型系统不允许在编译时检测到这样的错误。
我有各种传感器类型 运行,创建周期性事件并在线发布数据。有一个包含有关传感器信息的整体事件结构和一个包含数据的子消息,具体取决于它是什么类型的传感器。事件结构如下所示:
typedef struct _Event {
PayloadType type;
pb_callback_t address;
pb_size_t which_payload;
union {
UnknownEvent unknown_event;
Sensor1Event sensor1_event;
} payload;
} Event;
以及传感器 nr 1 结构的特定 Sensor1Event:
typedef struct _Sensor1Event {
uint64_t device_id;
uint64_t time;
Sensor1EventType type;
uint16_t lux;
uint16_t co2;
uint16_t voc;
uint8_t mic;
uint8_t temp;
uint8_t humidity;
uint16_t in_count;
uint16_t out_count;
int16_t aggregated_count;
} Sensor1Event;
我创建了一个编码 pb_callback_t 回调函数,旨在对子消息进行编码。
这是我的方法:
Event SEvent = Event_init_zero;
Sensor1Event s1evt = {0,0,0, 0, 0,0,temp_processed, 0,0,0,0}; //fill with dummy vals for now
pb_ostream_t stream = pb_ostream_from_buffer(buffer, sizeof(buffer));
... ...
SEvent.address = adr; //predetermined address assigned here
SEvent.type = PayloadType_Sensor1; // predefined value here
SEvent.sensor1_event.arg = &s1evt;
SEvent.sensor1_event.funcs.encode = &encode_sensor_data;
pb_encode(&stream, Event_fields, &SEvent);
encode_sensor_data函数:
bool encode_data(pb_ostream_t *stream, const pb_field_iter_t *field, void * const *arg)
{
Sensor1Event * evt = (Sensor1Event *)(*arg);
if (!pb_encode_tag_for_field(stream, field))
return false;
return pb_encode_submessage(stream, Sensor1Event_fields, &evt);
}
一旦数据被发送并在接收方解码,子消息数据就是垃圾。然而,类型和地址的编码总是正确的。我完全不知道原因是什么。任何帮助或建议将不胜感激!
bool encode_data(pb_ostream_t *stream, const pb_field_iter_t *field, void * const *arg)
{
Sensor1Event * evt = (Sensor1Event *)(*arg);
.....
return pb_encode_submessage(stream, Sensor1Event_fields, &evt);
}
我想你的问题可能出在这里。参数 &evt
将创建一个指向消息指针的指针。但是,pb_encode_submessage()
期望收到指向子消息的指针,而不是双指针。
因此,请尝试 pb_encode_submessage(stream, Sensor1Event_fields, evt)
。
不幸的是,C 语言的类型系统不允许在编译时检测到这样的错误。