Каа не отправляет событие
Я установил сервер 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
...