我有各种类型的传感器在运行,创建定期事件并在线发布数据。有一个包含有关传感器的信息的总体事件结构,以及一个包含数据的子消息,具体取决于传感器的类型。事件结构如下所示:
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;我创建了一个旨在编码子消息的encode 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);
}一旦数据在接收器被发送和解码,子消息数据就是垃圾。但是,类型和地址的编码始终是正确的。我完全不知道原因是什么。任何帮助或建议都将不胜感激!
发布于 2020-11-27 01:46:40
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语言的类型系统不允许在编译时检测这样的错误。
https://stackoverflow.com/questions/65025859
复制相似问题