using BPA.Message;
using BPASmartClient.Helper;
using BPASmartClient.MQTT;
using HBLConsole.Communication;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace BPASmartClient.Business
{
///
/// 消息处理接口
///
public delegate void RecivedHandle(IMessage message);
///
/// MQTT 管理类
///
public class MQTTMgr : IPlugin
{
//客户端ID
private int clientId;
//运行标识
private bool running = false;
//消息缓存
private ConcurrentQueue msg = new ConcurrentQueue();
//MQTT 代理
private MQTTProxy mqttProxy = new MQTTProxy();
//消息处理者
private List messageRecives = new List();
public void Initialize()
{
//MQTT 连接成功
mqttProxy.Connected = new Action(() =>
{
MqttHelper.GetInstance().MqttSubscriptionAsync(TopicDefine.GetInstance().SubscribTopics.ToArray());
});
//MQTT 连接成功
mqttProxy.LostConnect = new Action(() =>
{
MqttHelper.GetInstance().MqttSubscriptionAsync(TopicDefine.GetInstance().SubscribTopics.ToArray());
});
//MQTT 数据接收
mqttProxy.MessageRecive = new Action((message) =>
{
msg.Enqueue(message);
});
//MQTT 初始化
mqttProxy.Connect(Plugin.GetInstance().GetPlugin().MQTT_Config.Host, Plugin.GetInstance().GetPlugin().MQTT_Config.Port,
Guid.NewGuid().ToString());
ThreadManage.GetInstance().StartLong(() =>
{
while (running)
{
while (msg.Count > 0 && msg.TryDequeue(out string temp))
{
if (0 == clientId)
clientId = Plugin.GetInstance().GetPlugin().ClientId;
var package = BPAPackage.Deserialize(temp);
if (package?.ClientId == clientId)
{
if (package.Message != null)
{
for (int i = messageRecives.Count - 1; i >= 0; i--) {
messageRecives[i]?.Invoke(package.Message);
}
}
}
}
Thread.Sleep(50);
}
}, "MQTT 消息处理");
}
///
/// 设置消息处理者
///
/// 消息处理者
public void SetMessageReciveHandler(RecivedHandle messageRecive)
{
if (messageRecives.Contains(messageRecive))
return;
messageRecives.Add(messageRecive);
}
public void Dispose()
{
running = false;
mqttProxy.CloseConnect();
messageRecives.Clear();
}
}
}