2017-02-13 11 views
0

Я пытаюсь отправить схему журнала из приложения paspa малины, на задний сервер kaa. Вот схемаОтправка схемы журнала на сервер kaa из RPI3 с необязательными полями

{ 
"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 ####: после комментирования указанной строки и запуска приложения я никогда не получаю никаких ошибок или сервер не получает log ничего, кажется, не происходит, ни я не получаю, журнал был отправлен успешно, или сбой или тайм-аут.

ответ

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 –