public static void ConnectIoTDeviceGatewayWithWebSocketsMqtt() { var credentials = TelenorMicCredentials.AWSCredentials; Skip.If(credentials is null, "No AWS Credentials configured"); IMqttClientOptions mqttOptions; using (var iotDeviceGatewayClient = new AmazonIoTDeviceGatewayClient(credentials, RegionEndpoint.GetBySystemName(TelenorMicCredentials.RegionSystemName))) { var uriDetails = iotDeviceGatewayClient.CreateMqttWebSocketUriAsync(new Model.CreateMqttWebSocketUriRequest { EndpointAddress = TelenorMicCredentials.IotEndpoint }).ConfigureAwait(false).GetAwaiter().GetResult(); mqttOptions = new MqttClientOptionsBuilder() .WithTls() .WithWebSocketServer(uriDetails.RequestUri?.ToString()) .Build(); if (mqttOptions.ChannelOptions is MqttClientWebSocketOptions webSocketOptions) { webSocketOptions.RequestHeaders = uriDetails.Headers; } } using var mqttClient = mqttFactory.CreateMqttClient(); var connectResult = mqttClient.ConnectAsync(mqttOptions) .ConfigureAwait(false).GetAwaiter().GetResult(); mqttClient.DisconnectAsync().ConfigureAwait(false).GetAwaiter().GetResult(); }
public static async Task Run(CancellationToken cancelToken) { Console.Write("MIC Hostname: "); var hostname = await ConsoleUtils.ReadLineAsync(cancelToken); Console.WriteLine("Getting MIC manifest . . ."); using (var micClient = await CreateMicClient(hostname, cancelToken)) { var micClientConfig = micClient.Config; micClientConfig.LogMetrics = true; Console.Write("Username: "******"Password: "******"Logging in . . . "); var login = await micClient.AuthLogin( username, password, cancelToken); ((IMicModel)(login.User)).AdditionalData.TryGetValue("domainPath", out object domainPath); Console.WriteLine("Successful!"); Console.WriteLine(); var awsCredentials = ((IMicClient)micClient).AwsCredentials; Console.WriteLine($"Cognito Identity pool: {awsCredentials.IdentityPoolId}"); Console.WriteLine($" Identity Id: {login.Credentials.IdentityId}"); Console.WriteLine($" Login provider: {micClient.Manifest.GetCognitoProviderName()}"); Console.WriteLine($" Token: {login.Credentials.Token}"); Console.WriteLine(); var immutableCredentials = await awsCredentials.GetCredentialsAsync(); Console.WriteLine("AWS Immutable Credentials:"); Console.WriteLine($" Access key: {immutableCredentials.AccessKey}"); Console.WriteLine($" Secret key: {immutableCredentials.SecretKey}"); if (immutableCredentials.UseToken) { Console.WriteLine($" Token: {immutableCredentials.Token}"); } Console.WriteLine(); var userInfo = await micClient.UserGet(login.User.Username, cancelToken); Console.WriteLine(JsonConvert.SerializeObject(userInfo, Formatting.Indented)); Console.WriteLine(); Console.WriteLine($"IoT Endpoint: {micClient.Manifest.IotEndpoint}"); Console.Write("Connecting MQTT Client . . . "); var iotConfig = micClientConfig.Create <AmazonIoTDeviceGatewayConfig>(); using (var iotClient = new AmazonIoTDeviceGatewayClient(awsCredentials, iotConfig)) { var mqttOptionsTask = iotClient.CreateMqttWebSocketClientOptionsAsync(micClient.Manifest.IotEndpoint, cancelToken); using (var mqttClient = new MqttFactory().CreateMqttClient()) { var mqttConsoleSync = new object(); mqttClient.ApplicationMessageReceived += (sender, e) => { Task.Run(() => { lock (mqttConsoleSync) { Console.WriteLine($"Application Message received by client {e.ClientId}"); Console.WriteLine($"Topic: {e.ApplicationMessage.Topic}, QoS: {e.ApplicationMessage.QualityOfServiceLevel}"); if (e.ApplicationMessage.Retain) { Console.WriteLine(" Message should be retained"); } int payloadLength = e.ApplicationMessage.Payload?.Length ?? 0; Console.WriteLine($" Message Payload: ({payloadLength} byte{(payloadLength == 1 ? "" : "s")})"); Console.WriteLine(); string payload = e.ApplicationMessage.ConvertPayloadToString(); try { var jtoken = JToken.Parse(payload); payload = jtoken.ToString(Formatting.Indented); } catch { } Console.WriteLine(payload); Console.WriteLine(); Console.WriteLine(new string('-', count: 20)); Console.WriteLine(); } }, cancelToken); }; var mqttOptions = await mqttOptionsTask; var connectInfo = await mqttClient.ConnectAsync(mqttOptions); try { cancelToken.ThrowIfCancellationRequested(); Console.WriteLine("Successful!"); Console.Write($"Subscribing to events . . . "); var subscriptions = await mqttClient.SubscribeAsync($"event{domainPath}"); cancelToken.ThrowIfCancellationRequested(); var subscriptionsWild = await mqttClient.SubscribeAsync($"event{domainPath}#"); cancelToken.ThrowIfCancellationRequested(); var thingUpdateSubs = await mqttClient.SubscribeAsync($"thing-update{domainPath}#"); cancelToken.ThrowIfCancellationRequested(); int subCount = subscriptions.Count + subscriptionsWild.Count + thingUpdateSubs.Count; Console.WriteLine($"{subCount} subscription{(subCount == 1 ? "" : "s")}."); foreach (var sub in subscriptions.Concat(subscriptionsWild).Concat(thingUpdateSubs)) { var tf = sub.TopicFilter; Console.WriteLine($"{tf.Topic} (QoS: {tf.QualityOfServiceLevel}): {sub.ReturnCode}"); } Console.WriteLine(); cancelToken.ThrowIfCancellationRequested(); var resetEvent = new ManualResetEventSlim(); resetEvent.Wait(cancelToken); } finally { await mqttClient.DisconnectAsync(); } } } } }