private async Task InitClient()
        {
            if (_mqttClient == null)
            {
                _mqttClient = _mqttfactory.CreateMqttClient();

                var mqttHost = ConfigurationManagerExtensions.GetValueByKey("Mqtt:Host") ?? "127.0.0.1";


                var option = new MQTTnet.Client.MqttClientOptions
                {
                    ChannelOptions = new MQTTnet.Client.MqttClientTcpOptions
                    {
                        Server = mqttHost
                    },
                    ClientId = "dudu_" + Guid.NewGuid().ToString(),
                    //KeepAlivePeriod = new TimeSpan(0, 0, 1)
                };

                _mqttClient.ApplicationMessageReceived += (sender, e) =>
                {
                    Console.WriteLine("Client Received: Do anything you want");
                    Console.WriteLine("Sender");
                    Console.WriteLine(JsonConvert.SerializeObject(sender));
                    Console.WriteLine("MqttApplicationMessageReceivedEventArgs");
                    Console.WriteLine(JsonConvert.SerializeObject(e));
                };

                _mqttClient.Disconnected += (sender, e) =>
                {
                    //try reconnect
                    _mqttClient.ConnectAsync(option);
                };

                await _mqttClient.ConnectAsync(option);

                await _mqttClient.SubscribeAsync(new List <TopicFilter>() {
                    new TopicFilterBuilder()
                    .WithTopic(_mqttClient.Options.ClientId)
                    .WithAtLeastOnceQoS()
                    .Build()
                });
            }
        }
示例#2
0
        public bool Connect()
        {
            try
            {
                var factory = new MQTTnet.MqttFactory();
                mqttClient = factory.CreateMqttClient();

                var options = new MQTTnet.Client.Options.MqttClientOptionsBuilder()
                              .WithTcpServer(this.Ip, this.Port)
                              .Build();

                mqttClient.ConnectAsync(options, System.Threading.CancellationToken.None);

                mqttClient.ConnectedHandler = new MQTTnet.Client.Connecting.MqttClientConnectedHandlerDelegate(e =>
                {
                    if (Subscriptions != null)
                    {
                        MakeSubscriptions();
                    }
                });

                mqttClient.ApplicationMessageReceivedHandler = new MQTTnet.Client.Receiving.MqttApplicationMessageReceivedHandlerDelegate(e =>
                {
                    String msg = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.Payload);

                    var deserializedData = JsonConvert.DeserializeObject <EventData>(msg);
                    deserializedData.Id  = e.ApplicationMessage.Topic;

                    foreach (var s in Subscriptions)
                    {
                        if (s.Value.EventId == deserializedData.Id)
                        {
                            var pointer    = s.Value.FunctionPointer;
                            var parameters = pointer.Method.GetParameters();
                            var parameterArrayForInvoke = new object[parameters.Length];

                            foreach (var eintrag in s.Value.IntegrationFlow)
                            {
                                int currentParameterCallIndex = 0;
                                for (; currentParameterCallIndex < parameters.Length; currentParameterCallIndex++)
                                {
                                    if (parameters[currentParameterCallIndex].Name == eintrag.Key)
                                    {
                                        var currentParameterCallType = pointer.Method.GetParameters()[currentParameterCallIndex].ParameterType;
                                        break;
                                    }
                                }

                                Object deserializedParameter = null;
                                deserializedParameter        = deserializedData.Data[eintrag.Value];

                                parameterArrayForInvoke[currentParameterCallIndex] = deserializedParameter;
                            }

                            pointer.DynamicInvoke(parameterArrayForInvoke);
                        }
                    }
                });
            }
            catch
            {
                return(false);
            }

            return(true);
        }