Closed bzd2132 closed 4 years ago
在dm_manager.c里面,需要获得message id并存在msg_cache里面,例如下面的代码 dm_msg_cache_insert(request.msgid, request.devid, IOTX_DM_EVENT_SUBDEV_UNREGISTER_REPLY, NULL); 目前的实现是在调用dm_msg_request成功后才将request.msgid存入,我们在调试的过程中发现有云端返回消息丢失的情况,因为request.msgid还没有加入到msg cache里面。
dm_msg_cache_insert(request.msgid, request.devid, IOTX_DM_EVENT_SUBDEV_UNREGISTER_REPLY, NULL);
/* Get Msg ID */ request.msgid = iotx_report_id(); /* Get Dev ID */ request.devid = devid; /* Callback */ request.callback = dm_client_thing_sub_register_reply; /* Send Message To Cloud */ res = dm_msg_request(DM_MSG_DEST_CLOUD, &request); //调用还没有返回,已经收到了云端的返回 #if !defined(DM_MESSAGE_CACHE_DISABLED) if (res == SUCCESS_RETURN) { //将msgid放入已经太晚了,因为云端返回的消息没有找到对应的msgid,并将消息丢弃。 dm_msg_cache_insert(request.msgid, request.devid, IOTX_DM_EVENT_SUBDEV_REGISTER_REPLY, NULL); res = request.msgid; } #endif DM_free(request.params); return res;
我们修改代码为下面所示,就没有发现丢失的问题。
/* Get Msg ID */ request.msgid = iotx_report_id(); /* Get Dev ID */ request.devid = devid; /* Callback */ request.callback = dm_client_thing_sub_register_reply; /* Cache msg first*/ #if !defined(DM_MESSAGE_CACHE_DISABLED) dm_msg_cache_insert(request.msgid, request.devid, IOTX_DM_EVENT_SUBDEV_REGISTER_REPLY, NULL); #endif /* Send Message To Cloud */ res = dm_msg_request(DM_MSG_DEST_CLOUD, &request); #if !defined(DM_MESSAGE_CACHE_DISABLED) if (res == SUCCESS_RETURN) { res = request.msgid; } else { dm_msg_cache_remove(request.msgid); } #endif DM_free(request.params); return res;
以上只是一个例子,所有相关msgid的都可能出现类似的问题。
你好在这里已经修复
https://github.com/aliyun/iotkit-embedded/commit/2dcdfa6a89278fd33a4cec480497df835d0296b5
在dm_manager.c里面,需要获得message id并存在msg_cache里面,例如下面的代码
dm_msg_cache_insert(request.msgid, request.devid, IOTX_DM_EVENT_SUBDEV_UNREGISTER_REPLY, NULL);
目前的实现是在调用dm_msg_request成功后才将request.msgid存入,我们在调试的过程中发现有云端返回消息丢失的情况,因为request.msgid还没有加入到msg cache里面。我们修改代码为下面所示,就没有发现丢失的问题。
以上只是一个例子,所有相关msgid的都可能出现类似的问题。