纳米波:子消息解码导致错误的数据



我运行各种传感器类型,创建周期性事件并在线发布数据。有一个包含传感器信息的整体事件结构和一个包含数据的子消息(取决于传感器的类型(。事件结构如下所示:

typedef struct _Event {
PayloadType type;
pb_callback_t address;
pb_size_t which_payload;
union {
UnknownEvent unknown_event;
Sensor1Event sensor1_event;
} payload;
} Event;

1号传感器结构的特定传感器1事件:

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语言的类型系统不允许在编译时检测到这样的错误。

最新更新