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.

[参考译文] CC3235MODASF:即使在 SNTP 时间同步后、与 TLS 的 MQTT 连接也失败(–461)

Guru**** 2607645 points
Other Parts Discussed in Thread: CC3235MODASF, CC3235SF

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1580872/cc3235modasf-mqtt-connection-with-tls-fails--461-even-after-sntp-time-sync

器件型号:CC3235MODASF
Thread 中讨论的其他器件: CC3235SF

尊敬的 TI 团队:

我在使用 CC3235MODASF 一方 SimpleLink SDK 7.10.00.13 、我正在尝试使用连接到公共 MQTT 代理 (mosquitto.org) TLS
连接时相同的代码工作正常 不具有安全性(普通 MQTT)

以下是我的 MQTT 配置:

MQTT_IF_ClientParams_t mqttClientParams = {
     ClientId,                  // client ID
     MQTT_CLIENT_USERNAME,      // user name
     MQTT_CLIENT_PASSWORD,      // password
     MQTT_CLIENT_KEEPALIVE,     // keep-alive time
     MQTT_CLIENT_CLEAN_CONNECT, // clean connect flag
     MQTT_CLIENT_MQTT_V3_1,     // true = 3.1, false = 3.1.1
     MQTT_CLIENT_BLOCKING_SEND, // blocking send flag
     &mqttWillParams            // will parameters
};

char *MQTTClient_secureFiles[1] = {"mosquitto.org.crt"};

MQTTClient_ConnParams mqttConnParams = {
    MQTT_CONNECTION_FLAGS,
    MQTT_CONNECTION_ADDRESS,              // "test.mosquitto.org"
    MQTT_CONNECTION_PORT_NUMBER,          // 8883
    SLNETSOCK_SEC_METHOD_SSLv3_TLSV1_2,
    SLNETSOCK_SEC_CIPHER_FULL_LIST,
    1,
    MQTTClient_secureFiles
};


void *mqttClientThreadFxn(void * args)
{
    int32_t ret;
    MQTTClient_Handle mqttClientHandle = NULL;
    unsigned long resolvedIP;
    
    UART_PRINT("[MQTT] client started.\r\n");
    startSNTP();
    
    ret = MQTT_IF_Init(mqttInitParams);
    if (ret < 0) {
        UART_PRINT("[MQTT] Init failed (%d)\r\n", ret);
        goto thread_exit;
    }
    DBG_PRINT("[MQTT] Initialized.\r\n");
 
    while (1)
    {
        if (connected == 0)
        {
            UART_PRINT("[MQTT] Attempting connection...\r\n");

            mqttClientHandle = MQTT_IF_Connect(mqttClientParams, mqttConnParams, MQTT_EventCallback);
            if ((int)mqttClientHandle < 0) {
                UART_PRINT("[MQTT] Connect failed (%d), retry \r\n", (int)mqttClientHandle );
                sleep(1);
                continue;
            }

            UART_PRINT("[MQTT] Connected to broker.\r\n");

            ret = 0;
            for (int i = 0; i < board->do_num; i++) {
                snprintf(topic, sizeof(topic), "TEST/%02X/AA/%d", net_id, i);
                ret |= MQTT_IF_Subscribe(mqttClientHandle, topic, MQTT_QOS_2, ToggleAACB);
            }
            for (int i = 0; i < board->ao_num; i++) {    
                snprintf(topic, sizeof(topic), "TEST/%02X/BB/%d", net_id, i);
                ret |= MQTT_IF_Subscribe(mqttClientHandle, topic, MQTT_QOS_2, ToggleBBCB);
            }
            if (ret < 0)
                UART_PRINT("[MQTT] Subscribe failed (%d)\r\n", ret);
            else
                UART_PRINT("[MQTT] Subscribed to topics.\r\n");
        }
        else if (connected == 1)
        {
			// publish
             MQTT_IF_Publish(mqttClientHandle, topic, payload, strlen(payload), mqtt->io[i].qos/*MQTT_QOS_2*/);

        }
    }

    // Stop / Cleanup
    if (connected) {
        MQTT_IF_Disconnect(mqttClientHandle);
    }

    MQTT_IF_Deinit();
    DBG_PRINT("[MQTT] Deinitialized.\r\n");

thread_exit:
    UART_PRINT("[MQTT] Client Thread exiting.\r\n");
    pthread_exit(NULL);
    return NULL;
}

在连接之前、我还会调用startSNTP()同步时间。

良好

Plain MQTT(端口 1883)→工作正常

  • Secure MQTT(端口 8883)→失败 -456

  • 上载mosquitto.org.crt/userFiles/并重试→后、立即失败 -461

在→仍然失败之前添加了 SNTP -461

日志输出

[MQT]客户端已启动。
[WIFI M]获取 STA IP:172.20.20
startSNTP:当前时间:星期二 Oct 28 00:24:45 2025

