static uint8_t onboarding_request()

in source/1nce_zero_touch_provisioning.c [193:334]


    static uint8_t onboarding_request( uint8_t status,
                                       NetworkContext_t * pxNetworkContext,
                                       char ** completeResponse );
#endif

/**
 * @brief re-initialize MQTT connection information
 * from received onboarding response.
 *
 * @return The status of the excution result.
 */
static uint8_t nceReinitConnParams( char * completeResponse,
                                    char ** pThingName,
                                    char ** pEndpoint,
                                    char ** pExampleTopic,
                                    char ** pRootCA,
                                    char ** pClientCert,
                                    char ** pPrvKey );

/**
 * @brief Replace matched patterns in a string.
 *
 * @param[in] orig: the target string to be replaced.
 * @param[in] rep: the string pattern to be replaced.
 * @param[in] with: the string pattern to replace.
 *
 * @return the pointer pointing to the new string after being replaced.
 */
char * str_replace( char * orig,
                    char * rep,
                    char * with );

extern UBaseType_t uxRand( void );

/*-----------------------------------------------------------*/

uint8_t nce_onboard( char ** pThingName,
                     char ** pEndpoint,
                     char ** pExampleTopic,
                     char ** pRootCA,
                     char ** pClientCert,
                     char ** pPrvKey )
{
    uint8_t status = EXIT_FAILURE;
    char completeResponse[ 5000 ];

    memset( completeResponse, '\0', 5000 );

    LogInfo( ( "Start 1NCE device onboarding." ) );

    /* Create TLS connection for onboarding request. */
    TlsTransportStatus_t xNetworkStatus = nce_connect( &xNetworkContext );

    if( TLS_TRANSPORT_SUCCESS != xNetworkStatus )
    {
        LogError( ( "Failed to connect to 1NCE server." ) );
        return status;
    }

    /* Build onboarding request. */
    #ifdef democonfigRANGE_SIZE
        status = onboarding_request( status, &xNetworkContext, &completeResponse );

        if( status == EXIT_FAILURE )
        {
            return status;
        }
    #else
        char packetToSent[ 100 ];

        memset( packetToSent, '\0', 100 * sizeof( char ) );
        sprintf( packetToSent, "GET /device-api/onboarding HTTP/1.1\r\n"
                               "Host: %s\r\n"
                               "Accept: text/csv\r\n\r\n", ONBOARDING_ENDPOINT );
        LogInfo( ( "Send onboarding request:\r\n%.*s",
                   strlen( packetToSent ),
                   packetToSent ) );

        /* Send onboarding request. */
        int32_t sentBytes = TLS_FreeRTOS_send( &xNetworkContext,
                                               &packetToSent,
                                               strlen( packetToSent ) );

        configASSERT( sentBytes > 0 );

        if( sentBytes <= 0 )
        {
            LogError( ( "Failed to send onboarding request." ) );
            return status;
        }

        /* Receive onboarding response. */
        int32_t recvBytes = TLS_FreeRTOS_recv( &xNetworkContext,
                                               &PART[ 0 ],
                                               RECV_BUFFER_LEN );

        if( recvBytes < 0 )
        {
            LogError( ( "Failed to receive onboarding response." ) );
            return status;
        }

        LogDebug( ( "Received raw response: %d bytes.", recvBytes ) );
        LogDebug( ( "\r\n%.*s", recvBytes, PART ) );
        strcat( completeResponse,
                strstr( PART, "Express\r\n\r\n" ) + strlen( "Express\r\n\r\n" ) );
        memset( PART, ( int8_t ) '\0', sizeof( PART ) );

        while( recvBytes == RECV_BUFFER_LEN )
        {
            recvBytes = TLS_FreeRTOS_recv( &xNetworkContext,
                                           &PART[ 0 ],
                                           RECV_BUFFER_LEN );

            if( recvBytes < 0 )
            {
                LogError( ( "Failed to receive onboarding response." ) );
                return status;
            }

            LogDebug( ( "Received raw response: %d bytes.", strlen( PART ) ) );
            LogDebug( ( "\r\n%.*s", strlen( PART ), PART ) );
            strcat( completeResponse, PART );
            memset( PART, ( int8_t ) '\0', sizeof( PART ) );
        }
    #endif /* ifdef democonfigRANGE_SIZE */

    LogInfo( ( " Onboarding response is received." ) );

    /* Disconnect onboarding TLS connection. */
    TLS_FreeRTOS_Disconnect( &xNetworkContext );

    /* Re-initialize MQTT connection information with onboarding information. */
    status = nceReinitConnParams( completeResponse,
                                  pThingName,
                                  pEndpoint,
                                  pExampleTopic,
                                  pRootCA,
                                  pClientCert,
                                  pPrvKey );
    return status;
}