This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC3220SF-LAUNCHXL:CC3220

Guru**** 688030 points
Other Parts Discussed in Thread: CC3220SF
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1095016/cc3220sf-launchxl-cc3220

部件号:CC3220SF-LAUNCHXL
主题中讨论的其他部件:CC3220SF

大家好,

          我正在尝试在CC3220SF模块中实施OTA。 我可以从服务器获取文件并升级OTA,但文件下载完成后,我的MQTT断开连接。 我甚至尝试通过执行MQTT_INIT和MQTT_START来重新连接到MQTT,但没有任何功能,MCU进入 挂起状态。 OTA升级的日志文件已附加。 执行SL_STOP后出现以下错误。  

00:04:07 INFO ../APP/MQTT_CLIENT_CBS.c:180:MQTT客户端已断开连接!!
00:04:07 debug ../app/event_queue.c:95:发射到应用程序事件队列,事件=6
00:04:07调试../app/event_queue.c:146:发射到MQTT事件队列中,事件= 12
00:04:07错误../app/MQTT_client_task.c:634:无法推入/topic/device/version/progress -错误:-7

请查看随附的日志以了解更多信息。

e2e.ti.com/.../CC3220SF_2D00_OTA.txt

我对"OTA_test_and_reset_handler"的功能如下:-

Int32_t ota_test_and_reset_handler()

Int32_t RetVal;

log_info("OtaImageTestingAndReset: Download done");
/* char *有效负载=(char *) malloc(512);

sprintf (有效载荷,"{\"deviceId\":\"%16s\","
"\"状态\":\"已升级\",\"进度\":100}",
aquaiConfig.deviceId);
//将有效负载推送到MQTT队列
MqttEventPayload_t mqttEvt;
mqttEvt.event = publish_ota_progress;
mqttEvt.msgPtr =有效载荷;
mqttEvt.msgLen = strlen(有效载荷);
EVENT_QUEUE_EMIT_MQTT (&mqttEvt);*/
MQTT_SEND (publish_ota_progress,128,
"{\"deviceId\":\"%16s\","
"\"状态\":\"已升级\",\"进度\":100}",
gAppConfig.deviceId);

/*休眠以确保MQTT推送数据*/
睡眠(1);

log_info(.
"OtaImageTestingAndReset:调用SL_Stop以将分发包移动到"
"测试状态");
SL_Stop (SL_STOP_TIMEOUT);
log_info(.
"OtaImageTestingAndReset: Reset the platform to test the new"(OtaImageTestingAndReset:重置平台以测试新的
"图像...");
platform_reset();

/*如果我们到达此处,则平台不支持自重置*/
/*重置NWP以测试新图像*/
log_info(.
"OtaImageTestingAndReset: Platform does not support self reset";
log_info(.
"OtaImageTestingAndReset:Reset the NWP to test the new image");

RetVal = Network_if_InitDriver(Role_STA);
//MQTT_init();
//MQTT_start();

/* SL_Stop/Start将生成EVENT APP_EVENT_STARTTED*/
Return (RetVal);
}

有人能帮我解决这个问题吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我不确定下载完成后您到底在做什么,但这可能是问题的根源。  

    您是否正在使用httpclient下载内容? 如果是,则完成不应影响MQTT。 只有以后执行的操作(如SL_Stop)才会执行。

    在调用SL_Stop之前,尝试关闭MQTT连接(然后重置平台)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,感谢您的回复。 我做了一件事,我从收到MQTT断开连接消息的位置再次手动添加了MQTT连接。 在情况下,MQTTClient_disconnect_CB_event:在 MqttClientCallback()函数内。  

    案例MQTTClient_disconnect_CB_event:

    AppContext_t * const pCtx =&gAppCtx;

    LOG_INFO ("CQTT客户端已断开连接!!");

    EVENT_QUEUE_EMIT_APP (APP_EVENT_MQTT_DISCONNECTED);
    /* MQTT初始化*/
    MQTT_init();

    /*创建队列*/
    int32_t ret = event_queue_create_app();

    如果(ret < 0){
    LOG_ERROR ("无法创建应用程序事件队列");
    }

    pCtx->currentState = app_State_starting;
    pCTX->pendingEvents =0;

    /*启动驱动程序*/
    int retc = Network_if_InitDriver(Role_STA);
    如果(retc < 0){
    log_error("启动SimpleLink设备失败",retc);
    EVENT_QUEUE_EMIT_APP (APP_EVENT_ERROR);
    }

    中断;
    }

    这是正确的重新连接方式吗? 我尝试重新连接其它功能,但无法正常工作。 这是临时的解决方法,但您能否建议我一种更好的方法?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我认为您在这方面做得太多了(不需要MQTT_init(),Network_if_InitDriver())。

    请参阅最新的MQTT示例(在SDK.530或SDK 6.10 中),该示例具有更简单的MQTT界面。

    我仍然不理解断开连接的原因(是否总是在OTA下载完成后?)。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的,它始终在OTA完成后断开连接。 一旦OTA完成,它将进入SL_STOP,并在该MQTT断开后立即进入。 我的代码中使用的是sdn千5.20。无法更新代码,因为它是由其他人在5.20 版本中开发的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    SL_Stop (关闭NWP)不是OTA下载的一部分。 只有在您决定执行MCU重置(即启用新版本)时,才应调用它,到那时,MQTT连接仍应关闭。 在示例中,一旦下载完成,MCU重置就会发生,但如果您正在进行其他活动 (如MQTT发布),则可以延迟。

    调用SL_Stop后,所有网络活动将断开连接。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    BTW。在执行MCU重置之前必须调用SL_Stop (SL_Stop会将设备置于"测试"模式,该模式将在重置后识别-因此它将是"待定提交"),一旦调用SL_Stop,则不应在MCU重置之前调用SL_Start。