feat: 支持字节数组上传

This commit is contained in:
Diego
2025-04-24 10:25:36 +08:00
parent 0456296103
commit dd68d555d4
15 changed files with 157 additions and 156 deletions

View File

@@ -18,7 +18,7 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="BootstrapBlazor.TableExport" Version="9.2.3" />
<PackageReference Include="BootstrapBlazor.TableExport" Version="9.2.4" />
<PackageReference Include="UAParser" Version="3.1.47" />
<PackageReference Include="Rougamo.Fody" Version="5.0.0" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.189" />

View File

@@ -1,8 +1,8 @@
<Project>
<PropertyGroup>
<PluginVersion>10.5.2</PluginVersion>
<ProPluginVersion>10.5.2</ProPluginVersion>
<PluginVersion>10.5.3</PluginVersion>
<ProPluginVersion>10.5.3</ProPluginVersion>
<AuthenticationVersion>2.1.7</AuthenticationVersion>
</PropertyGroup>

View File

@@ -9,6 +9,9 @@
//------------------------------------------------------------------------------
using System.Globalization;
using System.Text;
using System.Text.Encodings.Web;
using System.Text.Json;
using System.Text.RegularExpressions;
using ThingsGateway.NewLife.Json.Extension;
@@ -63,7 +66,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
protected List<TopicJson> GetAlarms(IEnumerable<AlarmModel> item)
{
IEnumerable<dynamic>? data = Application.DynamicModelExtension.GetDynamicModel<AlarmModel>(item, _businessPropertyWithCacheIntervalScript.BigTextScriptAlarmModel);
List<TopicJson> topicJsonList = new List<TopicJson>();
var topicJsonList = new List<TopicJson>();
var topics = Match(_businessPropertyWithCacheIntervalScript.AlarmTopic);
if (topics.Count > 0)
{
@@ -128,7 +131,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
protected List<TopicJson> GetDeviceData(IEnumerable<DevModel> item)
{
IEnumerable<dynamic>? data = Application.DynamicModelExtension.GetDynamicModel<DevModel>(item, _businessPropertyWithCacheIntervalScript.BigTextScriptDeviceModel);
List<TopicJson> topicJsonList = new List<TopicJson>();
var topicJsonList = new List<TopicJson>();
var topics = Match(_businessPropertyWithCacheIntervalScript.DeviceTopic);
if (topics.Count > 0)
{
@@ -193,7 +196,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
protected List<TopicJson> GetVariable(IEnumerable<VarModel> item)
{
IEnumerable<dynamic>? data = Application.DynamicModelExtension.GetDynamicModel<VarModel>(item, _businessPropertyWithCacheIntervalScript.BigTextScriptVariableModel);
List<TopicJson> topicJsonList = new List<TopicJson>();
var topicJsonList = new List<TopicJson>();
var topics = Match(_businessPropertyWithCacheIntervalScript.VariableTopic);
if (topics.Count > 0)
{
@@ -267,7 +270,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
{
data = item;
}
List<TopicJson> topicJsonList = new List<TopicJson>();
var topicJsonList = new List<TopicJson>();
var topics = Match(_businessPropertyWithCacheIntervalScript.VariableTopic);
if (topics.Count > 0)
{
@@ -329,6 +332,40 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
return topicJsonList;
}
//protected static byte[] Serialize(object value)
//{
// var block = new ValueByteBlock(1024 * 64);
// try
// {
// //将数据序列化到内存块
// FastBinaryFormatter.Serialize(ref block, value);
// block.SeekToStart();
// return block.Memory.GetArray().Array;
// }
// finally
// {
// block.Dispose();
// }
//}
protected static JsonSerializerOptions NoWriteIndentedJsonSerializerOptions = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = false
};
protected static JsonSerializerOptions WriteIndentedJsonSerializerOptions = new JsonSerializerOptions
{
Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,
WriteIndented = true
};
protected static byte[] Serialize(object data, bool writeIndented)
{
if (data == null) return Array.Empty<byte>();
byte[] payload = JsonSerializer.SerializeToUtf8Bytes(data, data.GetType(), writeIndented ? WriteIndentedJsonSerializerOptions : NoWriteIndentedJsonSerializerOptions);
return payload;
}
protected List<TopicArray> GetAlarmTopicArrays(IEnumerable<AlarmModel> item)
{
IEnumerable<dynamic>? data = Application.DynamicModelExtension.GetDynamicModel<AlarmModel>(item, _businessPropertyWithCacheIntervalScript.BigTextScriptAlarmModel);
@@ -355,7 +392,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
// 上传内容
if (_businessPropertyWithCacheIntervalScript.IsAlarmList)
{
var json = Serialize(group.Select(a => a).ToList().ToList());
var json = Serialize(group.Select(a => a).ToList().ToList(), _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
// 将主题和 JSON 内容添加到列表中
topicJsonList.Add(new(topic, json));
}
@@ -364,7 +401,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
// 如果不是报警列表,则将每个分组元素分别转换为 JSON 字符串
foreach (var gro in group)
{
var json = Serialize(gro);
var json = Serialize(gro, _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
// 将主题和 JSON 内容添加到列表中
topicJsonList.Add(new(topic, json));
}
@@ -376,14 +413,14 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
{
if (_businessPropertyWithCacheIntervalScript.IsAlarmList)
{
var json = Serialize(data.Select(a => a).ToList());
var json = Serialize(data.Select(a => a).ToList(), _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
topicJsonList.Add(new(_businessPropertyWithCacheIntervalScript.AlarmTopic, json));
}
else
{
foreach (var group in data)
{
var json = Serialize(group);
var json = Serialize(group, _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
topicJsonList.Add(new(_businessPropertyWithCacheIntervalScript.AlarmTopic, json));
}
}
@@ -392,22 +429,6 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
return topicJsonList;
}
protected static ArraySegment<byte> Serialize(object value)
{
var block = new ValueByteBlock(1024 * 64);
try
{
//将数据序列化到内存块
FastBinaryFormatter.Serialize(ref block, value);
block.SeekToStart();
return block.Memory.GetArray();
}
finally
{
block.Dispose();
}
}
protected List<TopicArray> GetDeviceTopicArray(IEnumerable<DevModel> item)
{
IEnumerable<dynamic>? data = Application.DynamicModelExtension.GetDynamicModel<DevModel>(item, _businessPropertyWithCacheIntervalScript.BigTextScriptDeviceModel);
@@ -436,7 +457,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
if (_businessPropertyWithCacheIntervalScript.IsDeviceList)
{
// 如果是设备列表,则将整个分组转换为 JSON 字符串
var json = Serialize(group.Select(a => a).ToList());
var json = Serialize(group.Select(a => a).ToList(), _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
// 将主题和 JSON 内容添加到列表中
topicJsonList.Add(new(topic, json));
}
@@ -445,7 +466,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
// 如果不是设备列表,则将每个分组元素分别转换为 JSON 字符串
foreach (var gro in group)
{
var json = Serialize(gro);
var json = Serialize(gro, _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
// 将主题和 JSON 内容添加到列表中
topicJsonList.Add(new(topic, json));
}
@@ -458,14 +479,14 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
{
if (_businessPropertyWithCacheIntervalScript.IsDeviceList)
{
var json = Serialize(data.Select(a => a).ToList());
var json = Serialize(data.Select(a => a).ToList(), _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
topicJsonList.Add(new(_businessPropertyWithCacheIntervalScript.DeviceTopic, json));
}
else
{
foreach (var group in data)
{
var json = Serialize(group);
var json = Serialize(group, _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
topicJsonList.Add(new(_businessPropertyWithCacheIntervalScript.DeviceTopic, json));
}
}
@@ -501,7 +522,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
if (_businessPropertyWithCacheIntervalScript.IsVariableList)
{
// 如果是变量列表,则将整个分组转换为 JSON 字符串
var json = Serialize(group.Select(a => a).ToList());
var json = Serialize(group.Select(a => a).ToList(), _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
// 将主题和 JSON 内容添加到列表中
topicJsonList.Add(new(topic, json));
}
@@ -510,7 +531,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
// 如果不是变量列表,则将每个分组元素分别转换为 JSON 字符串
foreach (var gro in group)
{
var json = Serialize(gro);
var json = Serialize(gro, _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
// 将主题和 JSON 内容添加到列表中
topicJsonList.Add(new(topic, json));
}
@@ -523,14 +544,14 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
{
if (_businessPropertyWithCacheIntervalScript.IsVariableList)
{
var json = Serialize(data.Select(a => a).ToList());
var json = Serialize(data.Select(a => a).ToList(), _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
topicJsonList.Add(new(_businessPropertyWithCacheIntervalScript.VariableTopic, json));
}
else
{
foreach (var group in data)
{
var json = Serialize(group);
var json = Serialize(group, _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
topicJsonList.Add(new(_businessPropertyWithCacheIntervalScript.VariableTopic, json));
}
}
@@ -538,7 +559,6 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
return topicJsonList;
}
protected List<TopicArray> GetVariableBasicDataTopicArray(IEnumerable<VariableBasicData> item)
{
IEnumerable<VariableBasicData>? data = null;
@@ -576,7 +596,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
if (_businessPropertyWithCacheIntervalScript.IsVariableList)
{
// 如果是变量列表,则将整个分组转换为 JSON 字符串
var json = Serialize(group.Select(a => a).ToList());
var json = Serialize(group.Select(a => a).ToList(), _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
// 将主题和 JSON 内容添加到列表中
topicJsonList.Add(new(topic, json));
}
@@ -585,7 +605,7 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
// 如果不是变量列表,则将每个分组元素分别转换为 JSON 字符串
foreach (var gro in group)
{
var json = Serialize(gro);
var json = Serialize(gro, _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
// 将主题和 JSON 内容添加到列表中
topicJsonList.Add(new(topic, json));
}
@@ -598,14 +618,14 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
{
if (_businessPropertyWithCacheIntervalScript.IsVariableList)
{
var json = Serialize(data.Select(a => a).ToList());
var json = Serialize(data.Select(a => a).ToList(), _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
topicJsonList.Add(new(_businessPropertyWithCacheIntervalScript.VariableTopic, json));
}
else
{
foreach (var group in data)
{
var json = Serialize(group);
var json = Serialize(group, _businessPropertyWithCacheIntervalScript.JsonFormattingIndented);
topicJsonList.Add(new(_businessPropertyWithCacheIntervalScript.VariableTopic, json));
}
}
@@ -614,5 +634,9 @@ public abstract partial class BusinessBaseWithCacheIntervalScript<VarModel, DevM
}
protected string GetString(string topic, byte[] json, int count)
{
return $"Topic{topic}{Environment.NewLine}PayLoad{Encoding.UTF8.GetString(json)} {Environment.NewLine} VarModelQueue:{count}";
}
#endregion
}

View File

@@ -8,15 +8,18 @@
// QQ群605534569
//------------------------------------------------------------------------------
using System.Text;
namespace ThingsGateway.Gateway.Application;
public struct TopicArray
{
public TopicArray(string topic, ArraySegment<byte> json)
public TopicArray(string topic, byte[] json)
{
Topic = topic; Json = json;
}
public ArraySegment<byte> Json { get; set; }
public byte[] Json { get; set; }
public string Topic { get; set; }
}

View File

@@ -134,7 +134,7 @@ internal sealed class DeviceThreadManage : IAsyncDisposable, IDeviceThreadManage
CancellationToken = CancellationTokenSource.Token;
CancellationToken.Register(() => GlobalData.DeviceStatusChangeEvent -= GlobalData_DeviceStatusChangeEvent);
_ = Task.Run(() => CheckThreadAsync(CancellationToken));
_ = Task.Run(() => CheckRedundantAsync(CancellationToken));
}

View File

@@ -166,7 +166,7 @@ public partial class SqlDBProducer : BusinessBaseWithCacheIntervalVariableModel<
{
if (datas?.Count > 0)
{
var result = await db.Storageable(datas).As(_driverPropertys.ReadDBTableName).PageSize(5000).ExecuteSqlBulkCopyAsync().ConfigureAwait(false);
var result = await db.Storageable(datas).As(_driverPropertys.ReadDBTableName).PageSize(5000).ExecuteSqlBulkCopyAsync(cancellationToken).ConfigureAwait(false);
if (result > 0)
LogMessage.Trace($"RealTable Data Count{result}");
_initRealData = true;

View File

@@ -135,11 +135,13 @@ public partial class Webhook : BusinessBaseWithCacheIntervalScript<VariableBasic
private readonly HttpClient client = new HttpClient();
private async Task<OperResult> WebhookUpAsync(string topic, string json, int count, CancellationToken cancellationToken)
private async Task<OperResult> WebhookUpAsync(string topic, byte[] payLoad, int count, CancellationToken cancellationToken)
{
// 设置请求内容
var content = new StringContent(json, Encoding.UTF8, "application/json");
//var content = new StringContent(json, Encoding.UTF8, "application/json");
using var content = new ByteArrayContent(payLoad);
content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
try
{
@@ -152,7 +154,7 @@ public partial class Webhook : BusinessBaseWithCacheIntervalScript<VariableBasic
if (_driverPropertys.DetailLog)
{
if (LogMessage.LogLevel <= TouchSocket.Core.LogLevel.Trace)
LogMessage.LogTrace($"Topic{topic}{Environment.NewLine}PayLoad{json} {Environment.NewLine} VarModelQueue:{_memoryVarModelQueue.Count}");
LogMessage.LogTrace(GetString(topic, payLoad, _memoryVarModelQueue.Count));
}
else
{
@@ -175,11 +177,12 @@ public partial class Webhook : BusinessBaseWithCacheIntervalScript<VariableBasic
#region private
private async ValueTask<OperResult> Update(List<TopicJson> topicJsonList, int count, CancellationToken cancellationToken)
private async ValueTask<OperResult> Update(List<TopicArray> topicJsonList, int count, CancellationToken cancellationToken)
{
foreach (var topicJson in topicJsonList)
{
var result = await WebhookUpAsync(topicJson.Topic, topicJson.Json, count, cancellationToken).ConfigureAwait(false);
if (cancellationToken.IsCancellationRequested)
return result;
if (success != result.IsSuccess)
@@ -202,20 +205,20 @@ public partial class Webhook : BusinessBaseWithCacheIntervalScript<VariableBasic
private ValueTask<OperResult> UpdateAlarmModel(IEnumerable<AlarmVariable> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetAlarms(item);
var topicJsonList = GetAlarmTopicArrays(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
private ValueTask<OperResult> UpdateDevModel(IEnumerable<DeviceBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetDeviceData(item);
var topicJsonList = GetDeviceTopicArray(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
private ValueTask<OperResult> UpdateVarModel(IEnumerable<VariableBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetVariableBasicData(item);
var topicJsonList = GetVariableBasicDataTopicArray(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}

View File

@@ -46,7 +46,7 @@ public partial class KafkaProducer : BusinessBaseWithCacheIntervalScript<Variabl
_producerconfig.SaslPassword = _driverPropertys.SaslPassword;
//2、创建生产者
_producerBuilder = new ProducerBuilder<Null, string>(_producerconfig);
_producerBuilder = new ProducerBuilder<Null, byte[]>(_producerconfig);
//3、错误日志监视
_producerBuilder.SetErrorHandler((p, msg) =>
{
@@ -75,6 +75,14 @@ public partial class KafkaProducer : BusinessBaseWithCacheIntervalScript<Variabl
/// <inheritdoc/>
protected override void Dispose(bool disposing)
{
try
{
_producer?.Flush(TimeSpan.FromSeconds(10));
}
catch
{
}
_producer?.SafeDispose();
base.Dispose(disposing);
}

View File

@@ -24,8 +24,8 @@ namespace ThingsGateway.Plugin.Kafka;
/// </summary>
public partial class KafkaProducer : BusinessBaseWithCacheIntervalScript<VariableBasicData, DeviceBasicData, AlarmVariable>
{
private IProducer<Null, string> _producer;
private ProducerBuilder<Null, string> _producerBuilder;
private IProducer<Null, byte[]> _producer;
private ProducerBuilder<Null, byte[]> _producerBuilder;
private ProducerConfig _producerconfig;
private volatile bool producerSuccess = true;
@@ -127,7 +127,7 @@ public partial class KafkaProducer : BusinessBaseWithCacheIntervalScript<Variabl
#region private
private async ValueTask<OperResult> Update(List<TopicJson> topicJsonList, int count, CancellationToken cancellationToken)
private async ValueTask<OperResult> Update(List<TopicArray> topicJsonList, int count, CancellationToken cancellationToken)
{
foreach (var topicJson in topicJsonList)
{
@@ -150,19 +150,19 @@ public partial class KafkaProducer : BusinessBaseWithCacheIntervalScript<Variabl
private async ValueTask<OperResult> UpdateAlarmModel(IEnumerable<AlarmVariable> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetAlarms(item);
var topicJsonList = GetAlarmTopicArrays(item);
return await Update(topicJsonList, item.Count(), cancellationToken).ConfigureAwait(false);
}
private async ValueTask<OperResult> UpdateDevModel(IEnumerable<DeviceBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetDeviceData(item);
var topicJsonList = GetDeviceTopicArray(item);
return await Update(topicJsonList, item.Count(), cancellationToken).ConfigureAwait(false);
}
private async ValueTask<OperResult> UpdateVarModel(IEnumerable<VariableBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetVariableBasicData(item);
var topicJsonList = GetVariableBasicDataTopicArray(item);
return await Update(topicJsonList, item.Count(), cancellationToken).ConfigureAwait(false);
}
@@ -203,42 +203,36 @@ public partial class KafkaProducer : BusinessBaseWithCacheIntervalScript<Variabl
/// <summary>
/// kafka上传返回上传结果
/// </summary>
public async ValueTask<OperResult> KafKaUpAsync(string topic, string payLoad, int count, CancellationToken cancellationToken)
public async ValueTask<OperResult> KafKaUpAsync(string topic, byte[] payLoad, int count, CancellationToken cancellationToken)
{
try
{
using CancellationTokenSource cancellationTokenSource = new();
using CancellationTokenSource cancellationTokenSource = new(_driverPropertys.Timeout);
using CancellationTokenSource stoppingToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationTokenSource.Token, cancellationToken);
Task<DeliveryResult<Null, string>> resultTask = _producer.ProduceAsync(topic, new Message<Null, string> { Value = payLoad }, stoppingToken.Token);
var timeOutResult = await Task.WhenAny(resultTask, Task.Delay(_driverPropertys.Timeout, stoppingToken.Token)).ConfigureAwait(false);
if (timeOutResult == resultTask)
var result = await _producer.ProduceAsync(topic, new Message<Null, byte[]> { Value = payLoad }, stoppingToken.Token).ConfigureAwait(false);
if (result.Status != PersistenceStatus.Persisted)
{
var result = await resultTask.ConfigureAwait(false);
if (result.Status != PersistenceStatus.Persisted)
{
return new OperResult("Upload fail");
}
else
{
if (_driverPropertys.DetailLog)
{
if (LogMessage.LogLevel <= TouchSocket.Core.LogLevel.Trace)
LogMessage.LogTrace($"Topic{topic}{Environment.NewLine}PayLoad{payLoad} {Environment.NewLine} VarModelQueue:{_memoryVarModelQueue.Count}");
}
else
{
LogMessage.LogTrace($"Topic{topic}{Environment.NewLine}Count{count} {Environment.NewLine} VarModelQueue:{_memoryVarModelQueue.Count}");
}
return OperResult.Success;
}
return new OperResult("Upload fail");
}
else
{
stoppingToken.Cancel();
return new OperResult("Upload timeout");
if (_driverPropertys.DetailLog)
{
if (LogMessage.LogLevel <= TouchSocket.Core.LogLevel.Trace)
LogMessage.LogTrace(GetString(topic, payLoad, _memoryVarModelQueue.Count));
}
else
{
LogMessage.LogTrace($"Topic{topic}{Environment.NewLine}Count{count} {Environment.NewLine} VarModelQueue:{_memoryVarModelQueue.Count}");
}
return OperResult.Success;
}
}
catch (OperationCanceledException)
{
return new OperResult("Timeout");
}
catch (Exception ex)
{
return new OperResult(ex);

View File

@@ -60,31 +60,35 @@ public partial class MqttClient : BusinessBaseWithCacheIntervalScript<VariableBa
private async ValueTask<OperResult> UpdateThingsBoardDeviceConnect(DeviceBasicData deviceData)
{
List<TopicJson> topicJsonTBList = new();
var topicJsonTBList = new List<TopicArray>();
{
if (deviceData.DeviceStatus == DeviceStatusEnum.OnLine)
{
var topicJson = new TopicJson()
var json = new
{
device = deviceData.Name,
};
var topicJson = new TopicArray()
{
Topic = "v1/gateway/connect",
Json = new
{
device = deviceData.Name,
}.ToJsonNetString(_driverPropertys.JsonFormattingIndented)
Json = Serialize(json, _driverPropertys.JsonFormattingIndented)
};
topicJsonTBList.Add(topicJson);
}
else
{
var topicJson = new TopicJson()
var json = new
{
device = deviceData.Name,
};
var topicJson = new TopicArray()
{
Topic = "v1/gateway/disconnect",
Json = new
{
device = deviceData.Name,
}.ToJsonNetString(_driverPropertys.JsonFormattingIndented)
Json = Serialize(json, _driverPropertys.JsonFormattingIndented)
};
topicJsonTBList.Add(topicJson);
}
@@ -202,7 +206,7 @@ public partial class MqttClient : BusinessBaseWithCacheIntervalScript<VariableBa
#region private
private async ValueTask<OperResult> Update(List<TopicJson> topicJsonList, int count, CancellationToken cancellationToken)
private async ValueTask<OperResult> Update(List<TopicArray> topicJsonList, int count, CancellationToken cancellationToken)
{
foreach (var topicJson in topicJsonList)
{
@@ -227,20 +231,20 @@ public partial class MqttClient : BusinessBaseWithCacheIntervalScript<VariableBa
private ValueTask<OperResult> UpdateAlarmModel(IEnumerable<AlarmVariable> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetAlarms(item);
var topicJsonList = GetAlarmTopicArrays(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
private ValueTask<OperResult> UpdateDevModel(IEnumerable<DeviceBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetDeviceData(item);
var topicJsonList = GetDeviceTopicArray(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
private ValueTask<OperResult> UpdateVarModel(IEnumerable<VariableBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetVariableBasicData(item);
var topicJsonList = GetVariableBasicDataTopicArray(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
@@ -459,7 +463,7 @@ public partial class MqttClient : BusinessBaseWithCacheIntervalScript<VariableBa
/// <summary>
/// 上传mqtt返回上传结果
/// </summary>
public async ValueTask<OperResult> MqttUpAsync(string topic, string payLoad, int count, CancellationToken cancellationToken = default)
public async ValueTask<OperResult> MqttUpAsync(string topic, byte[] payLoad, int count, CancellationToken cancellationToken = default)
{
try
{
@@ -475,7 +479,7 @@ public partial class MqttClient : BusinessBaseWithCacheIntervalScript<VariableBa
if (_driverPropertys.DetailLog)
{
if (LogMessage.LogLevel <= TouchSocket.Core.LogLevel.Trace)
LogMessage.LogTrace($"Topic{topic}{Environment.NewLine}PayLoad{payLoad} {Environment.NewLine} VarModelQueue:{_memoryVarModelQueue.Count}");
LogMessage.LogTrace(GetString(topic, payLoad, _memoryVarModelQueue.Count));
}
else
{

View File

@@ -133,41 +133,6 @@ public partial class MqttCollect : CollectBase
}
}
/// <summary>
/// 上传mqtt返回上传结果
/// </summary>
private async ValueTask<OperResult> MqttUpAsync(string topic, string payLoad, CancellationToken cancellationToken)
{
try
{
var isConnect = await TryMqttClientAsync(cancellationToken).ConfigureAwait(false);
if (isConnect.IsSuccess)
{
var variableMessage = new MqttApplicationMessageBuilder()
.WithTopic(topic).WithRetainFlag(true)
.WithPayload(payLoad).Build();
var result = await _mqttClient.PublishAsync(variableMessage, cancellationToken).ConfigureAwait(false);
if (result.IsSuccess)
{
if (LogMessage.LogLevel <= TouchSocket.Core.LogLevel.Trace)
LogMessage.LogTrace($"Topic{topic}{Environment.NewLine}PayLoad{payLoad}");
return OperResult.Success;
}
else
{
return new OperResult($"Upload fail{result.ReasonString}");
}
}
else
{
return isConnect;
}
}
catch (Exception ex)
{
return new OperResult($"Upload fail", ex);
}
}
private async ValueTask<OperResult> TryMqttClientAsync(CancellationToken cancellationToken)
{

View File

@@ -141,7 +141,7 @@ public partial class MqttServer : BusinessBaseWithCacheIntervalScript<VariableBa
}
#region private
private async ValueTask<OperResult> Update(List<TopicJson> topicJsonList, int count, CancellationToken cancellationToken)
private async ValueTask<OperResult> Update(List<TopicArray> topicJsonList, int count, CancellationToken cancellationToken)
{
foreach (var topicJson in topicJsonList)
{
@@ -164,20 +164,20 @@ public partial class MqttServer : BusinessBaseWithCacheIntervalScript<VariableBa
private ValueTask<OperResult> UpdateAlarmModel(IEnumerable<AlarmVariable> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetAlarms(item);
var topicJsonList = GetAlarmTopicArrays(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
private ValueTask<OperResult> UpdateDevModel(IEnumerable<DeviceBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetDeviceData(item);
var topicJsonList = GetDeviceTopicArray(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
private ValueTask<OperResult> UpdateVarModel(IEnumerable<VariableBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetVariableBasicData(item);
var topicJsonList = GetVariableBasicDataTopicArray(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
@@ -261,7 +261,7 @@ public partial class MqttServer : BusinessBaseWithCacheIntervalScript<VariableBa
{
foreach (var item in varData)
{
List<TopicJson> topicJsonList = GetVariableBasicData(item);
var topicJsonList = GetVariableBasicData(item);
foreach (var topicJson in topicJsonList)
{
Messages.Add(new MqttApplicationMessageBuilder()
@@ -276,7 +276,7 @@ public partial class MqttServer : BusinessBaseWithCacheIntervalScript<VariableBa
{
foreach (var item in devData)
{
List<TopicJson> topicJsonList = GetDeviceData(item);
var topicJsonList = GetDeviceData(item);
foreach (var topicJson in topicJsonList)
{
Messages.Add(new MqttApplicationMessageBuilder()
@@ -290,7 +290,7 @@ public partial class MqttServer : BusinessBaseWithCacheIntervalScript<VariableBa
{
foreach (var item in alramData)
{
List<TopicJson> topicJsonList = GetAlarms(item);
var topicJsonList = GetAlarms(item);
foreach (var topicJson in topicJsonList)
{
Messages.Add(new MqttApplicationMessageBuilder()
@@ -394,7 +394,7 @@ public partial class MqttServer : BusinessBaseWithCacheIntervalScript<VariableBa
/// <summary>
/// 上传mqtt返回上传结果
/// </summary>
public async ValueTask<OperResult> MqttUpAsync(string topic, string payLoad, int count, CancellationToken cancellationToken = default)
public async ValueTask<OperResult> MqttUpAsync(string topic, byte[] payLoad, int count, CancellationToken cancellationToken = default)
{
try
{
@@ -407,7 +407,7 @@ public partial class MqttServer : BusinessBaseWithCacheIntervalScript<VariableBa
if (_driverPropertys.DetailLog)
{
if (LogMessage.LogLevel <= TouchSocket.Core.LogLevel.Trace)
LogMessage.LogTrace($"Topic{topic}{Environment.NewLine}PayLoad{payLoad} {Environment.NewLine} VarModelQueue:{_memoryVarModelQueue.Count} ");
LogMessage.LogTrace(GetString(topic, payLoad, _memoryVarModelQueue.Count));
}
else
{

View File

@@ -130,7 +130,7 @@ public partial class RabbitMQProducer : BusinessBaseWithCacheIntervalScript<Vari
#region private
private async ValueTask<OperResult> Update(List<TopicJson> topicJsonList, int count, CancellationToken cancellationToken)
private async ValueTask<OperResult> Update(List<TopicArray> topicJsonList, int count, CancellationToken cancellationToken)
{
foreach (var topicJson in topicJsonList)
{
@@ -154,19 +154,19 @@ public partial class RabbitMQProducer : BusinessBaseWithCacheIntervalScript<Vari
private ValueTask<OperResult> UpdateAlarmModel(IEnumerable<AlarmVariable> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetAlarms(item);
var topicJsonList = GetAlarmTopicArrays(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
private ValueTask<OperResult> UpdateDevModel(IEnumerable<DeviceBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetDeviceData(item);
var topicJsonList = GetDeviceTopicArray(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
private ValueTask<OperResult> UpdateVarModel(IEnumerable<VariableBasicData> item, CancellationToken cancellationToken)
{
List<TopicJson> topicJsonList = GetVariableBasicData(item);
var topicJsonList = GetVariableBasicDataTopicArray(item);
return Update(topicJsonList, item.Count(), cancellationToken);
}
@@ -208,18 +208,18 @@ public partial class RabbitMQProducer : BusinessBaseWithCacheIntervalScript<Vari
/// <summary>
/// 上传,返回上传结果
/// </summary>
public async Task<OperResult> Publish(string topic, string payLoad, int count, CancellationToken cancellationToken)
public async Task<OperResult> Publish(string topic, byte[] payLoad, int count, CancellationToken cancellationToken)
{
try
{
if (_channel != null)
{
await _channel.BasicPublishAsync(_driverPropertys.ExchangeName, topic, Encoding.UTF8.GetBytes(payLoad), cancellationToken).ConfigureAwait(false);
await _channel.BasicPublishAsync(_driverPropertys.ExchangeName, topic, payLoad, cancellationToken).ConfigureAwait(false);
if (_driverPropertys.DetailLog)
{
if (LogMessage.LogLevel <= TouchSocket.Core.LogLevel.Trace)
LogMessage.LogTrace($"Topic{topic}{Environment.NewLine}PayLoad{payLoad} {Environment.NewLine} VarModelQueue:{_memoryVarModelQueue.Count}");
LogMessage.LogTrace(GetString(topic, payLoad, _memoryVarModelQueue.Count));
}
else
{

View File

@@ -3,8 +3,8 @@
"MinCycleInterval": 10, //最小循环间隔
"MaxCycleInterval": 200, //最大循环间隔
"CheckInterval": 1800000, //检查间隔
"MaxChannelCount": 1000, //最大通道数量
"MaxDeviceCount": 1000, //最大设备数量
"MaxVariableCount": 1000000 //最大变量数量
"MaxChannelCount": 5000, //最大通道数量
"MaxDeviceCount": 5000, //最大设备数量
"MaxVariableCount": 2000000 //最大变量数量
}
}

View File

@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<Version>10.5.2</Version>
<Version>10.5.3</Version>
</PropertyGroup>
<ItemGroup>