예제 #1
0
        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();
        }
예제 #2
0
        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();
                        }
                    }
                }
            }
        }