in source/fleetprovisioning/FleetProvisioning.cpp [363:488]
bool FleetProvisioning::RegisterThing(Iotidentity::IotIdentityClient identityClient)
{
auto onRegisterAcceptedSubAck = [&](int ioErr) {
if (ioErr != AWS_OP_SUCCESS)
{
LOGM_ERROR(
TAG,
"*** %s: Error subscribing to RegisterThing accepted: %s. ***",
DeviceClient::DC_FATAL_ERROR,
ErrorDebugString(ioErr));
}
registerAcceptedCompletedPromise.set_value(ioErr == AWS_OP_SUCCESS);
};
auto onRegisterRejectedSubAck = [&](int ioErr) {
if (ioErr != AWS_OP_SUCCESS)
{
LOGM_ERROR(
TAG,
"*** %s: Error subscribing to RegisterThing rejected: %s. ***",
DeviceClient::DC_FATAL_ERROR,
ErrorDebugString(ioErr));
}
registerRejectedCompletedPromise.set_value(ioErr == AWS_OP_SUCCESS);
};
auto onRegisterPublishSubAck = [&](int ioErr) {
if (ioErr != AWS_OP_SUCCESS)
{
LOGM_ERROR(
TAG,
"*** %s: Error publishing to RegisterThing: %s. ***",
DeviceClient::DC_FATAL_ERROR,
ErrorDebugString(ioErr));
}
registerPublishCompletedPromise.set_value(ioErr == AWS_OP_SUCCESS);
};
auto onRegisterAccepted = [&](RegisterThingResponse *response, int ioErr) {
if (ioErr == AWS_OP_SUCCESS)
{
LOGM_INFO(TAG, "RegisterThingResponse ThingName: %s.", response->ThingName->c_str());
thingName = response->ThingName->c_str();
deviceConfig = MapToString(response->DeviceConfiguration).c_str();
}
else
{
LOGM_ERROR(
TAG, "*** %s: Error on subscription: %s. ***", DeviceClient::DC_FATAL_ERROR, ErrorDebugString(ioErr));
}
registerThingCompletedPromise.set_value(ioErr == AWS_OP_SUCCESS);
};
auto onRegisterRejected = [&](ErrorResponse *error, int ioErr) {
if (ioErr == AWS_OP_SUCCESS)
{
LOGM_ERROR(
TAG,
"*** %s: RegisterThing failed with statusCode %d, errorMessage %s and errorCode %s. ***",
DeviceClient::DC_FATAL_ERROR,
*error->StatusCode,
error->ErrorMessage->c_str(),
error->ErrorCode->c_str());
}
else
{
LOGM_ERROR(
TAG, "*** %s: Error on subscription: %s. ***", DeviceClient::DC_FATAL_ERROR, ErrorDebugString(ioErr));
}
registerThingCompletedPromise.set_value(false);
};
LOG_INFO(TAG, "Subscribing to RegisterThing Accepted and Rejected topics");
RegisterThingSubscriptionRequest registerSubscriptionRequest;
registerSubscriptionRequest.TemplateName = templateName;
identityClient.SubscribeToRegisterThingAccepted(
registerSubscriptionRequest, AWS_MQTT_QOS_AT_LEAST_ONCE, onRegisterAccepted, onRegisterAcceptedSubAck);
identityClient.SubscribeToRegisterThingRejected(
registerSubscriptionRequest, AWS_MQTT_QOS_AT_LEAST_ONCE, onRegisterRejected, onRegisterRejectedSubAck);
auto futureValRegisterAcceptedCompletedPromise = registerAcceptedCompletedPromise.get_future();
auto futureValRegisterRejectedCompletedPromise = registerRejectedCompletedPromise.get_future();
if (futureValRegisterAcceptedCompletedPromise.wait_for(std::chrono::seconds(DEFAULT_WAIT_TIME_SECONDS)) ==
future_status::timeout ||
futureValRegisterRejectedCompletedPromise.wait_for(std::chrono::seconds(DEFAULT_WAIT_TIME_SECONDS)) ==
future_status::timeout)
{
LOGM_ERROR(
TAG,
"*** %s: Subscribing to RegisterThing Accepted and Rejected topics timed out. ***",
DeviceClient::DC_FATAL_ERROR);
return false;
}
if (!futureValRegisterAcceptedCompletedPromise.get() || !futureValRegisterRejectedCompletedPromise.get())
{
return false;
}
LOG_INFO(TAG, "Publishing to RegisterThing topic");
RegisterThingRequest registerThingRequest;
registerThingRequest.TemplateName = templateName;
registerThingRequest.CertificateOwnershipToken = certificateOwnershipToken;
registerThingRequest.Parameters = templateParameters;
identityClient.PublishRegisterThing(registerThingRequest, AWS_MQTT_QOS_AT_LEAST_ONCE, onRegisterPublishSubAck);
auto futureValRegisterPublishCompletedPromise = registerPublishCompletedPromise.get_future();
auto futureValRegisterThingCompletedPromise = registerThingCompletedPromise.get_future();
if (futureValRegisterPublishCompletedPromise.wait_for(std::chrono::seconds(DEFAULT_WAIT_TIME_SECONDS)) ==
future_status::timeout)
{
LOGM_ERROR(TAG, "*** %s: Publishing to Register Thing topic timed out. ***", DeviceClient::DC_FATAL_ERROR);
return false;
}
if (futureValRegisterThingCompletedPromise.wait_for(std::chrono::seconds(DEFAULT_WAIT_TIME_SECONDS)) ==
future_status::timeout)
{
LOGM_ERROR(TAG, "*** %s: Register Thing request timed out. ***", DeviceClient::DC_FATAL_ERROR);
return false;
}
return futureValRegisterPublishCompletedPromise.get() && futureValRegisterThingCompletedPromise.get();
}