in source/azure_iot_hub_client.c [606:700]
AzureIoTResult_t AzureIoTHubClient_Init( AzureIoTHubClient_t * pxAzureIoTHubClient,
const uint8_t * pucHostname,
uint16_t ulHostnameLength,
const uint8_t * pucDeviceId,
uint16_t ulDeviceIdLength,
AzureIoTHubClientOptions_t * pxHubClientOptions,
uint8_t * pucBuffer,
uint32_t ulBufferLength,
AzureIoTGetCurrentTimeFunc_t xGetTimeFunction,
const AzureIoTTransportInterface_t * pxTransportInterface )
{
AzureIoTResult_t xResult;
AzureIoTMQTTResult_t xMQTTResult;
az_result xCoreResult;
az_iot_hub_client_options xHubOptions;
uint8_t * pucNetworkBuffer;
uint32_t ulNetworkBufferLength;
az_span xHostnameSpan;
az_span xDeviceIDSpan;
if( ( pxAzureIoTHubClient == NULL ) ||
( pucHostname == NULL ) || ( ulHostnameLength == 0 ) ||
( pucDeviceId == NULL ) || ( ulDeviceIdLength == 0 ) ||
( pucBuffer == NULL ) || ( ulBufferLength == 0 ) ||
( xGetTimeFunction == NULL ) || ( pxTransportInterface == NULL ) )
{
AZLogError( ( "AzureIoTHubClient_Init failed: invalid argument" ) );
xResult = eAzureIoTErrorInvalidArgument;
}
else if( ( ulBufferLength < azureiotconfigTOPIC_MAX ) ||
( ulBufferLength < ( azureiotconfigUSERNAME_MAX + azureiotconfigPASSWORD_MAX ) ) )
{
AZLogError( ( "AzureIoTHubClient_Init failed: not enough memory passed" ) );
xResult = eAzureIoTErrorOutOfMemory;
}
else
{
memset( ( void * ) pxAzureIoTHubClient, 0, sizeof( AzureIoTHubClient_t ) );
/* Setup working buffer to be used by middleware */
pxAzureIoTHubClient->_internal.ulWorkingBufferLength =
( azureiotconfigUSERNAME_MAX + azureiotconfigPASSWORD_MAX ) > azureiotconfigTOPIC_MAX ?
( azureiotconfigUSERNAME_MAX + azureiotconfigPASSWORD_MAX ) : azureiotconfigTOPIC_MAX;
pxAzureIoTHubClient->_internal.pucWorkingBuffer = pucBuffer;
pucNetworkBuffer = pucBuffer + pxAzureIoTHubClient->_internal.ulWorkingBufferLength;
ulNetworkBufferLength = ulBufferLength - pxAzureIoTHubClient->_internal.ulWorkingBufferLength;
/* Initialize Azure IoT Hub Client */
xHostnameSpan = az_span_create( ( uint8_t * ) pucHostname, ( int32_t ) ulHostnameLength );
xDeviceIDSpan = az_span_create( ( uint8_t * ) pucDeviceId, ( int32_t ) ulDeviceIdLength );
xHubOptions = az_iot_hub_client_options_default();
if( pxHubClientOptions )
{
xHubOptions.module_id = az_span_create( ( uint8_t * ) pxHubClientOptions->pucModuleID, ( int32_t ) pxHubClientOptions->ulModuleIDLength );
xHubOptions.model_id = az_span_create( ( uint8_t * ) pxHubClientOptions->pucModelID, ( int32_t ) pxHubClientOptions->ulModelIDLength );
xHubOptions.user_agent = az_span_create( ( uint8_t * ) pxHubClientOptions->pucUserAgent, ( int32_t ) pxHubClientOptions->ulUserAgentLength );
xHubOptions.component_names = ( az_span * ) pxHubClientOptions->pxComponentList;
xHubOptions.component_names_length = ( int32_t ) pxHubClientOptions->ulComponentListLength;
}
else
{
xHubOptions.user_agent = az_span_create( ( uint8_t * ) azureiothubUSER_AGENT, sizeof( azureiothubUSER_AGENT ) - 1 );
}
if( az_result_failed( xCoreResult = az_iot_hub_client_init( &pxAzureIoTHubClient->_internal.xAzureIoTHubClientCore,
xHostnameSpan, xDeviceIDSpan, &xHubOptions ) ) )
{
AZLogError( ( "Failed to initialize az_iot_hub_client_init: core error=0x%08x", ( uint16_t ) xCoreResult ) );
xResult = AzureIoT_TranslateCoreError( xCoreResult );
}
/* Initialize AzureIoTMQTT library. */
else if( ( xMQTTResult = AzureIoTMQTT_Init( &( pxAzureIoTHubClient->_internal.xMQTTContext ), pxTransportInterface,
prvGetTimeMs, prvEventCallback,
pucNetworkBuffer, ulNetworkBufferLength ) ) != eAzureIoTMQTTSuccess )
{
AZLogError( ( "Failed to initialize AzureIoTMQTT_Init: MQTT error=0x%08x", xMQTTResult ) );
xResult = eAzureIoTErrorInitFailed;
}
else
{
pxAzureIoTHubClient->_internal.pucDeviceID = pucDeviceId;
pxAzureIoTHubClient->_internal.ulDeviceIDLength = ulDeviceIdLength;
pxAzureIoTHubClient->_internal.pucHostname = pucHostname;
pxAzureIoTHubClient->_internal.ulHostnameLength = ulHostnameLength;
pxAzureIoTHubClient->_internal.xTimeFunction = xGetTimeFunction;
pxAzureIoTHubClient->_internal.xTelemetryCallback =
pxHubClientOptions == NULL ? NULL : pxHubClientOptions->xTelemetryCallback;
xResult = eAzureIoTSuccess;
}
}
return xResult;
}