2017-02-13 32 views
0

我想从树莓派C应用程序发送日志模式到后端kaa服务器。 这里是架构从带有可选字段的RPI3发送日志模式到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); 
} 

我有2个问题

  • 问题1 ####:如果我取消注释sendLog函数中的最后一行log_record->destroy(log_record);我得到这个错误double free or corruption (out): 0x7efe05
  • 问题2 ####:在评论提到的行并运行应用程序后,我从来没有得到任何错误或服务器获取日志似乎没有发生,我既没有收到日志,也没有发送成功或失败或超时。

回答

1

您需要手动分配内存来存储温度值。它将被释放在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; 
+0

感谢这么多,就是这样,我虽然面临着一些新的奇怪的行为,这是启动客户端= 1秒时,我从来没有得到过日志中,除非延迟'''error = kaa_client_start(kaa_client,kaa_loop,(void *)kaa_client,1);'''如果1被更改为任何数字,则日志永远不会被服务器端收到 –

+0

以下是我正面临的新行为看看http://stackoverflow.com/questions/42216357/strange-behavior-from-kaa-c-sdk-on-rpi3 –