Kaa Data Collection on Request,Not Loop

时间:2018-03-16 06:46:55

标签: c kaa

我在做Kaa项目。 首先,我使用了数据收集演示,然后对我的传感器进行了一些修改。数据每秒发送到平台(我可以配置它)。

现在,我想创建一些服务,如果我发送请求(使用ulfius框架),我的设备上传1个数据。

我的问题是,我必须做超过10个上传数据的请求,我该如何解决。请帮助。

以下是我的一些代码:

int callback_kaa(const struct _u_request * request,struct _u_response * response, void * user_data){ 
    kaa_client_send(kaa_client, &kaa_add_log_record, (void *)kaa_client);
    ulfius_set_string_body_response(response, 200, "Hello Kaa!");}

int main(/*int argc, char *argv[]*/){
   printf("DHT11 Logging Demo\n");
   if (wiringPiSetup() == -1) {
       printf("Failed to initialize Pi wiring\n");
       exit(1);}

   if (ulfius_init_instance(&instance, PORT, NULL, NULL) != U_OK) {
       fprintf(stderr, "Error ulfius_init_instance, abort\n");
       return(1);}
   ulfius_add_endpoint_by_val(&instance, "POST", "/kaaplatform", NULL, 0,&callback_kaa, NULL);


   kaa_error_t error_code = kaa_client_create(&kaa_client, NULL);
   KAA_RETURN_IF_ERROR(error_code, "Failed create Kaa client");

   kaa_log_bucket_constraints_t bucket_sizes = {
      .max_bucket_size = MAX_LOG_BUCKET_SIZE,
      .max_bucket_log_count = 1,};

   error_code = ext_unlimited_log_storage_create(&log_storage_context, 
   kaa_client_get_context(kaa_client)->logger);
   KAA_RETURN_IF_ERROR(error_code, "Failed to create unlimited log storage");

   error_code = ext_log_upload_strategy_create(kaa_client_get_context(kaa_client), &log_upload_strategy_context, THRESHOLD_COUNT_FLAG);
   KAA_RETURN_IF_ERROR(error_code, "Failed to create log upload strategy");

   error_code = ext_log_upload_strategy_set_threshold_count(log_upload_strategy_context, KAA_UPLOAD_COUNT_THRESHOLD);
   KAA_RETURN_IF_ERROR(error_code, "Failed to set threshold log record count");

   error_code = kaa_logging_init(kaa_client_get_context(kaa_client)>log_collector
                            , log_storage_context
                            , log_upload_strategy_context
                            , &bucket_sizes);
   KAA_RETURN_IF_ERROR(error_code, "Failed to init Kaa log collector");

   kaa_channel_manager_set_auth_failure_handler(
        kaa_client_get_context(kaa_client)->channel_manager,
        auth_failure_handler, kaa_client);
   const uint8_t *endpoint_key_hash = NULL;
   size_t endpoint_key_hash_length = 0;

   ext_get_sha1_base64_public(&endpoint_key_hash, &endpoint_key_hash_length);

   printf("Endpoint Key Hash: %.*s\n", (int)endpoint_key_hash_length,endpoint_key_hash);
   if (ulfius_start_framework(&instance) == U_OK) {
       printf("Start framework on port %d\n", instance.port);
       getchar();
   } else {
       fprintf(stderr, "Error starting framework\n");
   }
   kaa_client_destroy(kaa_client);

   printf("Data analytics demo stopped\n");
   ulfius_stop_framework(&instance);
   ulfius_clean_instance(&instance);

   return error_code;
   }

并且,我在文件kaa_client.h创建了一些函数(kaa_client_send):

void kaa_client_send(kaa_client_t *kaa_client,external_process_fn external_process, void *external_process_context)
{
KAA_RETURN_IF_NIL(kaa_client, KAA_ERR_BADPARAM);

kaa_error_t error_code = kaa_check_readiness(kaa_client->kaa_context);
if (error_code != KAA_ERR_NONE) {
    KAA_LOG_ERROR(kaa_client->kaa_context->logger, error_code, "Cannot start Kaa client: Kaa context is not fully initialized");
    return error_code;
}

kaa_client->external_process_fn = external_process;
kaa_client->external_process_context = external_process_context;
kaa_client->external_process_max_delay = 5;
kaa_client->external_process_last_call = KAA_TIME();

KAA_LOG_INFO(kaa_client->kaa_context->logger, KAA_ERR_NONE, "Starting Kaa client...");
if (kaa_client->external_process_fn) {
        kaa_client->external_process_fn(kaa_client->external_process_context);
        kaa_client->external_process_last_call = KAA_TIME();
}
//Check Kaa channel is ready to transmit something
if (kaa_process_failover(kaa_client->kaa_context)) {
    kaa_client->boostrap_complete = false;
} else {
    if (kaa_client->channel_id > 0) {
        if (kaa_client->channel_state == KAA_CLIENT_CHANNEL_STATE_NOT_CONNECTED) {
            error_code = kaa_client_process_channel_disconnected(kaa_client);
        } else  if (kaa_client->channel_state == KAA_CLIENT_CHANNEL_STATE_CONNECTED) {
            error_code = kaa_client_process_channel_connected(kaa_client);
            if (error_code == KAA_ERR_TIMEOUT)
                kaa_client_deinit_channel(kaa_client);
        }
    } else {
        //No initialized channels
        if (kaa_client->boostrap_complete) {
            KAA_LOG_INFO(kaa_client->kaa_context->logger, KAA_ERR_NONE,
                        "Channel [0x%08X] Boostrap complete, reinitializing to Operations ...", kaa_client->channel_id);
            kaa_client->boostrap_complete = false;
            kaa_client_deinit_channel(kaa_client);
            error_code = kaa_client_init_channel(kaa_client, KAA_CLIENT_CHANNEL_TYPE_OPERATIONS);
            if (error_code == KAA_ERR_BAD_STATE) {
                kaa_client_deinit_channel(kaa_client);
                kaa_client->boostrap_complete = false;
            }
        } else {
            KAA_LOG_INFO(kaa_client->kaa_context->logger, KAA_ERR_NONE,
                        "Channel [0x%08X] Operations error, reinitializing to Bootstrap ...", kaa_client->channel_id);
            kaa_client->boostrap_complete = true;
            kaa_client_deinit_channel(kaa_client);
            kaa_client_init_channel(kaa_client, KAA_CLIENT_CHANNEL_TYPE_BOOTSTRAP);
        }
    }
}

KAA_LOG_INFO(kaa_client->kaa_context->logger, KAA_ERR_NONE, "Kaa client stopped");
return error_code;

}

0 个答案:

没有答案