Kaa不发送活动

时间:2017-06-22 10:27:11

标签: c iot kaa

我已经设置了一个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 个答案:

答案 0 :(得分: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
...