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.

[参考译文] CC3235S:使用 AWS SDK 接口功能。

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1169065/cc3235s-using-aws-sdk-interface-function

器件型号:CC3235S

您好!

在 CC3235S 和 SDK6.10中、通过引用 AWS SDK 4.30的 subscribe_publish_sample 示例来实现用户命令的 AWS 函数。

(使用 subscribe_publish_sample 示例测试成功)

 

AWS 函数只是执行了两条命令。

1.连接2. 命令

 

在 Connect 功能中、

使用 AWS IoT MQTT_init、AWS IoT MQTT_connect 和 AWS IoT MQTT_autoreconnect_set_status 执行初始化和连接在连接完成后创建一个 Yield 线程。

 

在命令函数中、

根据选项的不同、分别使用 AWS IoT MQTT_SUBSCRIBE、AWS IoT MQTT_publish 和 AWS IoT MQTT_UNSUBSCRIBE 执行订阅、发布和取消订阅

 

在 AWS 连接后、使用命令发布成功。

但是、即使使用了"订阅"、也不会在 CC3235S 中调用回调函数。 (在 Connect 函数中执行 subscribe 时、调用回调函数)

此外、使用取消订阅时、已注册的主题不再接收、但 AWS IoT MQTT_UNSUBSCRIBE 函数始终返回-1。

 

下面是我的 Command 函数的简单代码。

AWS_IoT_Client gAWSIoTClient;

void * AWSIoTYieldThread(void *arg)
{
    IOT_INFO("%s\n\r", __FUNCTION__);

    IoT_Error_t rc = FAILURE;

    while(1)
    {
        rc = aws_iot_mqtt_yield(&gAWSIoTClient, 100);
        if (SUCCESS != rc) {
            IOT_ERROR("An error occurred in the loop. Error code = %d\n", rc);
        }
        GPIO_toggle(CONFIG_GPIO_RLED);
            
        sleep(1);
    }
}

int32_t cmdAWSIoTConnectCallback(void *arg)
{
    IoT_Error_t rc = FAILURE;
    IoT_Client_Init_Params mqttInitParams = iotClientInitParamsDefault;
    IoT_Client_Connect_Params connectParams = iotClientConnectParamsDefault;

    IOT_INFO("\nAWS IoT SDK Version %d.%d.%d-%s\n", VERSION_MAJOR,
            VERSION_MINOR, VERSION_PATCH, VERSION_TAG);

    mqttInitParams.enableAutoReconnect = false; // We enable this later below
    mqttInitParams.pHostURL = HostAddress;
    mqttInitParams.port = port;
    mqttInitParams.pRootCALocation = AWS_IOT_ROOT_CA_FILENAME;
    mqttInitParams.pDeviceCertLocation = AWS_IOT_CERTIFICATE_FILENAME;
    mqttInitParams.pDevicePrivateKeyLocation = AWS_IOT_PRIVATE_KEY_FILENAME;
    mqttInitParams.mqttCommandTimeout_ms = 20000;
    mqttInitParams.tlsHandshakeTimeout_ms = 5000;
    mqttInitParams.isSSLHostnameVerify = true;
    mqttInitParams.disconnectHandler = disconnectCallbackHandler;
    mqttInitParams.disconnectHandlerData = NULL;

    rc = aws_iot_mqtt_init(&gAWSIoTClient, &mqttInitParams);
    if (SUCCESS != rc) {
        IOT_ERROR("aws_iot_mqtt_init returned error : %d ", rc);
        return(-1);
    }

    connectParams.keepAliveIntervalInSec = 600;
    connectParams.isCleanSession = true;
    connectParams.MQTTVersion = MQTT_3_1_1;
    connectParams.pClientID = ClientID;
    connectParams.clientIDLen = (uint16_t)strlen(ClientID);
    connectParams.isWillMsgPresent = false;

    IOT_INFO("Connecting...");
    rc = aws_iot_mqtt_connect(&gAWSIoTClient, &connectParams);
    if (SUCCESS != rc) {
        IOT_ERROR("Error(%d) connecting to %s:%d", rc, mqttInitParams.pHostURL,
                mqttInitParams.port);
        return(-1);
    }
    /*
     *  Enable Auto Reconnect functionality. Minimum and Maximum time of
     *  exponential backoff are set in aws_iot_config.h:
     *  #AWS_IOT_MQTT_MIN_RECONNECT_WAIT_INTERVAL
     *  #AWS_IOT_MQTT_MAX_RECONNECT_WAIT_INTERVAL
     */
    rc = aws_iot_mqtt_autoreconnect_set_status(&gAWSIoTClient, true);
    if (SUCCESS != rc) {
        IOT_ERROR("Unable to set Auto Reconnect to true - %d", rc);
    }
    IOT_INFO("Connect!");

    /* It code is working
    IOT_INFO("Subscribing...");
    char *topicName = "sdkTest/sub";
    int topicNameLen = strlen(topicName);
    rc = aws_iot_mqtt_subscribe(&gAWSIoTClient, topicName, topicNameLen, QOS0,
            iot_subscribe_callback_handler, NULL);
    if (SUCCESS != rc) {
        IOT_ERROR("Error subscribing : %d ", rc);
        return(-1);
    }
    */

    pthread_t awsyieldThread;
    awsyieldThread = OS_createTask(7, 1024, AWSIoTYieldThread, NULL, 1);
    if (awsyieldThread < 0)
    {
        DBG_PRINT("awsyieldThread Fail %d\n\r");

        return(-1);
    }

    return 0;
}

