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;
}