예제 #1
0
        public SendForm()
        {
            InitializeComponent();

            _pingDic     = new Dictionary <string, PingInfo>();
            _syncContext = SynchronizationContext.Current;

            _mqttClientHelper  = new MqttClientUtil.MqttClientHelper();
            _sendMessageHelper = new SendMessageHelper();
            _recvMessageHelper = new MessageHelper();
            _mqttMsgHandler    = new SendMqttMsgHandler();

            _mqttClientHelper.OnMqttConnect  += OnMqttConnect;
            _mqttClientHelper.OnMqttMessage  += OnMqttRecvMessage;
            _mqttClientHelper.OnErrorMessage += OnMqttErrorMessage; //MQTT错误消息
            _sendMessageHelper.OnSendMessage += OnMqttSendMessage;
            _recvMessageHelper.OnMessage     += OnRecvMessage;
            _mqttMsgHandler.OnLogMsg         += OnLogMsg;
            _mqttMsgHandler.OnErrorMsg       += OnErrorMsg;
            _mqttMsgHandler.OnPublishMsg     += OnPublishMsg;
            _mqttMsgHandler.OnPangMsg        += OnPangMsg;

            _mqttClientHelper.InitMqttParas(
                MqttClientConstants.MqttClientSendTopic,
                MqttClientConstants.MqttClientRecvTopic,
                MqttClientConstants.MqttClientHeartbeatTopic,
                MqttMessageHandler.GetWillMessage());
            _recvMessageHelper.Start();
            _mqttMsgHandler.Init();
        }
예제 #2
0
        public MqttHandler(IConfiguration config, IHubContext <MessageHub> hubContext, IGamerContextMethods gamerStorage)
        {
            Id            = Guid.NewGuid();
            _config       = config;
            _hubContext   = hubContext;
            _gamerStorage = gamerStorage;
            var key = _config.GetValue <string>("MqttSettings:BrokerUri");

            _messageHandler = new MqttMessageHandler(key);
            _messageHandler.Subscribe(Topics.ScoreUpdate);
            _messageHandler.MqttMsgPublishReceived += _messageHandler_MqttMsgPublishReceived;
        }
예제 #3
0
        private void Channel_OnReceive(object sender, ChannelReceivedEventArgs args)
        {
            MqttMessage        msg     = MqttMessage.DecodeMessage(args.Message);
            MqttMessageHandler handler = MqttMessageHandler.Create(session, msg);

            MqttMessage response = handler.ProcessAsync().GetAwaiter().GetResult();

            if (response != null)
            {
                channel.SendAsync(response.Encode()).GetAwaiter();
            }
        }
예제 #4
0
        private async Task ProcessMessageAsync(MqttMessage message)
        {
            try
            {
                MqttMessageHandler handler = MqttMessageHandler.Create(session, message);
                MqttMessage        msg     = await handler.ProcessAsync();

                if (msg != null)
                {
                    await Channel.SendAsync(msg.Encode());
                }
            }
            catch (Exception ex)
            {
                logger.LogError(ex, $"MQTT adapter ProcessMessageAsync error on channel '{Channel.Id}'.");
                OnError.Invoke(this, new ProtocolAdapterErrorEventArgs(Channel.Id, ex));
            }
        }
예제 #5
0
        private void Channel_OnReceive(object sender, ChannelReceivedEventArgs args)
        {
            MqttMessage        msg     = MqttMessage.DecodeMessage(args.Message);
            MqttMessageHandler handler = MqttMessageHandler.Create(session, msg, dispatcher);

            try
            {
                MqttMessage message = handler.ProcessAsync().GetAwaiter().GetResult();
                if (message != null)
                {
                    channel.SendAsync(message.Encode()).GetAwaiter();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Trace.TraceError(ex.Message);
                OnChannelError?.Invoke(this, new ChannelErrorEventArgs(channel.Id, ex));
            }

            //Task task = Task.Factory.StartNew(async () =>
            //{
            //    try
            //    {
            //        MqttMessage message = await handler.ProcessAsync();
            //        if (message != null)
            //        {
            //            await channel.SendAsync(message.Encode());
            //        }
            //    }
            //    catch(Exception ex)
            //    {
            //        Console.WriteLine(ex.Message);
            //        Trace.TraceError(ex.Message);
            //    }
            //});

            //Task.WaitAll(task);

            //if (task.Exception != null)
            //{
            //    OnChannelError?.Invoke(this, new ChannelErrorEventArgs(channel.Id, task.Exception.InnerException));
            //}
        }
예제 #6
0
        private void Channel_OnReceive(object sender, ChannelReceivedEventArgs args)
        {
            MqttMessage        msg     = MqttMessage.DecodeMessage(args.Message);
            MqttMessageHandler handler = MqttMessageHandler.Create(session, msg, dispatcher);

            try
            {
                MqttMessage message = handler.ProcessAsync().GetAwaiter().GetResult();
                if (message != null)
                {
                    Channel.SendAsync(message.Encode()).GetAwaiter();
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                Trace.TraceError(ex.Message);
                OnChannelError?.Invoke(this, new ChannelErrorEventArgs(Channel.Id, ex));
            }
        }
예제 #7
0
        private static void MqttTests()
        {
            var client = new MqttMessageHandler("tpg-hackathon.westeurope.cloudapp.azure.com");//new MqttMessageHandler("169.254.151.119");

            client.MqttMsgPublishReceived += PublishReceived;

            var gamerId = Guid.NewGuid();

            client.Subscribe(Topics.Gamer);

            var packmanPlayer = new Gamer()
            {
                Id = gamerId,
            };

            client.Publish <Gamer>(Topics.Gamer, packmanPlayer);

            client.Subscribe(Topics.Score);

            var score = new Score(gamerId, 1337);

            client.Publish <Score>(Topics.Score, score);
        }
예제 #8
0
        /// <summary>
        /// Processes a receive MQTT message and a response or null (no response).
        /// </summary>
        /// <param name="message"></param>
        /// <returns></returns>
        public async Task <MqttMessage> ReceiveAsync(MqttMessage message)
        {
            MqttMessageHandler handler = MqttMessageHandler.Create(this, message);

            return(await handler.ProcessAsync());
        }