[MQT]已初始化。
[MQT]正在尝试连接...
上下文线程:正在运行
连接失败:–461
MQTT 客户端 CB:断开连接

 

我尝试过的

  • 已验证 SNTP:当前时间显示正确 (2025/10/28)

  • 已验证是否已上载根 CA 文件 (mosquitto.org.crt)

  • 使用具有相同证书的 PC MQTT 客户端可验证连接是否正常工作

 

问题

  1. 哪个原因导致出现-461错误MQTT_IF_Connect(SSL/TLS 连接失败)?

  2. CC3235SF 是否会根据验证代理证书日期 系统 SNTP 时间

  3. 是否有办法检查哪个证书字段导致验证错误?

  4. 是否有已知的工作证书链test.mosquitto.org

感谢您的帮助!

 

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

    您好、Ryan、

    您应该能够使用 SDK 中的 SNTP 库同步时间、但是您是否可以尝试调用 setTime()?  

    void setTime(){

    SlDateTime_t DateTime ={0};
    DateTime.TM_DAY =(uint32_t) 天;
    DateTime.TM_mon =(uint32_t) month;
    DateTime.TM_year =(uint32_t) year;
    DateTime.TM_hour =(uint32_t) hour;
    DateTime.TM_MIN =(uint32_t) 分钟;
    DateTime.TM_sec =(uint32_t) SEC;
    SL_DeviceSet (SL_DEVICE_General、SL_DEVICE_GENERAL_DATE_TIME
    sizeof (SlDateTime_t)、(uint8_t *)(&DateTime));
    }

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

    您好

    感谢您的建议。
    我尝试使用setTime()手动设置系统时间、如下所示、但结果仍然相同 (connect failed: -461)。

    void setTime() {
    
        SlDateTime_t dateTime = {0};
        dateTime.tm_day = (uint32_t)DAY;
        dateTime.tm_mon = (uint32_t)MONTH;
        dateTime.tm_year = (uint32_t)YEAR;
        dateTime.tm_hour = (uint32_t)HOUR;
        dateTime.tm_min = (uint32_t)MINUTES;
        dateTime.tm_sec = (uint32_t)SEC;
        sl_DeviceSet(SL_DEVICE_GENERAL, SL_DEVICE_GENERAL_DATE_TIME,
                     sizeof(SlDateTime_t), (uint8_t *)(&dateTime));
        UART_PRINT("DateTime Set: %02d/%02d/%04d %02d:%02d:%02d\r\n",
                   DAY, MONTH, YEAR, HOUR, MINUTES, SEC);
    }
    
    startSNTP: Current time: Tue Oct 28 19:15:06 2025
    [MQTT] Initialized.
    DateTime Set: 01/05/2020 04:00:00
    [MQTT] Attempting connection...
    connect failed: -461
    MQTT CLIENT CB: DISCONNECT
    
    


    有关我的项目的其他信息

    我的项目最初基于 网络终端 但我已经自定义了 Wi-Fi 连接过程。
    SlNetConn_start()我不使用、而是使用以下自定义 STA 启动逻辑:

    static int32_t start_sta_mode(const WifiConfig_t *config)
    {
        int32_t retVal;
        SlWlanSecParams_t secParams = {0};
        int32_t mode;
    
        UART_PRINT("[STA mode] Starting ...\r\n");
    
        retVal = sl_WlanSetMode(ROLE_STA);
        if (retVal < 0) {
            sl_Stop(200);
            sl_Start(0, 0, 0);
            UART_PRINT("[STA mode] Failed to set. Error: %d\r\n", retVal);
            return WIFI_START_FAILURE;
        }
    
        sl_Stop(200);
        mode = sl_Start(0, 0, 0);
        if (mode != ROLE_STA) {
            UART_PRINT("[STA mode] Failed to start. Mode: %d\r\n", mode);
            return WIFI_START_FAILURE;
        }
    
        uint8_t country[2] = {'T', 'W'};
        retVal = sl_WlanSet(SL_WLAN_CFG_GENERAL_PARAM_ID,SL_WLAN_GENERAL_PARAM_OPT_COUNTRY_CODE,sizeof(country),country);
    
        secParams.Type = mapSecurityType(config->security_type, NULL);
        if (secParams.Type != SL_WLAN_SEC_TYPE_OPEN) {
            secParams.Key = (signed char *)config->password;
            secParams.KeyLen = strlen(config->password);
        }
        
        if (config->ip_address_type == IP_TYPE_STATIC) {
            SlNetCfgIpV4Args_t ipV4 = {0};
            ipv4AddressParse((char*)config->ip_address, &ipV4.Ip);
            ipv4AddressParse((char*)config->subnet_mask, &ipV4.IpMask);
            ipv4AddressParse((char*)config->gateway, &ipV4.IpGateway);
            ipv4AddressParse((char*)config->primary_dns, &ipV4.IpDnsServer);
            retVal = sl_NetCfgSet(SL_NETCFG_IPV4_STA_ADDR_MODE, SL_NETCFG_ADDR_STATIC, sizeof(SlNetCfgIpV4Args_t), (uint8_t *)&ipV4);
            if (retVal < 0) {
                UART_PRINT("[STA mode] Failed to set static IP. Error: %d\r\n", retVal);
                return WIFI_START_FAILURE;
            }
        } else {
            sl_NetCfgSet(SL_NETCFG_IPV4_STA_ADDR_MODE, SL_NETCFG_ADDR_DHCP, 0, 0);
        }
    
        uint32_t policy = SL_WLAN_CONNECTION_POLICY(1, 0, 0, 0);
        sl_WlanPolicySet(SL_WLAN_POLICY_CONNECTION, policy, NULL, 0);
    
        sl_WlanProfileDel(0xFF);
    
        secParams.Type = mapSecurityType(config->security_type, NULL);
        if (secParams.Type != SL_WLAN_SEC_TYPE_OPEN) {
            secParams.Key = (signed char *)config->password;
            secParams.KeyLen = strlen(config->password);
        }
        retVal = sl_WlanProfileAdd((signed char *)config->ssid, strlen(config->ssid), 0, &secParams, NULL, 1, 0);
        if (retVal < 0) {
            UART_PRINT("[STA mode] Failed to add profile. Error: %d\r\n", retVal);
            return WIFI_START_FAILURE;
        }
    
        g_wifiManagerCB.isInitialized = true;
        sl_Stop(200);
        sl_Start(0, 0, 0);
        if (mode != ROLE_STA) {
            g_wifiManagerCB.isInitialized = false;
            UART_PRINT("[STA mode] Final restart failed. Mode: %d\r\n", mode);
            return WIFI_START_FAILURE;
        }
        
        if((config->bssid_enabled) && 
            (config->bssid[0] != 0 || config->bssid[1] != 0 || config->bssid[2] != 0 ||
            config->bssid[3] != 0 || config->bssid[4] != 0 || config->bssid[5] != 0)) 
        {
            retVal = sl_WlanConnect((signed char *)config->ssid, strlen(config->ssid), config->bssid, &secParams, NULL);
            UART_PRINT("[STA mode] Connecting to AP: %s (BSSID: %02X:%02X:%02X:%02X:%02X:%02X)...\r\n",
                   config->ssid,
                   config->bssid[0], config->bssid[1], config->bssid[2],
                   config->bssid[3], config->bssid[4], config->bssid[5]);
        } else {
            retVal = sl_WlanConnect((signed char *)config->ssid, strlen(config->ssid), NULL, &secParams, NULL);
            UART_PRINT("[STA mode] Connecting to AP: %s...\r\n", config->ssid);
        }
    
        return WIFI_START_SUCCESS_CONNECTING;
    }

    这适用于 普通 MQTT(非 TLS) 连接、
    但适用于 安全 MQTT (TLS) 它始终会失败 –461. 呼叫时MQTT_IF_Connect()

    我的问题

    MQTT_IF_Connect()和之间是否存在任何已知依赖关系 SimpleLink 网络层 (即,)SlNetConn_start()
    这是否是即使 Wi-Fi 连接成功(获取 IP、SNTP 正常工作等)、TLS 也失败的原因?

    如果是,你建议我修改我的项目使用,SlNetConn_start()而不是直接sl_WlanConnect()?

    再次感谢您的时间和支持!



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

    您好

    我已经使用 CC3235SF 和 SDK 版本测试了安全 MQTT 连接simplelink_cc32xx_sdk_7_10_00_13

    • setTime()手动设置器件时间时 有效期内保护证书 (例如,2020/08/01)、MQTT 客户端能够成功连接到代理。

    • 但是、当我使用startSNTP()同步 NTP 服务器的时间时、即使 MCU POSIX 时间显示正确的当前日期和时间、连接仍然会失败 (-461 (SL_ERROR_BSD_ESECDATEERROR))。

    这表明、虽然setTime()有效、startSNTP()但不能正确同步 NWP (SimpleLink) 时间 用于 TLS 证书验证。

    您是否有关于如何startSNTP()正确更新 NWP 时间的任何指导、以便安全 MQTT 连接无需手动即可成功setTime()

    谢谢、
    Ryan

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

    Ryan 您好、由于您要设置的时间是 startSNTP 打印出来的时间、您是否可以使用 SNTP 库、以便将日期、月份、年份等详细信息最终放入 SlDateTime_t 结构中、然后进行调用  

    SL_DeviceSet (SL_DEVICE_General、SL_DEVICE_GENERAL_DATE_TIME
    sizeof (SlDateTime_t)、(uint8_t *)(&DateTime));
    }

    这允许您使用更新的日期和时间配置设备。