in source/core_mqtt.c [1759:1852]
MQTTStatus_t MQTT_Connect( MQTTContext_t * pContext,
const MQTTConnectInfo_t * pConnectInfo,
const MQTTPublishInfo_t * pWillInfo,
uint32_t timeoutMs,
bool * pSessionPresent )
{
size_t remainingLength = 0UL, packetSize = 0UL;
int32_t bytesSent;
MQTTStatus_t status = MQTTSuccess;
MQTTPacketInfo_t incomingPacket = { 0 };
incomingPacket.type = ( uint8_t ) 0;
if( ( pContext == NULL ) || ( pConnectInfo == NULL ) || ( pSessionPresent == NULL ) )
{
LogError( ( "Argument cannot be NULL: pContext=%p, "
"pConnectInfo=%p, pSessionPresent=%p.",
( void * ) pContext,
( void * ) pConnectInfo,
( void * ) pSessionPresent ) );
status = MQTTBadParameter;
}
if( status == MQTTSuccess )
{
/* Get MQTT connect packet size and remaining length. */
status = MQTT_GetConnectPacketSize( pConnectInfo,
pWillInfo,
&remainingLength,
&packetSize );
LogDebug( ( "CONNECT packet size is %lu and remaining length is %lu.",
( unsigned long ) packetSize,
( unsigned long ) remainingLength ) );
}
if( status == MQTTSuccess )
{
status = MQTT_SerializeConnect( pConnectInfo,
pWillInfo,
remainingLength,
&( pContext->networkBuffer ) );
}
if( status == MQTTSuccess )
{
bytesSent = sendPacket( pContext,
pContext->networkBuffer.pBuffer,
packetSize );
if( bytesSent < ( int32_t ) packetSize )
{
LogError( ( "Transport send failed for CONNECT packet." ) );
status = MQTTSendFailed;
}
else
{
LogDebug( ( "Sent %ld bytes of CONNECT packet.",
( long int ) bytesSent ) );
}
}
/* Read CONNACK from transport layer. */
if( status == MQTTSuccess )
{
status = receiveConnack( pContext,
timeoutMs,
pConnectInfo->cleanSession,
&incomingPacket,
pSessionPresent );
}
if( status == MQTTSuccess )
{
/* Resend PUBRELs when reestablishing a session, or clear records for new sessions. */
status = handleSessionResumption( pContext, *pSessionPresent );
}
if( status == MQTTSuccess )
{
LogInfo( ( "MQTT connection established with the broker." ) );
pContext->connectStatus = MQTTConnected;
/* Initialize keep-alive fields after a successful connection. */
pContext->keepAliveIntervalSec = pConnectInfo->keepAliveSeconds;
pContext->waitingForPingResp = false;
pContext->pingReqSendTimeMs = 0U;
}
else
{
LogError( ( "MQTT connection failed with status = %s.",
MQTT_Status_strerror( status ) ) );
}
return status;
}