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.

[参考译文] LAUNCHXL-CC3235SF:ioithub 客户端示例 MQTT -服务器无响应

Guru**** 2589085 points
Other Parts Discussed in Thread: LAUNCHXL-CC3235SF, CC3235SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1170767/launchxl-cc3235sf-iothub-client-sample-mqtt---no-response-from-server

器件型号:LAUNCHXL-CC3235SF
主题中讨论的其他器件: CC3235SF

您好!

我已在 Launchxl-cc3235sf 板上下载了 iothub 客户端示例 MQTT 示例。 我可以通过在 wiiconfig 中提供接入点详细信息来建立网络连接 我还更新了 iothub_client_sample_mqtp.c 中的连接字符串 我可以看到正在与 IotHub 服务器建立连接、但看不到来自同一服务器的任何响应。 我在物联网集线器上看不到 CC3235SF 发送的任何消息。

以下是消息日志:

----------------

启动 iohub_client_sample_mqTT 示例
startSNTP:当前时间:2022年11月14日星期一05:06:14


CC32XX 已连接到 AP 并获取 IP 地址。

IP 地址:192.168.43.104

文件/cert/ms.pem 已存在
IoTHubClient_LL_SetMessageCallback...成功。
IoTHubClient_LL_SendEventAsync 接受的消息[0]用于传输到物联网集线器。
IoTHubClient_LL_SendEventAsync 已接受消息[1]、用于传输到物联网集线器。
IoTHubClient_LL_SendEventAsync 已接受消息[2]、用于传输到物联网集线器。
IoTHubClient_LL_SendEventAsync 已接受消息[3]、用于传输到物联网集线器。
IoTHubClient_LL_SendEventAsync 已接受消息[4]、用于传输到物联网集线器。

--------------

我正在使用运动场证书目录。

谢谢、

