Exemplo n.º 1
0
        private void ParseMessage(INikoMessage message)
        {
            switch (message.MessageType)
            {
            case NikoMessageType.Rsp:
            case NikoMessageType.Evt:
                ParseResponse((NikoMessage)message);
                break;

            case NikoMessageType.Err:
                ParseError((NikoMessage)message);
                break;
            }
        }
Exemplo n.º 2
0
        public Task <ConnectionResult> Connect(string hostname, string token, CancellationToken canceltoken = default)
        {
            var tcs = new TaskCompletionSource <ConnectionResult>();

            var factory = new MqttFactory();

            _mqttClient = factory.CreateMqttClient();

            var options = new MqttClientOptionsBuilder()
                          .WithClientId(Guid.NewGuid().ToString())
                          .WithTcpServer(hostname, 8884)
                          .WithCredentials("hobby", token)
                          .WithTls(new MqttClientOptionsBuilderTlsParameters
            {
                UseTls      = true,
                SslProtocol = SslProtocols.Tls12,
                CertificateValidationCallback =
                    (X509Certificate x, X509Chain y, SslPolicyErrors z, IMqttClientOptions o) => true
            })
                          .WithCleanSession()
                          .Build();

            _mqttClient.UseConnectedHandler(d =>
            {
                try
                {
                    tcs.TrySetResult(
                        new ConnectionResult((ConnectResultCode)d.AuthenticateResult.ResultCode));
                }
                catch (Exception e)
                {
                    tcs.TrySetException(e);
                }
            });


            _mqttClient.UseApplicationMessageReceivedHandler(d =>
            {
                Logger.WriteInfo($"Message received {d.ApplicationMessage.Topic}");
                var payload = System.Text.Encoding.Default.GetString(d.ApplicationMessage.Payload);
                Logger.WriteReceivedRaw($"Message received { payload }");
                try
                {
                    var msgtype = d.ApplicationMessage.Topic.Split('/').Last();

                    INikoMessage response = null;
                    var doc = JsonDocument.Parse(payload);

                    switch (msgtype)
                    {
                    case "cmd":
                        break;

                    case "evt":
                        var evtparams = JsonDocument.Parse(doc.RootElement.GetProperty("Params").GetRawText()).RootElement;
                        response      = new NikoMessage {
                            MessageType = NikoMessageType.Evt, Method = doc.RootElement.GetProperty("Method").GetString(), Params = evtparams, CorrelationData = Guid.Empty
                        };
                        break;

                    case "rsp":
                        var rspparams = JsonDocument.Parse(doc.RootElement.GetProperty("Params").GetRawText()).RootElement;
                        response      = new NikoMessage {
                            MessageType = NikoMessageType.Rsp, Method = doc.RootElement.GetProperty("Method").GetString(), Params = rspparams, CorrelationData = Guid.Empty
                        };
                        break;

                    case "err":
                        response = new NikoMessage {
                            MessageType = NikoMessageType.Err, Method = doc.RootElement.GetProperty("Method").GetString(), Params = doc
                        };
                        break;
                    }


                    ResponseObservable.MessageReceived(response);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    throw;
                }
            });

            _mqttClient.UseDisconnectedHandler(d =>
            {
                Disconnected?.Invoke(this, EventArgs.Empty);
            });


            _mqttClient.ConnectAsync(options, canceltoken);

            return(tcs.Task);
        }