public override async Task OnMqttDataChanged(EnumQueueMode mode, BoxMqttApplicationMessage applicationMessage)
        {
            try
            {
                //    如果是删除的触发事件,则不需处理
                if (mode == EnumQueueMode.Dequeue)
                {
                    return;
                }

                //    将获取到的数据进行转换为监听数据,然后推送到kafka
                var messageStr  = Encoding.UTF8.GetString(applicationMessage.Payload);
                var monitorData = JsonSerializer.Deserialize <FBoxMonitorDataDto>(messageStr);

                var dmonDataConsumerOutputs = monitorData.FBoxMonitorDataInfos.Select(data =>
                                                                                      new KafkaMonitorDataOutput
                {
                    State     = data.Value == null || string.IsNullOrWhiteSpace(data.Value.ToString()) ? 1 : 0,
                    DmonName  = data.Name,
                    Value     = data.Value,
                    TimeStamp = monitorData.Time,
                    BoxBo     = applicationMessage.BoxNo,
                    MqttName  = MqttServerType.FBoxMqtt
                }).ToArray();
                await _kafkaProducerManager.PushDataAsync(_kafkaSetting.MonitorDataTopic, applicationMessage.BoxNo,
                                                          dmonDataConsumerOutputs);

                //    去除当前消费掉的元素
                _messageQueueManager.Dequeue(applicationMessage.TopicName);
            }
            catch (Exception e)
            {
                _logger.LogError(e.Message);
            }
        }
Example #2
0
        public async Task BoxStateSubscriptionAsync(KafkaBoxStateInput input)
        {
            Console.WriteLine("这是FBoxMqttService的BoxStateSubscriptionAsync方法:" + JsonSerializer.Serialize(input));
            //    如果当前盒子已经推送过一次,那么就不在需要进行访问API
            if (_boxStateBoxNoCache.ContainsKey(input.BoxNo))
            {
                return;
            }

            //    盒子状态第一次调用此方法时需要立即进行返回此盒子状态,所以需要请求api进行获取当前盒子状态,然后返回
            try
            {
                //    获取盒子状态,然后推送kafka
                var isConnected = await _boxStateHttpClient.IsConnectedAsync(input.BoxNo);

                await _kafkaProducerManager.PushDataAsync(_kafkaSetting.BoxStateTopic,
                                                          input.BoxNo,
                                                          new KafkaBoxStateOutput
                {
                    MqttName = input.MqttName,
                    //    在线为1,离线为3
                    BoxState = isConnected ? 1 : 3,
                    BoxNo    = input.BoxNo
                });
            }
            catch (UnauthorizedAccessException e)
            {
                Console.WriteLine(e.Message);
                _logger.LogError(e.Message);
            }

            //    然后再进行向mqtt进行发送订阅盒子状态消息
            //  获取当前mqtt实例
            var mqttManager = _mqttManagerFunc(input.MqttName);

            var connectedTopic = _mqttSetting.BoxConnectedTopicPrefix + input.BoxNo + "/" +
                                 _mqttSetting.BoxConnectedTopic;
            var disConnectedTopic = _mqttSetting.BoxConnectedTopicPrefix + input.BoxNo + "/" +
                                    _mqttSetting.BoxDisConnectedTopic;
            await mqttManager.SubscribeAsync(connectedTopic, disConnectedTopic);

            //    缓存当前数据
            _boxStateBoxNoCache.TryAdd(input.BoxNo, input.Action);
            await File.WriteAllTextAsync($"./Cache/{nameof(FBoxMqttService)}.{nameof(_boxStateBoxNoCache)}.txt",
                                         JsonSerializer.Serialize(_boxStateBoxNoCache));
        }