kaa_error_t kaa_client_channel_error(kaa_client_t *kaa_client) { KAA_RETURN_IF_NIL(kaa_client, KAA_ERR_BADPARAM); kaa_error_t error_code = KAA_ERR_NONE; ledOff(); KAA_LOG_INFO(kaa_client->kaa_context->logger, KAA_ERR_NONE, "Kaa tcp channel error"); kaa_client->channel_state = KAA_CLIENT_CHANNEL_STATE_NOT_CONNECTED; if (kaa_client->channel_id > 0 ) { error_code = kaa_tcp_channel_disconnected(&kaa_client->channel); } kaa_client_deinit_channel(kaa_client); return error_code; }
kaa_error_t kaa_client_start(kaa_client_t *kaa_client, external_process_fn external_process, void *external_process_context, kaa_time_t max_delay) { KAA_RETURN_IF_NIL(kaa_client, KAA_ERR_BADPARAM); kaa_error_t error_code = kaa_check_readiness(kaa_client->context); if (error_code != KAA_ERR_NONE) { KAA_LOG_ERROR(kaa_client->context->logger, error_code, "Cannot start Kaa client: Kaa context is not fully initialized"); return error_code; } kaa_client->external_process = external_process; kaa_client->external_process_context = external_process_context; kaa_client->external_process_max_delay = max_delay; kaa_client->external_process_last_call = KAA_TIME(); KAA_LOG_INFO(kaa_client->context->logger, KAA_ERR_NONE, "Starting Kaa client..."); while (kaa_client->operate) { if (kaa_client->external_process) { if (KAA_TIME() - kaa_client->external_process_last_call >= (kaa_time_t)kaa_client->external_process_max_delay) { kaa_client->external_process(kaa_client->external_process_context); kaa_client->external_process_last_call = KAA_TIME(); } } if (kaa_process_failover(kaa_client->context)) { kaa_client->bootstrap_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->bootstrap_complete) { KAA_LOG_INFO(kaa_client->context->logger, KAA_ERR_NONE, "Channel [0x%08X] Boostrap complete, reinitializing to Operations ...", kaa_client->channel_id); kaa_client->bootstrap_complete = false; kaa_client_deinit_channel(kaa_client); 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->bootstrap_complete = false; } } else { KAA_LOG_INFO(kaa_client->context->logger, KAA_ERR_NONE, "Channel [0x%08X] Operations error, reinitializing to Bootstrap ...", kaa_client->channel_id); kaa_client->bootstrap_complete = true; kaa_client_deinit_channel(kaa_client); kaa_client_init_channel(kaa_client, KAA_CLIENT_CHANNEL_TYPE_BOOTSTRAP); } } } #ifndef KAA_DISABLE_FEATURE_LOGGING ext_log_upload_timeout(kaa_client->context->log_collector); #endif } KAA_LOG_INFO(kaa_client->context->logger, KAA_ERR_NONE, "Kaa client stopped"); return error_code; }
kaa_error_t kaa_client_process_channel_connected(kaa_client_t *kaa_client) { KAA_RETURN_IF_NIL(kaa_client, KAA_ERR_BADPARAM); fd_set read_fds, write_fds, except_fds; struct timeval select_tv = { get_poll_timeout(kaa_client), 0 }; int channel_fd = 0; FD_ZERO(&read_fds); FD_ZERO(&write_fds); FD_ZERO(&except_fds); kaa_error_t error_code = kaa_tcp_channel_get_descriptor(&kaa_client->channel, &channel_fd); if(error_code) KAA_LOG_ERROR(kaa_client->context->logger, error_code, "No descriptor provided!"); if (kaa_tcp_channel_is_ready(&kaa_client->channel, FD_READ)) FD_SET(channel_fd, &read_fds); if (kaa_tcp_channel_is_ready(&kaa_client->channel, FD_WRITE)) FD_SET(channel_fd, &write_fds); int poll_result = select(channel_fd + 1, &read_fds, &write_fds, NULL, &select_tv); if (poll_result == 0) { error_code = kaa_tcp_channel_check_keepalive(&kaa_client->channel); } else if (poll_result > 0) { if (channel_fd >= 0) { if (FD_ISSET(channel_fd, &read_fds)) { KAA_LOG_DEBUG(kaa_client->context->logger, KAA_ERR_NONE, "Processing IN event for the client socket %d", channel_fd); error_code = kaa_tcp_channel_process_event(&kaa_client->channel, FD_READ); if (error_code) { KAA_LOG_ERROR(kaa_client->context->logger, error_code, "Failed to process IN event for the client socket %d", channel_fd); } } if (FD_ISSET(channel_fd, &write_fds)) { KAA_LOG_DEBUG(kaa_client->context->logger, KAA_ERR_NONE, "Processing OUT event for the client socket %d", channel_fd); error_code = kaa_tcp_channel_process_event(&kaa_client->channel, FD_WRITE); if (error_code) { KAA_LOG_ERROR(kaa_client->context->logger, error_code, "Failed to process OUT event for the client socket %d", channel_fd); } } } } else { KAA_LOG_ERROR(kaa_client->context->logger, KAA_ERR_BAD_STATE, "Failed to poll descriptors"); error_code = KAA_ERR_BAD_STATE; } if (kaa_client->channel_socket_closed) { KAA_LOG_INFO(kaa_client->context->logger, KAA_ERR_NONE, "Channel [0x%08X] connection terminated", kaa_client->channel_id); kaa_client->channel_state = KAA_CLIENT_CHANNEL_STATE_NOT_CONNECTED; if (error_code != KAA_ERR_EVENT_NOT_ATTACHED) { kaa_client_deinit_channel(kaa_client); } } return error_code; }
kaa_error_t kaa_client_start(kaa_client_t *kaa_client , external_process_fn external_process , void *external_process_context , kaa_time_t max_delay) { KAA_RETURN_IF_NIL(kaa_client, KAA_ERR_BADPARAM); kaa_error_t error_code = KAA_ERR_NONE; esp8266_error_t esp_error = ESP8266_ERR_NONE; kaa_client->external_process_fn = external_process; kaa_client->external_process_context = external_process_context; kaa_client->external_process_max_delay = max_delay; kaa_client->external_process_last_call = get_sys_milis(); KAA_LOG_INFO(kaa_client->kaa_context->logger, KAA_ERR_NONE, "Starting Kaa client..."); const kaa_configuration_root_receiver_t config_receiver = { kaa_client, configuration_update }; error_code = kaa_configuration_manager_set_root_receiver(kaa_client->kaa_context->configuration_manager, &config_receiver); if (error_code) { KAA_LOG_ERROR(kaa_client->kaa_context->logger, error_code, "Error registering Configuration root receiver"); return error_code; } const kaa_root_configuration_t *config = kaa_configuration_manager_get_configuration(kaa_client->kaa_context->configuration_manager); if (config) { configuration_update(kaa_client, config); } uint8 *buffer = NULL; size_t buffer_size = 0; int send_c = 0; int tmp; while (kaa_client->operate) { if ((get_sys_milis() - kaa_client->external_process_last_call) >= kaa_client->external_process_max_delay) { if (kaa_client->external_process_fn) { kaa_client->external_process_fn(kaa_client->external_process_context); } kaa_client->external_process_last_call = get_sys_milis(); } if (kaa_client->connection_state == KAA_CLIENT_WIFI_STATE_CONNECTED) { esp_error = esp8266_process(kaa_client->controler, kaa_client->external_process_max_delay); if (esp_error) { KAA_LOG_ERROR(kaa_client->kaa_context->logger, KAA_ERR_NONE, "ESP8266 process failed code: %d", esp_error); kaa_client_esp8266_error(kaa_client); } //Check Kaa channel is ready to transmit something 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); } } 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); kaa_client_init_channel(kaa_client, KAA_CLIENT_CHANNEL_TYPE_OPERATIONS); } 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); } } } else { kaa_client_state_process(kaa_client); } } KAA_LOG_INFO(kaa_client->kaa_context->logger, KAA_ERR_NONE, "Kaa client Stopped"); return error_code; }