我之前也在这个软件包遇到了几个问题在这里分享一下我是怎么找到问题的吧
是没对齐的问题,这里我打了一个补丁
https://github.com/jiejieTop/mqttclient/pull/63,但是作者没合,你可以参考一下
如果订阅的信息不是直接写死的,比如name是malloc出来零时赋值的,传给mqtt后又被free了,这时也会出现一些问题,因为这个软件包只保存了那个临时指针,并没有保存真实的数据,修复方式类似于这样,以topic为例,其他的像name一样的类推:
static message_handlers_t *mqtt_msg_handler_create(const char *topic_filter, mqtt_qos_t qos, message_handler_t handler)
{
message_handlers_t *msg_handler = NULL;
msg_handler = (message_handlers_t *)platform_memory_alloc(sizeof(message_handlers_t));
if (NULL == msg_handler)
return NULL;
mqtt_list_init(&msg_handler->list);
msg_handler->qos = qos;
msg_handler->handler = handler; /* register callback handler */
msg_handler->topic_filter = rt_malloc(rt_strlen(topic_filter) + 1);
rt_strncpy(msg_handler->topic_filter, topic_filter, rt_strlen(topic_filter) + 1);
return msg_handler;
}
记得在释放的时候也销毁掉
static void mqtt_msg_handler_destory(message_handlers_t *msg_handler)
{
if (NULL != &msg_handler->list) {
mqtt_list_del(&msg_handler->list);
platform_memory_free(msg_handler->topic_filter);
platform_memory_free(msg_handler);
}
}
我之前也在这个软件包遇到了几个问题在这里分享一下我是怎么找到问题的吧
是没对齐的问题,这里我打了一个补丁
https://github.com/jiejieTop/mqttclient/pull/63,但是作者没合,你可以参考一下
如果订阅的信息不是直接写死的,比如name是malloc出来零时赋值的,传给mqtt后又被free了,这时也会出现一些问题,因为这个软件包只保存了那个临时指针,并没有保存真实的数据,修复方式类似于这样,以topic为例,其他的像name一样的类推:
static message_handlers_t *mqtt_msg_handler_create(const char *topic_filter, mqtt_qos_t qos, message_handler_t handler)
{
message_handlers_t *msg_handler = NULL;
msg_handler = (message_handlers_t *)platform_memory_alloc(sizeof(message_handlers_t));
if (NULL == msg_handler)
return NULL;
mqtt_list_init(&msg_handler->list);
msg_handler->qos = qos;
msg_handler->handler = handler; /* register callback handler */
msg_handler->topic_filter = rt_malloc(rt_strlen(topic_filter) + 1);
rt_strncpy(msg_handler->topic_filter, topic_filter, rt_strlen(topic_filter) + 1);
return msg_handler;
}
记得在释放的时候也销毁掉
static void mqtt_msg_handler_destory(message_handlers_t *msg_handler)
{
if (NULL != &msg_handler->list) {
mqtt_list_del(&msg_handler->list);
platform_memory_free(msg_handler->topic_filter);
platform_memory_free(msg_handler);
}
}
举报