Kaa 不发送事件
Kaa doesn't send event
我架设了一个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);
}
问题描述
在 callback()
的开头你定义了 kaa_string_t plate;
==>
意思是它的内存分配在栈上。
稍后在同一范围内,您将创建一个指向 plate_event
的指针,它将用作您要发送的事件的参数。
在发送事件之前,您要分配 plate_event->plate = &plate
。这意味着 plate_event->plate
现在指向堆栈上的地址 。
然后,(根据您在评论中写的内容)您将使用 异步函数 发送事件。这意味着正在执行这个函数的线程并不是在等待消息真正被发送——这就是异步函数的意义。其他东西(可能是不同的线程,取决于 send_event 函数的实现)将负责发送。因此,不能保证在执行下一行代码之前发送消息。
在您的情况下,很可能在发送消息之前,callback()
的范围已结束。因此此scope的内存自动释放,从此失效,包括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
...
我架设了一个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);
}
问题描述
在 callback()
的开头你定义了 kaa_string_t plate;
==>
意思是它的内存分配在栈上。
稍后在同一范围内,您将创建一个指向 plate_event
的指针,它将用作您要发送的事件的参数。
在发送事件之前,您要分配 plate_event->plate = &plate
。这意味着 plate_event->plate
现在指向堆栈上的地址 。
然后,(根据您在评论中写的内容)您将使用 异步函数 发送事件。这意味着正在执行这个函数的线程并不是在等待消息真正被发送——这就是异步函数的意义。其他东西(可能是不同的线程,取决于 send_event 函数的实现)将负责发送。因此,不能保证在执行下一行代码之前发送消息。
在您的情况下,很可能在发送消息之前,callback()
的范围已结束。因此此scope的内存自动释放,从此失效,包括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
...