aliyun / iotkit-embedded

高速镜像: https://code.aliyun.com/linkkit/c-sdk
Apache License 2.0
496 stars 252 forks source link

V3.0.1 SDK可能出现随机的消息丢失情况 #153

Closed bzd2132 closed 4 years ago

bzd2132 commented 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里面。

    /* 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的都可能出现类似的问题。

edwardyangx commented 4 years ago

你好在这里已经修复

https://github.com/aliyun/iotkit-embedded/commit/2dcdfa6a89278fd33a4cec480497df835d0296b5