Каа не отправляет событие

Я установил сервер Kaa и разработал приложение с помощью SDK. но приложение не отправляет сообщения о событиях. это приложение должно отправить номерной знак автомобилей, въехавших на парковку, на сервер, а также отправить событие в другое приложение (приложение-получатель). приложение отправляет данные на сервер, но не отправляет события.

в чем проблема?

это мой код:

static void callback(void *context)
{
    kaa_string_t plate;
    kaa_user_log_record_t *log_record = kaa_logging_data_collection_create();
    plate.data = "some license plate";
    log_record->plate = &plate;
    kaa_logging_add_record(kaa_client_get_context(context)->log_collector, log_record, NULL);
    printf("%s uploaded\n", plate.data);

    kaa_plate_detection_event_plate_event_t *plate_event = kaa_plate_detection_event_plate_event_create();
    plate_event->plate = &plate;
    kaa_error_t error_code = kaa_event_manager_send_kaa_plate_detection_event_plate_event(
            kaa_client_get_context(context)->event_manager, plate_event, NULL);
    //plate_event->destroy(plate_event);
    printf("%s event sent\n", plate.data);
}

1 ответ

Решение

описание проблемы

В начале callback() вы определяете kaa_string_t plate; ==> Это означает, что его память размещена в стеке.

Позже в той же области вы создаете указатель на plate_eventи будет использоваться в качестве аргумента для события, которое вы хотите отправить.

Прежде чем отправить событие, вы назначаете plate_event->plate = &plate, Это означает, что plate_event->plate теперь указывает на адрес в стеке.

Затем (согласно тому, что вы написали в комментариях) вы отправляете событие, используя асинхронную функцию. Это означает, что поток, выполняющий эту функцию, не ожидает реального отправки сообщения - это означает асинхронную функцию. Что-то еще (возможно, другой поток, в зависимости от реализации функции send_event) позаботится об отправке. Следовательно, не гарантируется, что сообщение будет отправлено до выполнения следующих строк кода.

В вашем случае вероятно, что до того, как сообщение было отправлено, область действия callback() закончился. Поэтому память этой области автоматически освобождается и становится недействительной, включая kaa_string_t plate, Затем в какой-то момент выполняется асинхронная отправка, но она полагается на недопустимую память, потому что теперь plate_event->plate указывает на память, которая уже была освобождена.

Возможное решение

Вместо выделения kaa_string_t plate в стеке, выделить его в куче (malloc). Тогда память действительна, пока вы не освободите ее самостоятельно, когда вы уверены, что сообщение уже было отправлено.

Что-то вроде того:

kaa_string_t *plate = malloc(sizeof(kaa_string_t));
strncpy(plate, "some license plate", sizeof(kaa_string_t));
...
// Now it's safe to do this:
plate_event->plate = plate;
// Sending event code
...
Другие вопросы по тегам