feat: 支持字节数组上传
This commit is contained in:
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
|
||||
@@ -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 封装方法
|
||||
}
|
||||
|
||||
@@ -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; }
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -3,8 +3,8 @@
|
||||
"MinCycleInterval": 10, //最小循环间隔
|
||||
"MaxCycleInterval": 200, //最大循环间隔
|
||||
"CheckInterval": 1800000, //检查间隔
|
||||
"MaxChannelCount": 1000, //最大通道数量
|
||||
"MaxDeviceCount": 1000, //最大设备数量
|
||||
"MaxVariableCount": 1000000 //最大变量数量
|
||||
"MaxChannelCount": 5000, //最大通道数量
|
||||
"MaxDeviceCount": 5000, //最大设备数量
|
||||
"MaxVariableCount": 2000000 //最大变量数量
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<Version>10.5.2</Version>
|
||||
<Version>10.5.3</Version>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user