in iothub/device/src/Transport/AmqpIot/AmqpIotSession.cs [197:276]
private static async Task<AmqpIotSendingLink> OpenSendingAmqpLinkAsync(
IDeviceIdentity deviceIdentity,
AmqpSession amqpSession,
byte? senderSettleMode,
byte? receiverSettleMode,
string deviceTemplate,
string moduleTemplate,
string linkSuffix,
string correlationId,
CancellationToken cancellationToken)
{
if (Logging.IsEnabled)
{
Logging.Enter(typeof(AmqpIotSession), deviceIdentity, nameof(OpenSendingAmqpLinkAsync));
}
var amqpLinkSettings = new AmqpLinkSettings
{
LinkName = linkSuffix,
Role = false,
InitialDeliveryCount = 0,
Target = new Target { Address = BuildLinkAddress(deviceIdentity, deviceTemplate, moduleTemplate) },
Source = new Source { Address = deviceIdentity.IotHubConnectionString.DeviceId },
SndSettleMode = senderSettleMode,
RcvSettleMode = receiverSettleMode,
};
amqpLinkSettings.AddProperty(AmqpIotConstants.ClientVersion, deviceIdentity.ProductInfo.ToString());
if (correlationId != null)
{
amqpLinkSettings.AddProperty(AmqpIotConstants.ChannelCorrelationId, correlationId);
}
if (!string.IsNullOrWhiteSpace(deviceIdentity.AmqpTransportSettings.AuthenticationChain))
{
amqpLinkSettings.AddProperty(AmqpIotConstants.AuthChain, deviceIdentity.AmqpTransportSettings.AuthenticationChain);
}
// This check is added to enable the device or module client to available plug and play features. For devices or modules that pass in the model Id,
// the SDK will enable plug and play features by setting the modelId to AMQP link settings.
if (!string.IsNullOrWhiteSpace(deviceIdentity.Options?.ModelId))
{
amqpLinkSettings.AddProperty(AmqpIotConstants.ModelId, deviceIdentity.Options.ModelId);
}
amqpLinkSettings.AddProperty(AmqpIotConstants.ApiVersion, ClientApiVersionHelper.ApiVersionString);
try
{
var sendingLink = new SendingAmqpLink(amqpLinkSettings);
sendingLink.AttachTo(amqpSession);
await sendingLink.OpenAsync(cancellationToken).ConfigureAwait(false);
return new AmqpIotSendingLink(sendingLink);
}
catch (Exception e) when (!e.IsFatal())
{
Exception ex = AmqpIotExceptionAdapter.ConvertToIotHubException(e, amqpSession);
if (ReferenceEquals(e, ex))
{
throw;
}
else
{
if (ex is AmqpIotResourceException)
{
amqpSession.SafeClose();
throw new IotHubCommunicationException(ex.Message, ex);
}
throw ex;
}
}
finally
{
if (Logging.IsEnabled)
{
Logging.Exit(typeof(AmqpIotSession), deviceIdentity, nameof(OpenSendingAmqpLinkAsync));
}
}
}