@@ -8,7 +8,7 @@ | |||||
<ItemGroup> | <ItemGroup> | ||||
<PackageReference Include="BPA.ApolloClient" Version="1.0.9" /> | <PackageReference Include="BPA.ApolloClient" Version="1.0.9" /> | ||||
<PackageReference Include="BPA.Message" Version="1.0.10" /> | |||||
<PackageReference Include="BPA.Message" Version="1.0.11" /> | |||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" /> | <PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.1" /> | ||||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0" /> | <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0" /> | ||||
<PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.0" /> | <PackageReference Include="System.Configuration.ConfigurationManager" Version="6.0.0" /> | ||||
@@ -53,7 +53,7 @@ namespace BPASmartClient.Business | |||||
mqttProxy.Connect(Plugin.GetInstance().GetPlugin<ConfigMgr>().MQTT_Config.Host, Plugin.GetInstance().GetPlugin<ConfigMgr>().MQTT_Config.Port, | mqttProxy.Connect(Plugin.GetInstance().GetPlugin<ConfigMgr>().MQTT_Config.Host, Plugin.GetInstance().GetPlugin<ConfigMgr>().MQTT_Config.Port, | ||||
Guid.NewGuid().ToString()); | Guid.NewGuid().ToString()); | ||||
ThreadManage.GetInstance().StartLong(() => | |||||
ThreadManage.GetInstance().Start(() => | |||||
{ | { | ||||
while (running) | while (running) | ||||
{ | { | ||||
@@ -74,7 +74,16 @@ namespace BPASmartClient.Business | |||||
} | } | ||||
Thread.Sleep(50); | Thread.Sleep(50); | ||||
} | } | ||||
}, "MQTT 消息处理",true); | |||||
}, "MQTT 消息处理"); | |||||
} | |||||
/// <summary> | |||||
/// MQTT消息推送 | |||||
/// </summary> | |||||
/// <param name="topic">主题</param> | |||||
/// <param name="message">消息体</param> | |||||
public void Publish(string topic, string message) { | |||||
mqttProxy.Publish(topic, message); | |||||
} | } | ||||
/// <summary> | /// <summary> | ||||
@@ -21,7 +21,7 @@ namespace BPASmartClient.Business | |||||
public class OrderProxy : IPlugin | public class OrderProxy : IPlugin | ||||
{ | { | ||||
//订单队列 | //订单队列 | ||||
private ConcurrentQueue<MorkOrderPush> orders = new ConcurrentQueue<MorkOrderPush>(); | |||||
private ConcurrentDictionary<int, ConcurrentQueue<MorkOrderPush>> orders = new ConcurrentDictionary<int, ConcurrentQueue<MorkOrderPush>>(); | |||||
//运行标识 | //运行标识 | ||||
private bool running = false; | private bool running = false; | ||||
//设备管理 | //设备管理 | ||||
@@ -39,36 +39,44 @@ namespace BPASmartClient.Business | |||||
if (orderInfo == null) return; | if (orderInfo == null) return; | ||||
if (orderInfo is MorkOrderPush morkOrderpush) | if (orderInfo is MorkOrderPush morkOrderpush) | ||||
{ | { | ||||
orders.Enqueue(morkOrderpush); | |||||
if (!orders.ContainsKey(morkOrderpush.DeviceId)) | |||||
{ | |||||
orders.TryAdd(morkOrderpush.DeviceId, new ConcurrentQueue<MorkOrderPush>()); | |||||
StartTargetDeviceOrderJob(morkOrderpush.DeviceId); | |||||
} | |||||
orders[morkOrderpush.DeviceId].Enqueue(morkOrderpush); | |||||
} | } | ||||
}); | }); | ||||
EventBus.EventBus.GetInstance().Subscribe<OrderStatusChangedEvent>(0, OrderStatusChangedHandle); | EventBus.EventBus.GetInstance().Subscribe<OrderStatusChangedEvent>(0, OrderStatusChangedHandle); | ||||
ThreadManage.GetInstance().StartLong(() => | |||||
} | |||||
private void StartTargetDeviceOrderJob(int deviceId) | |||||
{ | |||||
ThreadManage.GetInstance().Start(() => | |||||
{ | { | ||||
var device = deviceMgr.GetDevices().FirstOrDefault(p => p.DeviceId == deviceId); | |||||
while (running) | while (running) | ||||
{ | { | ||||
while (orders.Count > 0) | |||||
if (device.IsBusy || !device.IsHealth) | |||||
{ | |||||
Thread.Sleep(100); | |||||
continue; | |||||
} | |||||
while (orders[deviceId].Count > 0) | |||||
{ | { | ||||
var temp = orders.ElementAt(0); | |||||
var device = deviceMgr.GetDevices().FirstOrDefault(p => p.DeviceId == temp.DeviceId); | |||||
if (null != device) | |||||
if (orders[deviceId].TryDequeue(out MorkOrderPush temp)) | |||||
{ | { | ||||
if (!device.IsBusy && device.IsHealth) | |||||
{ | |||||
if (orders.TryDequeue(out temp)) | |||||
{ | |||||
var orderEvent = DoOrderEvent.Make(temp); | |||||
orderEvent.Id = device.DeviceId; | |||||
orderEvent.Publish(); | |||||
} | |||||
} | |||||
var orderEvent = DoOrderEvent.Make(temp); | |||||
orderEvent.Id = device.DeviceId; | |||||
orderEvent.Publish(); | |||||
} | } | ||||
} | } | ||||
Thread.Sleep(50); | Thread.Sleep(50); | ||||
} | } | ||||
}, "MQTT 消息处理"); | |||||
}, $"MQTT 订单接收处理-设备[{deviceId}]"); | |||||
} | } | ||||
public void OrderStatusChangedHandle(IEvent @event, EventCallBackHandle callBack) | public void OrderStatusChangedHandle(IEvent @event, EventCallBackHandle callBack) | ||||
@@ -1,4 +1,5 @@ | |||||
using BPASmartClient.Helper; | |||||
using BPA.Message; | |||||
using BPASmartClient.Helper; | |||||
using System; | using System; | ||||
using System.Collections.Generic; | using System.Collections.Generic; | ||||
using System.Linq; | using System.Linq; | ||||
@@ -16,23 +17,48 @@ namespace BPASmartClient.Business | |||||
private bool running = false; | private bool running = false; | ||||
//设备管理 | //设备管理 | ||||
private DeviceMgr deviceMgr; | private DeviceMgr deviceMgr; | ||||
private MQTTMgr mqttMgr; | |||||
DeviceStatus deviceStatus = new DeviceStatus(); | |||||
private bool wholeDeviceHealth; | |||||
private Dictionary<int, Dictionary<string, object>> deviceStatus = new Dictionary<int, Dictionary<string, object>>(); | |||||
private Dictionary<int, Dictionary<string, object>> wholeDeviceStatus = new Dictionary<int, Dictionary<string, object>>(); | |||||
public void Initialize() | public void Initialize() | ||||
{ | { | ||||
deviceMgr = Plugin.GetInstance().GetPlugin<DeviceMgr>(); | deviceMgr = Plugin.GetInstance().GetPlugin<DeviceMgr>(); | ||||
ThreadManage.GetInstance().StartLong(() => | |||||
mqttMgr = Plugin.GetInstance().GetPlugin<MQTTMgr>(); | |||||
ThreadManage.GetInstance().Start(() => | |||||
{ | { | ||||
while (running) | while (running) | ||||
{ | { | ||||
wholeDeviceHealth = true; | |||||
foreach (var device in deviceMgr.GetDevices()) | foreach (var device in deviceMgr.GetDevices()) | ||||
{ | { | ||||
deviceStatus[device.DeviceId] = device.Status.GetStatus(); | |||||
wholeDeviceStatus[device.DeviceId] = device.Status.GetStatus(); | |||||
} | } | ||||
Thread.Sleep(50); | Thread.Sleep(50); | ||||
} | } | ||||
}, "MQTT 消息处理"); | |||||
}, "设备状态收集"); | |||||
deviceStatus.BatchingInfo = new List<BPA.Models.BatchingInfo>(); | |||||
ThreadManage.GetInstance().Start(() => | |||||
{ | |||||
while (running) | |||||
{ | |||||
wholeDeviceHealth = true; | |||||
foreach (var device in deviceMgr.GetDevices()) | |||||
{ | |||||
wholeDeviceStatus[device.DeviceId] = device.Status.GetStatus(); | |||||
deviceStatus.Healthy = device.IsHealth ? BPA.Message.Enum.DeviceHealthy.Health : BPA.Message.Enum.DeviceHealthy.UnHealth; | |||||
var msg=BPAPackage.Make(deviceStatus, device.DeviceId, device.DeviceType); | |||||
mqttMgr.Publish(TOPIC.GetInstance.GetHeatbeatTopic(device.DeviceType), msg.Serialize()); | |||||
} | |||||
Thread.Sleep(1000); | |||||
} | |||||
}, "设备心跳上报"); | |||||
} | } | ||||
public void Dispose() | public void Dispose() | ||||