espressif / esp-aws-iot

AWS IoT SDK for ESP32 based chipsets
Apache License 2.0
257 stars 154 forks source link

Unable to receive Certificates and keys for fleet provisioning (CA-181) #86

Closed MaazSk closed 2 years ago

MaazSk commented 2 years ago

Environment

Problem Description

I am trying to implement device provisioning but I am not getting device certificates from the server.

My code snippet is as below

IoT_Client_Init_Params InitParams = iotClientInitParamsDefault;
    InitParams.enableAutoReconnect = false; // We enable this later below
    InitParams.pHostURL = AWSHostAddress;
    InitParams.port = MQTTport;
    InitParams.disconnectHandler = disconnect_handle;
    InitParams.pRootCALocation = rootCA;
    InitParams.pDevicePrivateKeyLocation = clientKey;
    InitParams.pDeviceCertLocation = clientCRT;
    InitParams.mqttCommandTimeout_ms = 20000;
    InitParams.tlsHandshakeTimeout_ms = 5000;
    InitParams.isSSLHostnameVerify = true;
    InitParams.disconnectHandlerData = NULL;

    //Initializing AWS IoT
    rc = aws_iot_mqtt_init(&provisioningMQTTClient, &InitParams);
    if (rc != SUCCESS)
    {
        ESP_LOGE(TAG, "mqtt init flags");
        // goto exit;
    }
    ESP_LOGI(TAG, "initializing connection parameters");

    //Aws Connection Parameters
    IoT_Client_Connect_Params connectParams = iotClientConnectParamsDefault;
    connectParams.pClientID = "Provisioning_dev";
    connectParams.clientIDLen = (uint16_t)strlen("Provisioning_dev");
    connectParams.keepAliveIntervalInSec = 10;
    connectParams.isCleanSession = true;
    connectParams.isWillMsgPresent = false;
    ESP_LOGI(TAG, "Connecting to aws for provisioning");
    do
    {   //Connecting to AWS
        rc = aws_iot_mqtt_connect(&provisioningMQTTClient, &connectParams);
        if (SUCCESS != rc)
        {
            ESP_LOGE(TAG, "Error(%d) connecting to %s:%d", rc, InitParams.pHostURL, InitParams.port);
            vTaskDelay(1000 / portTICK_RATE_MS);
        }
    } while (SUCCESS != rc);
    ESP_LOGI(TAG, "connected to AWS for provisioning");

    do
    {   //Autoreconnect
        rc = aws_iot_mqtt_autoreconnect_set_status(&provisioningMQTTClient, true);
        if (SUCCESS != rc)
        {
            ESP_LOGE(TAG, "Unable to set Auto Reconnect to true - %d", rc);
            // abort();
        }
    } while (rc != SUCCESS);

    ESP_LOGI(TAG, "Subscribing to Provisioning topic...");
    //Subscribing to topics
    int subscribeProvisioningTopicLen = strlen(SUBSCRIBE_PROVISIONING_TOPIC);
    rc = aws_iot_mqtt_subscribe(&provisioningMQTTClient, SUBSCRIBE_PROVISIONING_TOPIC, subscribeProvisioningTopicLen, QOS1, iot_subscribe_callback_handler_prov, NULL);
    if (SUCCESS != rc)
    {
        ESP_LOGE(TAG, "Error while subscribing : %d ", rc);
    }

    rc = aws_iot_mqtt_subscribe(&provisioningMQTTClient, SUBSCRIBE_PROVISIONING_REJECTED_TOPIC, subscribeProvisioningTopicLen, QOS1, iot_subscribe_callback_handler_prov, NULL);
    if (SUCCESS != rc)
    {
        ESP_LOGE(TAG, "Error while subscribing : %d ", rc);
    }
    ESP_LOGI(TAG, "Topic is been subscribed");

    char *publish_msg = "";
    // sprintf(publish_msg, "");
    IoT_Publish_Message_Params paramsQOS1;
    paramsQOS1.qos = QOS1;
    paramsQOS1.payload = (void*)publish_msg;
    paramsQOS1.isRetained = 0;
    paramsQOS1.payloadLen = 0;
    int publish_provisioning_topic_len = strlen(PUBLISH_PROVISIONING_TOPIC);
    ESP_LOGI(TAG,"Publishing data to AWS");
    rc = aws_iot_mqtt_publish(&provisioningMQTTClient, PUBLISH_PROVISIONING_TOPIC, publish_provisioning_topic_len, &paramsQOS1);

Even if I try to publish multiple times I do not get any response in the callback function

Subscribe callback function:


void iot_subscribe_callback_handler_prov(AWS_IoT_Client *pClient, char *topicName, uint16_t topicNameLen,
                                         IoT_Publish_Message_Params *params, void *pData)
{
    ESP_LOGI(TAG, "Subscribe callback");
    ESP_LOGI(TAG, "%.*s\t%.*s", topicNameLen, topicName, (int)params->payloadLen, (char *)params->payload);
}

Thank You

MaazSk commented 2 years ago

The issue is been resolved the receive buffer size was too small need to change it from sdkconfig