int32_t cmdAWSIoTCmdCallback(void *arg)
{
    ...
    /* Parse options */
    ...
    
    if (!error)
    {
        IoT_Error_t rc = FAILURE;

        if (fSub)
        {
            IOT_INFO("Subscribing...");
            rc = aws_iot_mqtt_subscribe(&gAWSIoTClient, topicName, topicNameLen, QOS0,
                    iot_subscribe_callback_handler, NULL);
            if (SUCCESS != rc) {
                IOT_ERROR("Error subscribing : %d ", rc);
            }

            rc = aws_iot_mqtt_resubscribe(&gAWSIoTClient);
            if (SUCCESS != rc) {
                IOT_ERROR("Error resubscribing : %d ", rc);
            }
        }

        if (fPub)
        {
            IOT_INFO("Publishing...");

            IoT_Publish_Message_Params paramsQOS0;

            paramsQOS0.qos = QOS0;
            paramsQOS0.payload = (void *)pubPayload;
            paramsQOS0.payloadLen = strlen(pubPayload);
            paramsQOS0.isRetained = 0;

            rc = aws_iot_mqtt_publish(&gAWSIoTClient, topicName, topicNameLen,
                    &paramsQOS0);
            if (SUCCESS != rc) {
                IOT_ERROR("Error publishing : %d ", rc);
            }
        }

        if (fUnsub)
        {
            IOT_INFO("Unsubscribe...");
            aws_iot_mqtt_unsubscribe(&gAWSIoTClient, topicName, topicNameLen);
            if (SUCCESS != rc) {
                IOT_ERROR("Error unsubscribe : %d ", rc);
            }
        }
    }

    return error;
}

 

使用 AWS IoT MQTT_SUBSCRIBE 函数是否缺少内容?

如有任何建议,请提出。

谢谢你。

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

    代码看起来正常。 这没有明显的原因。  

    请尝试进行调试(通过添加列印或使用调试器单步进入函数)以找出-1 (失败)的根本原因。

    请注意、该代码 基于 Amazon 的 Embedded C SDK (Ver 3.0.1)、因此您也可以在其 AWS 论坛中查看。  

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

    我解决了这个问题

    在订阅 API 中、我漏掉了 API 的评论。 注释指出 pTopicName 和 pApplicationHandlerData 需要在存储器中保持静态。 我 没有在静态存储器中使用 pTopicName。

    在取消订阅 API 中、我没有将 API 的返回值存储在 RC 中。

    很抱歉打扰了你。

    '不是工程师

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

    没问题。 感谢您分享解决方案。