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.

[参考译文] CC3200:MQTT 库强制断开连接、然后重新连接-连接到代理失败

Guru**** 2782615 points

Other Parts Discussed in Thread: CC3200SDK, CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/658581/cc3200-mqtt-library-force-disconnect-then-reconnect---connection-to-broker-fails

器件型号:CC3200

你(们)好  

我需要强制从 MQTT 代理断开连接、然后在生成新密钥后重新连接。

当我在几个断开/重新连接过程后执行此操作时、我无法重新连接到代理、直到器件被重置。

MQTT 库仅初始化一次。

断开连接时会删除上下文、并在重新连接之前创建上下文。

sl_ExtLib_MqttClientConnect() 函数返回249。

Thx

Emilio

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

    是否可以确认已成功删除代理的断开连接和上下文?

    也许可以尝试比较您在 SDK 中处理与 MQTT_CLIENT 示例的连接/断开的方式:

    C:\ti\cc3200SDK_1.3.0\cc3200-sdk\examples\mqtt_client

    此外、SDK 中的 MQTT API 函数在以下目录中有进一步说明:

    C:\ti\cc3200SDK_1.3.0\cc3200-sdk\docs\netapps\mqt\sl\client =>打开 sl_mqtt_client.chm

    希望这对您有所帮助、
    Kevin
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Kevin

    我可以确认断开与服务器的连接成功、但在断开连接上下文删除失败后(返回-1)。

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

    在函数内对 MQTT 库进行进一步分析:

    MQTT_CLIENT_ctx_DELETE ()(MQTT_CLIENT.c)、

    我根据发生故障的位置修改了返回值、并确定上下文删除在测试时失败:

    if (-1!= cl_ctx->net)

    网络套接字未关闭?

    请提供建议。

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

    大家好、Kevin

    在删除上下文之前、我还需要做什么?

    Rgds

    Emilio

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

    您好、Emilio、

    我不确定、但示例程序似乎只是调用了 Disconnect 函数、后跟上下文删除函数。

    {
    UART_PRINT ("\n\r 转换号的订阅错误 %d\n\r\n"、iCount+1);
    UART_PRINT ("从代理断开连接\r\n);
    sl_ExtLib_MqttClientDisconnect (local_con_conf[iCount].clt_ctx);
    local_con_conf[iCount].is_connected = false;
    
    //删除此连接的上下文
    sl_ExtLib_MqttClientCtxDelete (local_con_conf[iCount].clt_ctx);
    iConnBroker --;
    中断;
    } 

    我将尝试在我的终端上执行一些测试、以便在可能的情况下正确断开连接并删除上下文。 可能需要删除上下文才能真正断开连接、但我现在不确定。 我还查看了 SDK 的 MQTT 特定发行说明、但在初始审阅后、我看不到任何突出的内容。

    最棒的

    Kevin

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

    谢谢 Kevin

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

    大家好、Kevin

    您是否对此有任何更新?

    Rgds

    Emilio

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

    我昨天开始研究这个问题、但至今还没有任何值得报告的东西。 很抱歉耽误你的时间。

    从我到目前为止的调查中、我想上下文删除需要成功才能完全断开连接。

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

    您好、Emilio、

    我想向您提供有关我的调查结果的最新信息。

    从 SDK 中的 MQTT 客户端库帮助文件中、客户端库只能支持有限数量的"上下文"或单个连接。 您可能满足了库可以处理的最大上下文、并且必须先正确删除这些上下文、然后才能建立更多连接。 请阅读以下内容:

    客户端库支持与一台或多台服务器同时连接多个 MQTT。 在此客户端 LIB 中、对
    单个连接的引用与关联的配置参数被称为"上下文"。 因此、
    客户端库支持多个"上下文"。 打算使用客户端库的应用程序必须在
    与服务器建立连接之前设置或创建"上下文"。
    在与服务器的连接终止后、应用程序可以选择销毁"上下文"。 客户端 LIB 只能支持有限的"上下文"集、并且可以使用编译器行
    选项/标志-DCFG_CL_MQTT_CTS 来配置该数字。 

    帮助文件位置:C:\ti\CC3200SDK_1.3.0\cc3200-sdk\docs\netapps\mqt\lib\client

    最棒的

    Kevin

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    大家好、Kevin
    谢谢。
    我的应用程序仅使用一个上下文。
    由于网络套接字未关闭、上下文不会删除。
    Rgds
    Emilio
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Emilio、

    您使用的是哪个 SDK 版本? 如果仍有问题、请尝试以下 E2E 帖子中讨论的解决方法吗?

    e2e.ti.com/.../565792

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

    大家好、Kevin

    1.3.0

    断开连接返回正常。

    问题是上下文删除返回错误、如上所述->网络套接字未关闭。  我使用的是安全套接字连接 TLS 1.2。

    Thx

    Emilio

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

    您好、Emilio、

    我曾尝试按照之前 E2E 帖子中的建议进行操作、似乎效果非常好:

    https://e2e.ti.com/support/wireless_connectivity/simplelink_wifi_cc31xx_cc32xx/f/968/p/553736/2025112?pi239031350=2#pi320098=1

    在 MQTT_CLIENT SDK 示例中、我使 SW2按钮导致 MQTT 客户端断开:

    if (push_button_SW2_pressed = RecvQue.event)
    {
    button_if_EnableInterrupt (SW2);
    
    //注释掉发布代码以添加强制断开连接...
    
    UART_PRINT ("--------------) 强制断开连接--- \r\n");
    
    UART_PRINT ("从代理断开连接\r\n);
    disc_check = sl_ExtLib_MqttClientDisconnect (local_con_conf[iCount].clt_ctx);
    local_con_conf[iCount].is_connected = false;
    } 

    然后、当按下按钮时、它将强制断开连接并导致发生代理断开连接事件。 在代理断开连接语句中、我添加了 goto connect_to 代理:

    否则、if (broker_sDISCONNINNINNING_= RecvQue.event)
    {
    // iConnBroker --;
    /*从消息导出 local_con_conf 或 CLT_ctx 的值*/
    contDel_check = sl_ExtLib_MqttClientCtxDelete (((connect_config*)(RecvQue.hndl)->CLT_ctx);
    
    UART_PRINT ("正在发生上下文删除... \n\n");
    
    button_if_EnableInterrupt (SW2);//添加以获取按钮中断以使其正常工作
    
    转至 connect_TO_Broker;//添加到 test
    
    if (!is_connected (g_ulStatus))(如果!is_connected (g_ulStatus)
    {
    UART_PRINT ("设备已从 AP 断开连接\n\r\n);
    
    UART_PRINT ("重试连接到 AP\n\r\n);
    
    while (!(is_connected (g_ulStatus)))||!(is_ip_acquired (g_ulStatus)))
    {
    OSI_SLEEP (10);
    }
    转至 connect_to 代理;
    
    }
    if (iConnBroker < 1)
    {
    //
    //未连接到任何代理的设备
    //
    转至结束;
    }
    }
    

    确保注释掉上面的 iConnBroker--;以防止应用程序结束

    尽管我没有使用安全套接字 TLS 1.2进行测试、但这似乎可以重复断开/重新连接。 在我的案例中、上下文删除始终返回成功。 您能否尝试将此过程实施到您的代码中、或将您的代码引入到示例中?

    希望这对您有所帮助、

    Kevin

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

    大家好、Kevin

    抱歉我的回复太晚了...

    是的、这起作用了。

    非常感谢您的坚持。

    感谢 TI 在 CC3200中提供出色的产品和出色的支持...

    Rgds

    Emilio