Tôi đã thiết lập máy chủ Kaa và phát triển một ứng dụng bằng SDK. Nhưng ứng dụng không gửi tin nhắn sự kiện. Ứng dụng này sẽ gửi biển số xe đang vào bãi đỗ về máy chủ và gửi sự kiện đến ứng dụng khác (ứng dụng người nhận). Ứng dụng sẽ gửi dữ liệu nhưng không gửi sự kiện đến máy chủ.
有什么问题吗?
Đây là mã của tôi:
gọi lại void tĩnh (void *bối cảnh)
{
tấm kaa_string_t;
kaa_user_log_record_t *log_record = kaa_logging_data_collection_create();
Plate.data = "một số biển số xe";
log_record->plate = &plate;
kaa_logging_add_record(kaa_client_get_context(context)->log_collector, log_record, NULL);
printf("%s đã tải lên\n", Plate.data);
kaa_plate_Detection_event_plate_event_t *plate_event = kaa_plate_Detection_event_plate_event_create();
tấm_event->tấm = &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 sự kiện đã được gửi\n", Plate.data);
}
Mô tả vấn đề
hiện hữu gọi lại()
Lúc đầu bạn đã xác định tấm kaa_string_t;
==>Điều này có nghĩa là bộ nhớ của nó được cấp phát trên ngăn xếp.
Sau này trong phạm vi tương tự, bạn sẽ tạo một con trỏ tới tấm_sự kiện
Một con trỏ sẽ được sử dụng làm tham số cho sự kiện bạn muốn gửi.
Trước khi gửi sự kiện, bạn chỉ định tấm_event->tấm = &tấm
. điều này có nghĩa tấm_event->tấm
bây giờ trỏ đếnđịa chỉ trên ngăn xếp.
Sau đó, (dựa trên những gì bạn đã viết trong bình luận của mình), bạn sẽ sử dụnghàm không đồng bộ Gửi sự kiện. Điều này có nghĩa là luồng đang thực thi chức năng này không chờ tin nhắn thực sự được gửi - đây là ý nghĩa của các hàm không đồng bộ. Một cái gì đó khác (có thể là một luồng khác, tùy thuộc vào việc triển khai hàm send_event) sẽ chịu trách nhiệm gửi. Do đó, không có gì đảm bảo rằng tin nhắn sẽ được gửi trước khi dòng mã tiếp theo được thực thi.
Trong trường hợp của bạn, rất có thể trước khi gửi tin nhắn,gọi lại()
Phạm vi đã kết thúc. Vì vậy, bộ nhớ của phạm vi này sẽ tự động được giải phóng và trở nên không hợp lệ kể từ bây giờ, bao gồm cảtấm kaa_string_t
. Sau đó, tại một thời điểm nào đó, quá trình gửi không đồng bộ đang được thực thi nhưng nó dựa vào bộ nhớ không hợp lệ vì bây giờ tấm_event->tấm
Trỏ đến bộ nhớ được giải phóng.
giải pháp khả thi
Không được phân bổ trên ngăn xếp tấm kaa_string_t
, thay vào đó hãy phân bổ nó trên heap (malloc
). Bộ nhớ sau đó vẫn còn hiệu lực cho đến khi bạn tự giải phóng nó, khi bạn chắc chắn rằng tin nhắn đã được gửi.
Một cái gì đó như:
kaa_string_t *plate = malloc(sizeof(kaa_string_t));
strncpy(plate, "một số biển số xe", sizeof(kaa_string_t));
...
// Bây giờ đã an toàn để thực hiện việc này:
tấm_event->tấm = tấm;
// Gửi mã sự kiện
...
Tôi là một lập trình viên xuất sắc, rất giỏi!