Pradeep

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

    您好!
    您提到、您可以看到正在与 IotHub 服务器建立连接。 您在服务器端还是 DUT 端看到它吗?
    因为您也提到过、我要求您使用的是假目录下的游乐场证书目录、我认为由于您连接到安全的 MQTT 服务器、因此需要该目录、对吧? 在这种情况下、不会建立连接、因为 TLS 连接会在证书错误时失败。
    此致、
    Shlomi

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

    您好!

    我看到 DUT 侧建立了连接。  

    如果 TLS 连接失败、它是否不会给出任何错误?  

    谢谢、

    Pradeep

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

    您好!

    我不太熟悉此插件的细节、但我查看并看到了以下与您所看到的内容非常相关的主题。 最后,它忽略了游乐场目录。 可以尝试一下吗?

    https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/982938/cc3220sf-launchxl-unable-to-send-mqtt-messages-to-iot-hub-using-cc3220sf

    此致、

    Shlomi

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

    您好!

    感谢您向我指出该主题。 这正是我所面对的问题。 我注意到该解决方案如下所示:

     我忽略 了 SL_ERROR_BSD_ESECUNKNOWNROOTCA  错误、以启动安全 TLS 会话、从而使用运动场证书目录和虚拟根 CA 建立 MQTT 连接。

    您能不能指导我如何准确地进行修改以忽略此错误? 我是否必须更新与 azure 相关的代码并重新生成相同的代码?

    谢谢、

    Pradeep

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

    您好!

    禁用根 CA 目录主要是在开发过程中,当您还没有真正的证书时(例如,使用游乐场)。

    对于需要在某个位置部署的最终产品、您需要在 SFLASH 上烧录真实的证书。

    因此、您无需更新 Azure、只需为开发而绕过目录即可。 当然、您甚至可以绕过实际部署产品的目录、但强烈建议不要这样做、因为您会显式创建安全漏洞。

    您可以在我们的网络处理器指南 https://www.ti.com/lit/ug/swru455m/swru455m.pdf?ts=1668687781178&ref_url=https%253A%252F%252Fwww.google.com%252F 上看到有关它或如何绕过它的更多信息

    具体而言,要绕过目录,可以查看 第7.5.4章“禁用受信任根证书目录”,该章介绍了:

    _u32 dummyVal;
    _i16 status;
    status = sl_SetSockOpt(SockID,SL_SOL_SOCKET, SL_SO_SECURE_DISABLE_CERTIFICATE_STORE,
    &dummyVal,sizeof(dummyVal));

    此致、

    Shlomi

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

    您好!

    要使用以下函数、我需要套接字 ID。 我没有相同的。

    状态= SL_SetSockOpt (SockID、SL_SOL_Socket、SL_SO_SECURE_DISABLE_CERTIFICATE_STORE、
    dummyVal、sizeof (dummyVal)(&D);

    我使用的是 SimpleLink SDK 中提供的示例项目中的"iohub_client_sample_mqtT_cc3235sf_launchxl_freertos_ccs"项目。

    在 main 函数中、它启动线程函数-"azureThreadFxn"。 如果调用另一个函数“Network_startup()”,则在该函数中。 以下是相同的代码。

    它使用库函数"ti_net_slNet_initconfig()"。 我知道、这会执行所有与套接字相关的活动。 我不知道它在库中的确切实现位置。 在这种情况下、如何设置套接字选项以禁用证书检查?

    空 Network_startup()

    int32_t status;
    _u32 dummyVal;
    //_i16状态;

    /*连接到接入点*/
    initWiFi();

    /*等待网络堆栈初始化并获取 IP 地址*/
    SEM_WAIT (SEM);

    /*初始化 SlNet 接口*/
    status = ti_net_slNet_initconfig();
    如果(状态< 0){
    /* ti_net_slNet_initconfig 失败*/
    while (1);

    /*关闭 LED。 它将用作连接指示器*/
    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_OFF);


    /*根据 SSL 验证的需要使用 SNTP 获取当前时间*/
    startSNTP ();

    GPIO_WRITE (CONFIG_GPIO_LED_0、CONFIG_GPIO_LED_ON);

    谢谢、

    Pradeep

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

    您好!

    我在该插件中执行了一些调节、由于 Azure 插件在内部执行所有套接字相关操作、因此很难绕过它。

    如您在下所见 /source/third_party/azure-iot-pal-simplelink 目录中、有一个文件 TISIO_SL.c、其中打开套接字并对套接字应用所有操作。 在 tlsio_sl_open()中,有一组属性通过 SlNetSock_secAttribSet()设置为套接字。 所需的属性为 SLNETSOCK_SEC_ATTRIB_DISABLE_CERT_STORE、可在与此插件一同运行的基本 SDK (v4.10.00.07)中找到。

    如果您能够重新编译此库、则应该可以。 否则、没有将属性添加到套接字的选项、您必须使用真实证书并遵循用户指南。

    此致、

    Shlomi

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

    您好!

    我有疑问:

    在示例代码中使用了 MQTT 协议。 MQTT 协议层源代码在哪里? 还是 MQTT 协议层是 SimpleLink 驱动程序的一部分?

    我认为、我们可以使用身份验证方法作为 SAS 令牌而不是证书来连接物联网集线器、而无需使用证书。 因此、我开始查看 azure 插件代码、找不到 MQTT 层源代码。 因此、上述问题。

    谢谢、

    Pradeep

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

    您好!

    我们将 MQTT 作为库、但 Azure 插件不使用它。 它们有自己的实施。 请参阅部分链接器文件以了解 MQTT 位置:

    linkerBuildOptions="
    -l${com_TI_Azure_CC32XX_INSTALL_DIR}/source/third_party/azure-iot-pal-simplelink/build_all/sdk/lib/ccs/m4/iotclient_sl_release.a
    -l${com_TI_Azure_CC32XX_INSTALL_DIR}/source/third_party/azure-iot-pal-simplelink/build_all/sdk/lib/ccs/m4/common_sl_release.a
    -l${com_TI_Azure_CC32XX_INSTALL_DIR}/source/third_party/azure-iot-pal-simplelink/build_all/pal/lib/ccs/m4/pal_sl_release.a
    -l${COM_TI_SIMPLELINK_CC32XX_SDK_INSTALL_DIR}/source/ti/net/sntp/lib/ccs/m4/sntp_release.a
    -l${COM_TI_SIMPLELINK_CC32XX_SDK_INSTALL_DIR}/source/ti/net/http/lib/ccs/m4/httpclient_release.a
    -l${COM_TI_SIMPLELINK_CC32XX_SDK_INSTALL_DIR}/source/ti/net/lib/ccs/m4/slnetsock_release.a
    -l${COM_TI_SIMPLELINK_CC32XX_SDK_INSTALL_DIR}/source/ti/drivers/net/wifi/slnetif/ccs/Release/slnetifwifi.a
    -l${COM_TI_SIMPLELINK_CC32XX_SDK_INSTALL_DIR}/source/ti/drivers/net/wifi/ccs/rtos/simplelink.a
    -l${com_TI_Azure_CC32XX_INSTALL_DIR}/source/third_party/azure-iot-pal-simplelink/build_all/sdk/lib/ccs/m4/umqtt_sl_release.a

    Shlomi

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

    您好!

    谢谢...我可以看到 MQTT 库已链接。

    通过引用此文件中的以下注释、我启用了 iothub_client_sample_MQTT.c 文件中的日志记录:

    ----------

    /*
    *要在 Azure 库中启用日志记录、必须执行以下步骤:
    * 1. 链接到 Azure 库的调试版本、例如
    * PAL_SL_debug.a、common_sl_debug.a、...
    * 2. 取消注释以下#define enable_logging
    *
    #define ENABLE_LOGING

    ------------

    我链接了库的所有调试版本、并如上所述未添加注释的'enable_logging'定义。 但我看不到 Tera Term 窗口中出现的任何日志消息。 我还看到下面用于在代码中记录的 API 设置选项。

    IoTHubClient_LL_setOption (iotHubClientHandle、option_log_trace、traceOn);

    这些日志究竟是在哪里创建的? 我甚至看不到在项目文件夹中创建的任何日志文件。

    谢谢、

    Pradeep

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

    您好!

    我还没有尝试过 Azure 插件、但我认为它应该在终端上运行。

    在正式支持日志记录之前有一个较旧的链接、并且说明是相同的。

    您需要启用此#define、使用库的调试风格而不是发布版本、并将所有内容链接在一起。

    文章 是 https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/722139/cc3220sf-launchxl-azure-iot-hub-function-logging/2665975#2665975

    此致、

    Shlomi

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

    您好!

    我在屏幕上看到了日志。 实际上、只有在出现任何故障时才会显示日志消息。 如果所有 API 的功能都符合预期、则没有日志消息、因此我无法在屏幕上查看任何日志。 我故意引入了一些不正确的数据、并验证了日志消息是否显示在屏幕上。

    对于我最初在服务器端未接收消息的问题、我尝试使用独立的软件工具 MQTT.FX 从 Windows 机器到物联网集线器服务器。 我已验证我是否可以建立连接、并从物联网中心接收到的工具 MQTT.FX 中发布遥测消息。  这意味着物联网集线器侧没有问题、器件侧有问题。  

    我开始深入探讨 MQTT 相关设置。  MQTT.FX 工具使用端口作为8883、TLSV1.2和默认 CA 证书。 我在我们的示例代码中看不到这些设置。 您是否有提供此示例代码详细信息的任何文档链接?

    谢谢、

    Pradeep

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

    您好!

    您应该在 Azure 插件(/doc 目录下)中的用户指南上拥有所有必需的信息。

    基本上、如代码中所示、需要在/cert/ms.pem 下刷写 CA 证书。

    这是一个相对较旧的插件、因此我希望 MS 不会更改根 CA。

    此致、

    Shlomi

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

    您好!

    Azure 插件文档未提及 MQTT 设置的任何详细信息。 如果 MS 没有更改根 CA、那么加载到模块闪存中的 ms.pem 也是正确的。 深入了解 Azure 插件代码、我确认使用端口8883和 TLSV1.2。 我对信息格式持怀疑态度。 现在、除非我可以调试 azure 插件代码、否则我不知道如何继续解决此问题。 您是否有有关如何构建此插件的.a 文件的文档?

    谢谢、

    Pradeep

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

    您好!

    CA 证书本身还不够。 您需要有真实的目录、而不是游乐场目录(正如您在主题开头提到的)。

    您能否将目录替换为真正的目录? 这样做会使 MCU 应用程序无法通过签名测试、但您可以仅在测试中使用调试模式、即使用 CCS 加载和执行应用程序。 这样就可以绕过目录测试。

    不、我没有任何构建 Azure 库的指令。

    此致、

    Shlomi