gpt4 book ai didi

c - 使用可选字段从 RPI3 将日志模式发送到 kaa 服务器

转载 作者:行者123 更新时间:2023-11-30 15:00:18 25 4
gpt4 key购买 nike

我正在尝试将日志模式从树莓派 C 应用程序发送到后端 kaa 服务器。这是架构

{
"type" : "record",
"name" : "RemoteSensorLog",
"namespace" : "org.kaa.iot.log.sensor",
"fields" : [ {
"name" : "deviceId",
"type" : {
"type" : "string",
"avro.java.string" : "String"
}
}, {
"name" : "temperature",
"type" : [ "double", "null" ]
}, {
"name" : "humidity",
"type" : [ "long", "null" ]
}, {
"name" : "batteryLevel",
"type" : [ "int", "null" ]
} ],
"version" : 1,
"dependencies" : [ ],
"displayName" : "RemoteSensorLog",
"description" : "This is the log sent by remote sensors"
}

日志模式中的一些项目是可选的,这里是初始化函数

void kaaLogInitializing(void *context)
{
void *log_storage_context = NULL;
void *log_upload_strategy_context = NULL;

printf("Initializing the Kaa log\n");

kaa_client_t * kaa_client_context = context;

if (context == NULL) {
return;
}

/* Log delivery listener callbacks. Each callback called whenever something happen with a log bucket. */
kaa_log_delivery_listener_t log_listener = {
.on_success = success_log_delivery_callback, /* Called if log delivered successfully */
.on_failed = failed_log_delivery_callback, /* Called if delivery failed */
.on_timeout = timeout_log_delivery_callback, /* Called if timeout occurs */
.ctx = kaa_client_context, /* Optional context */
};

/* The internal memory log storage distributed with Kaa SDK */
kaa_error_t error_code = ext_unlimited_log_storage_create(&log_storage_context,
kaa_client_get_context(
kaa_client_context
)->logger
);

if (error_code) {
printf("Failed to create Kaa log storage %d\r\n", error_code);
return;
}

error_code = ext_log_upload_strategy_create(kaa_client_get_context(
kaa_client_context),
&log_upload_strategy_context, KAA_LOG_UPLOAD_VOLUME_STRATEGY);

if (error_code) {
printf("Failed to create log upload strategy, error code %d\r\n", error_code);
return;
}

error_code = ext_log_upload_strategy_set_threshold_count(log_upload_strategy_context,
LOG_UPLOAD_THRESHOLD);

if (error_code) {
printf("Failed to set threshold log record count, error code %d\r\n", error_code);
return;
}

error_code = kaa_logging_set_strategy(kaa_client_get_context(kaa_client_context)->log_collector,
log_upload_strategy_context);

if (error_code) {
printf("Failed to set log upload strategy, error code %d\r\n", error_code);
return;
}

/* Specify log bucket size constraints */
kaa_log_bucket_constraints_t bucket_sizes = {
.max_bucket_size = MAX_LOG_BUCKET_SIZE, /* Bucket size in bytes */
.max_bucket_log_count = MAX_LOG_COUNT, /* Maximum log count in one bucket */
};

/* Initialize the log storage and strategy (by default it is not set) */
error_code = kaa_logging_init(kaa_client_get_context(
kaa_client_context)->log_collector
, log_storage_context
, log_upload_strategy_context
, &bucket_sizes);

if (error_code) {
printf("Failed to initialize Kaa log %d\r\n", error_code);
return;
}

/* Add listeners to a log collector */
kaa_logging_set_listeners(kaa_client_get_context(
kaa_client_context)->log_collector,
&log_listener);
}

这是我用来发送日志的函数

void sendLog(void *context)
{
kaa_client_t * kaa_client_context = context;
float temperature = 25.5;

if (context == NULL) {
return;
}

logDelivered = LOG_DELIVERY_DELIVERING;

printf("Start attempt to send Log\n");

kaa_logging_remote_sensor_log_t *log_record = kaa_logging_remote_sensor_log_create();

log_record->device_id = kaa_string_copy_create("Dev1");
log_record->temperature = kaa_logging_union_double_or_null_branch_0_create();
log_record->temperature->data = &temperature; /* create subobject */

log_record->humidity = kaa_logging_union_long_or_null_branch_1_create();
log_record->battery_level = kaa_logging_union_int_or_null_branch_1_create();

printf("Log record created\n");
/* Log information. Populated when log is added via kaa_logging_add_record() */
kaa_log_record_info_t log_info;

kaa_error_t error = kaa_logging_add_record(
kaa_client_get_context(kaa_client_context)->log_collector,
log_record, &log_info);

if (error) {
printf("Failed to add log record, error code\r\n");
kaa_client_stop(kaa_client_context);
return;
}

//log_record->destroy(log_record);
}

我有两个问题

  • 问题1 ####:如果我取消注释 sendLog 函数中的最后一行log_record->destroy(log_record);,我收到此错误双重释放或损坏(输出):0x7efe05
  • 问题2 ####:在评论上述行并运行应用程序后,我从未收到任何错误,或者服务器获取日志似乎没有发生任何事情,我收到的日志发送成功或失败或超时。

最佳答案

需要手动分配内存来存储温度值。它将在log_record->destroy(log_record)中被释放。

所以,你需要做这样的事情:

double *p_temperature = KAA_MALLOC(sizeof(double));
if (!p_temperature) {
// error handling
}

*p_temperature = 25.5;
log_record->temperature->data = p_temperature;

关于c - 使用可选字段从 RPI3 将日志模式发送到 kaa 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42197185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com