完善报文解析,搭建数据迁移架构
This commit is contained in:
parent
76fe43ae54
commit
83d8785ff4
@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.DataMigration
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 数据迁移服务
|
||||||
|
/// </summary>
|
||||||
|
public interface IDataMigrationService
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 开始迁移
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task StartMigrationAsync();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.DataMigration.Options
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 数据迁移配置
|
||||||
|
/// </summary>
|
||||||
|
public class DataMigrationOptions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// MongoDb每批处理量
|
||||||
|
/// </summary>
|
||||||
|
public int MongoDbDataBatchSize { get; set; } = 1000;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 批量处理通道容量
|
||||||
|
/// </summary>
|
||||||
|
public int ChannelCapacity { get; set; } = 100;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数据库 每批处理量
|
||||||
|
/// </summary>
|
||||||
|
public int SqlBulkBatchSize { get; set; } = 1000;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数据库 每批处理超时时间
|
||||||
|
/// </summary>
|
||||||
|
public int SqlBulkTimeout { get; set; } = 60;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理器数量
|
||||||
|
/// </summary>
|
||||||
|
public int ProcessorsCount { get; set; } = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using JiShe.CollectBus.IotSystems.MessageReceiveds;
|
using JiShe.CollectBus.IotSystems.MessageReceiveds;
|
||||||
using JiShe.CollectBus.Protocol.Contracts.Interfaces;
|
using JiShe.CollectBus.Protocol.Contracts.Interfaces;
|
||||||
|
using JiShe.CollectBus.Protocol.Contracts.Models;
|
||||||
using MassTransit;
|
using MassTransit;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
@ -48,7 +49,7 @@ namespace JiShe.CollectBus.Consumers
|
|||||||
var list = new List<MessageReceived>();
|
var list = new List<MessageReceived>();
|
||||||
foreach (var contextItem in context.Message)
|
foreach (var contextItem in context.Message)
|
||||||
{
|
{
|
||||||
await protocolPlugin.AnalyzeAsync(contextItem.Message);
|
await protocolPlugin.AnalyzeAsync<TB3761FN>(contextItem.Message);
|
||||||
list.Add(contextItem.Message);
|
list.Add(contextItem.Message);
|
||||||
}
|
}
|
||||||
await _messageReceivedEventRepository.InsertManyAsync(list);
|
await _messageReceivedEventRepository.InsertManyAsync(list);
|
||||||
|
|||||||
@ -0,0 +1,153 @@
|
|||||||
|
using JiShe.CollectBus.DataMigration.Options;
|
||||||
|
using JiShe.CollectBus.IotSystems.MeterReadingRecords;
|
||||||
|
using LiteDB;
|
||||||
|
using Microsoft.Extensions.Options;
|
||||||
|
using System;
|
||||||
|
using System.Data;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Channels;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Volo.Abp.Domain.Repositories;
|
||||||
|
|
||||||
|
namespace JiShe.CollectBus.DataMigration
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 数据迁移服务
|
||||||
|
/// </summary>
|
||||||
|
public class DataMigrationService: CollectBusAppService, IDataMigrationService
|
||||||
|
{
|
||||||
|
private readonly IRepository<MeterReadingRecords, Guid> _meterReadingRecordsRepository;
|
||||||
|
private readonly DataMigrationOptions _options;
|
||||||
|
|
||||||
|
|
||||||
|
public DataMigrationService(IOptions<DataMigrationOptions> options,
|
||||||
|
IRepository<MeterReadingRecords, Guid> meterReadingRecordsRepository)
|
||||||
|
{
|
||||||
|
_options = options.Value;
|
||||||
|
_meterReadingRecordsRepository = meterReadingRecordsRepository;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 开始迁移
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task StartMigrationAsync()
|
||||||
|
{
|
||||||
|
var rawDataChannel = Channel.CreateBounded<MeterReadingRecords[]>(new BoundedChannelOptions(_options.ChannelCapacity)
|
||||||
|
{
|
||||||
|
SingleWriter = false,
|
||||||
|
SingleReader = false,
|
||||||
|
FullMode = BoundedChannelFullMode.Wait
|
||||||
|
});
|
||||||
|
|
||||||
|
var cleanDataChannel = Channel.CreateBounded<DataTable>(new BoundedChannelOptions(_options.ChannelCapacity)
|
||||||
|
{
|
||||||
|
SingleWriter = false,
|
||||||
|
SingleReader = false,
|
||||||
|
FullMode = BoundedChannelFullMode.Wait
|
||||||
|
});
|
||||||
|
|
||||||
|
// 启动生产者和消费者
|
||||||
|
var producer = Task.Run(() => ProduceDataAsync(rawDataChannel.Writer));
|
||||||
|
|
||||||
|
var processors = Enumerable.Range(0, _options.ProcessorsCount)
|
||||||
|
.Select(_ => Task.Run(() => ProcessDataAsync(rawDataChannel.Reader, cleanDataChannel.Writer)))
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
var consumer = Task.Run(() => ConsumeDataAsync(cleanDataChannel.Reader));
|
||||||
|
|
||||||
|
await Task.WhenAll(new[] { producer }.Union(processors).Union(new[] { consumer }));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 生产者,生产数据,主要是从MongoDB中读取数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="writer"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private async Task ProduceDataAsync(ChannelWriter<MeterReadingRecords[]> writer)
|
||||||
|
{
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var queryable = await _meterReadingRecordsRepository.GetQueryableAsync();
|
||||||
|
var batchRecords = queryable.Where(d => d.MigrationStatus == Common.Enums.RecordsDataMigrationStatusEnum.NotStarted)
|
||||||
|
.Take(_options.MongoDbDataBatchSize)
|
||||||
|
.ToArray();
|
||||||
|
|
||||||
|
if (batchRecords == null || batchRecords.Length == 0)
|
||||||
|
{
|
||||||
|
writer.Complete();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
await writer.WriteAsync(batchRecords);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 清洗数据
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="reader"></param>
|
||||||
|
/// <param name="writer"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private async Task ProcessDataAsync(ChannelReader<MeterReadingRecords[]> reader, ChannelWriter<DataTable> writer)
|
||||||
|
{
|
||||||
|
await foreach (var batch in reader.ReadAllAsync())
|
||||||
|
{
|
||||||
|
//var dataTable = new DataTable();
|
||||||
|
//dataTable.Columns.Add("Id", typeof(string));
|
||||||
|
//dataTable.Columns.Add("CleanName", typeof(string));
|
||||||
|
//dataTable.Columns.Add("ProcessedTime", typeof(DateTime));
|
||||||
|
|
||||||
|
//foreach (var doc in batch)
|
||||||
|
//{
|
||||||
|
// // 业务清洗逻辑
|
||||||
|
// var cleanName = doc["name"].AsString.Trim().ToUpper();
|
||||||
|
// dataTable.Rows.Add(
|
||||||
|
// doc["_id"].ToString(),
|
||||||
|
// cleanName,
|
||||||
|
// DateTime.UtcNow);
|
||||||
|
//}
|
||||||
|
|
||||||
|
//await writer.WriteAsync(dataTable);
|
||||||
|
|
||||||
|
// 批量更新标记
|
||||||
|
var ids = batch.Select(d => d.Id).ToArray();
|
||||||
|
foreach (var item in batch)
|
||||||
|
{
|
||||||
|
item.MigrationStatus = Common.Enums.RecordsDataMigrationStatusEnum.InProgress;
|
||||||
|
item.MigrationTime = DateTime.Now;
|
||||||
|
}
|
||||||
|
|
||||||
|
await _meterReadingRecordsRepository.UpdateManyAsync(batch);
|
||||||
|
}
|
||||||
|
writer.Complete();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 消费清洗后的数据入库
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="reader"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private async Task ConsumeDataAsync(ChannelReader<DataTable> reader)
|
||||||
|
{
|
||||||
|
//await using var connection = new SqlConnection(_sqlConnectionString);
|
||||||
|
//await connection.OpenAsync();
|
||||||
|
|
||||||
|
//await foreach (var dataTable in reader.ReadAllAsync())
|
||||||
|
//{
|
||||||
|
// using var bulkCopy = new SqlBulkCopy(connection)
|
||||||
|
// {
|
||||||
|
// DestinationTableName = "CleanData",
|
||||||
|
// BatchSize = 5000,
|
||||||
|
// BulkCopyTimeout = 300
|
||||||
|
// };
|
||||||
|
|
||||||
|
// bulkCopy.ColumnMappings.Add("Id", "Id");
|
||||||
|
// bulkCopy.ColumnMappings.Add("CleanName", "CleanName");
|
||||||
|
// bulkCopy.ColumnMappings.Add("ProcessedTime", "ProcessedTime");
|
||||||
|
|
||||||
|
// await bulkCopy.WriteToServerAsync(dataTable);
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -37,21 +37,17 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
{
|
{
|
||||||
private readonly ILogger<BasicScheduledMeterReadingService> _logger;
|
private readonly ILogger<BasicScheduledMeterReadingService> _logger;
|
||||||
private readonly ICapPublisher _capBus;
|
private readonly ICapPublisher _capBus;
|
||||||
private readonly IRepository<MeterFifteenMinuteReadingRecords, Guid> _fifteenMinuteReadingRecordRepository;
|
private readonly IRepository<MeterReadingRecords, Guid> _meterReadingRecordsRepository;
|
||||||
private readonly IRepository<MeterFiveMinuteReadingRecords, Guid> _fiveMinuteReadingRecordRepository;
|
|
||||||
private readonly IRepository<MeterOneMinuteReadingRecords, Guid> _oneMinuteReadingRecordRepository;
|
|
||||||
|
|
||||||
|
|
||||||
public BasicScheduledMeterReadingService(
|
public BasicScheduledMeterReadingService(
|
||||||
ILogger<BasicScheduledMeterReadingService> logger,
|
ILogger<BasicScheduledMeterReadingService> logger,
|
||||||
ICapPublisher capBus,
|
ICapPublisher capBus,
|
||||||
IRepository<MeterFifteenMinuteReadingRecords, Guid> fifteenMinuteReadingRecordRepository, IRepository<MeterFiveMinuteReadingRecords, Guid> fiveMinuteReadingRecordRepository, IRepository<MeterOneMinuteReadingRecords, Guid> oneMinuteReadingRecordRepository)
|
IRepository<MeterReadingRecords, Guid> meterReadingRecordsRepository)
|
||||||
{
|
{
|
||||||
_capBus = capBus;
|
_capBus = capBus;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_oneMinuteReadingRecordRepository = oneMinuteReadingRecordRepository;
|
_meterReadingRecordsRepository = meterReadingRecordsRepository;
|
||||||
_fiveMinuteReadingRecordRepository = fiveMinuteReadingRecordRepository;
|
|
||||||
_fifteenMinuteReadingRecordRepository = fifteenMinuteReadingRecordRepository;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -279,14 +275,14 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
|
|
||||||
//获取下发任务缓存数据
|
//获取下发任务缓存数据
|
||||||
Dictionary<string, Dictionary<string, MeterOneMinuteReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterOneMinuteReadingRecords>(oneMinutekeyList, timeDensity.ToString(), MeterTypeEnum.Ammeter.ToString());
|
Dictionary<string, Dictionary<string, MeterReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterReadingRecords>(oneMinutekeyList, timeDensity.ToString(), MeterTypeEnum.Ammeter.ToString());
|
||||||
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
||||||
{
|
{
|
||||||
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-102");
|
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-102");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MeterOneMinuteReadingRecords> meterTaskInfosList = new List<MeterOneMinuteReadingRecords>();
|
List<MeterReadingRecords> meterTaskInfosList = new List<MeterReadingRecords>();
|
||||||
|
|
||||||
//将取出的缓存任务数据发送到Kafka消息队列中
|
//将取出的缓存任务数据发送到Kafka消息队列中
|
||||||
foreach (var focusItem in meterTaskInfos)
|
foreach (var focusItem in meterTaskInfos)
|
||||||
@ -307,7 +303,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
||||||
{
|
{
|
||||||
await _oneMinuteReadingRecordRepository.InsertManyAsync(meterTaskInfosList);
|
await _meterReadingRecordsRepository.InsertManyAsync(meterTaskInfosList);
|
||||||
}
|
}
|
||||||
|
|
||||||
//删除任务数据
|
//删除任务数据
|
||||||
@ -344,14 +340,14 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
|
|
||||||
//获取下发任务缓存数据
|
//获取下发任务缓存数据
|
||||||
Dictionary<string, Dictionary<string, MeterFiveMinuteReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterFiveMinuteReadingRecords>(fiveMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.Ammeter).ToString());
|
Dictionary<string, Dictionary<string, MeterReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterReadingRecords>(fiveMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.Ammeter).ToString());
|
||||||
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
||||||
{
|
{
|
||||||
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-102");
|
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-102");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MeterFiveMinuteReadingRecords> meterTaskInfosList = new List<MeterFiveMinuteReadingRecords>();
|
List<MeterReadingRecords> meterTaskInfosList = new List<MeterReadingRecords>();
|
||||||
|
|
||||||
//将取出的缓存任务数据发送到Kafka消息队列中
|
//将取出的缓存任务数据发送到Kafka消息队列中
|
||||||
foreach (var focusItem in meterTaskInfos)
|
foreach (var focusItem in meterTaskInfos)
|
||||||
@ -372,7 +368,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
||||||
{
|
{
|
||||||
await _fiveMinuteReadingRecordRepository.InsertManyAsync(meterTaskInfosList);
|
await _meterReadingRecordsRepository.InsertManyAsync(meterTaskInfosList);
|
||||||
}
|
}
|
||||||
|
|
||||||
//删除任务数据
|
//删除任务数据
|
||||||
@ -411,14 +407,14 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
|
|
||||||
//获取下发任务缓存数据
|
//获取下发任务缓存数据
|
||||||
Dictionary<string, Dictionary<string, MeterFifteenMinuteReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterFifteenMinuteReadingRecords>(fifteenMinutekeyList, timeDensity.ToString(), MeterTypeEnum.Ammeter.ToString());
|
Dictionary<string, Dictionary<string, MeterReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterReadingRecords>(fifteenMinutekeyList, timeDensity.ToString(), MeterTypeEnum.Ammeter.ToString());
|
||||||
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
||||||
{
|
{
|
||||||
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-102");
|
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-102");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MeterFifteenMinuteReadingRecords> meterTaskInfosList = new List<MeterFifteenMinuteReadingRecords>();
|
List<MeterReadingRecords> meterTaskInfosList = new List<MeterReadingRecords>();
|
||||||
|
|
||||||
//将取出的缓存任务数据发送到Kafka消息队列中
|
//将取出的缓存任务数据发送到Kafka消息队列中
|
||||||
foreach (var focusItem in meterTaskInfos)
|
foreach (var focusItem in meterTaskInfos)
|
||||||
@ -439,7 +435,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
||||||
{
|
{
|
||||||
await _fifteenMinuteReadingRecordRepository.InsertManyAsync(meterTaskInfosList);
|
await _meterReadingRecordsRepository.InsertManyAsync(meterTaskInfosList);
|
||||||
}
|
}
|
||||||
|
|
||||||
//删除任务数据
|
//删除任务数据
|
||||||
@ -620,7 +616,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Dictionary<string, BasicMeterReadingRecords> keyValuePairs = new Dictionary<string, BasicMeterReadingRecords>();
|
Dictionary<string, MeterReadingRecords> keyValuePairs = new Dictionary<string, MeterReadingRecords>();
|
||||||
|
|
||||||
foreach (var tempItem in tempCodes)
|
foreach (var tempItem in tempCodes)
|
||||||
{
|
{
|
||||||
@ -675,7 +671,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
var meterReadingRecords = new BasicMeterReadingRecords()
|
var meterReadingRecords = new MeterReadingRecords()
|
||||||
{
|
{
|
||||||
MeterAddress = ammeter.AmmerterAddress,
|
MeterAddress = ammeter.AmmerterAddress,
|
||||||
MeterId = ammeter.ID,
|
MeterId = ammeter.ID,
|
||||||
@ -784,14 +780,14 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
|
|
||||||
//获取下发任务缓存数据
|
//获取下发任务缓存数据
|
||||||
Dictionary<string, Dictionary<string, MeterOneMinuteReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterOneMinuteReadingRecords>(oneMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.WaterMeter).ToString());
|
Dictionary<string, Dictionary<string, MeterReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterReadingRecords>(oneMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.WaterMeter).ToString());
|
||||||
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
||||||
{
|
{
|
||||||
_logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-102");
|
_logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-102");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MeterOneMinuteReadingRecords> meterTaskInfosList = new List<MeterOneMinuteReadingRecords>();
|
List<MeterReadingRecords> meterTaskInfosList = new List<MeterReadingRecords>();
|
||||||
|
|
||||||
//将取出的缓存任务数据发送到Kafka消息队列中
|
//将取出的缓存任务数据发送到Kafka消息队列中
|
||||||
foreach (var focusItem in meterTaskInfos)
|
foreach (var focusItem in meterTaskInfos)
|
||||||
@ -812,7 +808,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
||||||
{
|
{
|
||||||
await _oneMinuteReadingRecordRepository.InsertManyAsync(meterTaskInfosList);
|
await _meterReadingRecordsRepository.InsertManyAsync(meterTaskInfosList);
|
||||||
}
|
}
|
||||||
|
|
||||||
//删除任务数据
|
//删除任务数据
|
||||||
@ -850,14 +846,14 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
|
|
||||||
//获取下发任务缓存数据
|
//获取下发任务缓存数据
|
||||||
Dictionary<string, Dictionary<string, MeterFiveMinuteReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterFiveMinuteReadingRecords>(fiveMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.WaterMeter).ToString());
|
Dictionary<string, Dictionary<string, MeterReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterReadingRecords>(fiveMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.WaterMeter).ToString());
|
||||||
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
||||||
{
|
{
|
||||||
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-102");
|
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-102");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MeterFiveMinuteReadingRecords> meterTaskInfosList = new List<MeterFiveMinuteReadingRecords>();
|
List<MeterReadingRecords> meterTaskInfosList = new List<MeterReadingRecords>();
|
||||||
|
|
||||||
//将取出的缓存任务数据发送到Kafka消息队列中
|
//将取出的缓存任务数据发送到Kafka消息队列中
|
||||||
foreach (var focusItem in meterTaskInfos)
|
foreach (var focusItem in meterTaskInfos)
|
||||||
@ -878,7 +874,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
||||||
{
|
{
|
||||||
await _fiveMinuteReadingRecordRepository.InsertManyAsync(meterTaskInfosList);
|
await _meterReadingRecordsRepository.InsertManyAsync(meterTaskInfosList);
|
||||||
}
|
}
|
||||||
|
|
||||||
//删除任务数据
|
//删除任务数据
|
||||||
@ -915,14 +911,14 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
|
|
||||||
//获取下发任务缓存数据
|
//获取下发任务缓存数据
|
||||||
Dictionary<string, Dictionary<string, MeterFifteenMinuteReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterFifteenMinuteReadingRecords>(fifteenMinutekeyList, timeDensity.ToString(), MeterTypeEnum.WaterMeter.ToString());
|
Dictionary<string, Dictionary<string, MeterReadingRecords>> meterTaskInfos = await GetMeterRedisCacheData<MeterReadingRecords>(fifteenMinutekeyList, timeDensity.ToString(), MeterTypeEnum.WaterMeter.ToString());
|
||||||
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
|
||||||
{
|
{
|
||||||
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-102");
|
_logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-102");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<MeterFifteenMinuteReadingRecords> meterTaskInfosList = new List<MeterFifteenMinuteReadingRecords>();
|
List<MeterReadingRecords> meterTaskInfosList = new List<MeterReadingRecords>();
|
||||||
|
|
||||||
//将取出的缓存任务数据发送到Kafka消息队列中
|
//将取出的缓存任务数据发送到Kafka消息队列中
|
||||||
foreach (var focusItem in meterTaskInfos)
|
foreach (var focusItem in meterTaskInfos)
|
||||||
@ -943,7 +939,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
}
|
}
|
||||||
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
|
||||||
{
|
{
|
||||||
await _fifteenMinuteReadingRecordRepository.InsertManyAsync(meterTaskInfosList);
|
await _meterReadingRecordsRepository.InsertManyAsync(meterTaskInfosList);
|
||||||
}
|
}
|
||||||
|
|
||||||
//删除任务数据
|
//删除任务数据
|
||||||
|
|||||||
@ -25,8 +25,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
|
|||||||
{
|
{
|
||||||
|
|
||||||
public EnergySystemScheduledMeterReadingService(ILogger<EnergySystemScheduledMeterReadingService> logger,
|
public EnergySystemScheduledMeterReadingService(ILogger<EnergySystemScheduledMeterReadingService> logger,
|
||||||
ICapPublisher capBus,
|
ICapPublisher capBus, IRepository<MeterReadingRecords, Guid> _meterReadingRecordsRepository) :base(logger, capBus, _meterReadingRecordsRepository)
|
||||||
IRepository<MeterFifteenMinuteReadingRecords, Guid> fifteenMinuteReadingRecordRepository, IRepository<MeterFiveMinuteReadingRecords, Guid> fiveMinuteReadingRecordRepository, IRepository<MeterOneMinuteReadingRecords, Guid> oneMinuteReadingRecordRepository) :base(logger, capBus, fifteenMinuteReadingRecordRepository, fiveMinuteReadingRecordRepository, oneMinuteReadingRecordRepository)
|
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -5,8 +5,10 @@ using JiShe.CollectBus.Common.Enums;
|
|||||||
using JiShe.CollectBus.Common.Models;
|
using JiShe.CollectBus.Common.Models;
|
||||||
using JiShe.CollectBus.IotSystems.Devices;
|
using JiShe.CollectBus.IotSystems.Devices;
|
||||||
using JiShe.CollectBus.IotSystems.MessageReceiveds;
|
using JiShe.CollectBus.IotSystems.MessageReceiveds;
|
||||||
|
using JiShe.CollectBus.IotSystems.MeterReadingRecords;
|
||||||
using JiShe.CollectBus.Protocol.Contracts;
|
using JiShe.CollectBus.Protocol.Contracts;
|
||||||
using JiShe.CollectBus.Protocol.Contracts.Interfaces;
|
using JiShe.CollectBus.Protocol.Contracts.Interfaces;
|
||||||
|
using JiShe.CollectBus.Protocol.Contracts.Models;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using TouchSocket.Sockets;
|
using TouchSocket.Sockets;
|
||||||
@ -23,6 +25,7 @@ namespace JiShe.CollectBus.Subscribers
|
|||||||
private readonly IRepository<MessageReceivedHeartbeat, Guid> _messageReceivedHeartbeatEventRepository;
|
private readonly IRepository<MessageReceivedHeartbeat, Guid> _messageReceivedHeartbeatEventRepository;
|
||||||
private readonly IRepository<MessageReceived, Guid> _messageReceivedEventRepository;
|
private readonly IRepository<MessageReceived, Guid> _messageReceivedEventRepository;
|
||||||
private readonly IRepository<Device, Guid> _deviceRepository;
|
private readonly IRepository<Device, Guid> _deviceRepository;
|
||||||
|
private readonly IRepository<MeterReadingRecords, Guid> _meterReadingRecordsRepository;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of the <see cref="SubscriberAppService"/> class.
|
/// Initializes a new instance of the <see cref="SubscriberAppService"/> class.
|
||||||
@ -34,12 +37,13 @@ namespace JiShe.CollectBus.Subscribers
|
|||||||
/// <param name="messageReceivedHeartbeatEventRepository">The message received heartbeat event repository.</param>
|
/// <param name="messageReceivedHeartbeatEventRepository">The message received heartbeat event repository.</param>
|
||||||
/// <param name="messageReceivedEventRepository">The message received event repository.</param>
|
/// <param name="messageReceivedEventRepository">The message received event repository.</param>
|
||||||
/// <param name="deviceRepository">The device repository.</param>
|
/// <param name="deviceRepository">The device repository.</param>
|
||||||
|
/// <param name="meterReadingRecordsRepository">The device repository.</param>
|
||||||
public SubscriberAppService(ILogger<SubscriberAppService> logger,
|
public SubscriberAppService(ILogger<SubscriberAppService> logger,
|
||||||
ITcpService tcpService, IServiceProvider serviceProvider,
|
ITcpService tcpService, IServiceProvider serviceProvider,
|
||||||
IRepository<MessageReceivedLogin, Guid> messageReceivedLoginEventRepository,
|
IRepository<MessageReceivedLogin, Guid> messageReceivedLoginEventRepository,
|
||||||
IRepository<MessageReceivedHeartbeat, Guid> messageReceivedHeartbeatEventRepository,
|
IRepository<MessageReceivedHeartbeat, Guid> messageReceivedHeartbeatEventRepository,
|
||||||
IRepository<MessageReceived, Guid> messageReceivedEventRepository,
|
IRepository<MessageReceived, Guid> messageReceivedEventRepository,
|
||||||
IRepository<Device, Guid> deviceRepository)
|
IRepository<Device, Guid> deviceRepository, IRepository<MeterReadingRecords, Guid> meterReadingRecordsRepository)
|
||||||
{
|
{
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
_tcpService = tcpService;
|
_tcpService = tcpService;
|
||||||
@ -48,6 +52,7 @@ namespace JiShe.CollectBus.Subscribers
|
|||||||
_messageReceivedHeartbeatEventRepository = messageReceivedHeartbeatEventRepository;
|
_messageReceivedHeartbeatEventRepository = messageReceivedHeartbeatEventRepository;
|
||||||
_messageReceivedEventRepository = messageReceivedEventRepository;
|
_messageReceivedEventRepository = messageReceivedEventRepository;
|
||||||
_deviceRepository = deviceRepository;
|
_deviceRepository = deviceRepository;
|
||||||
|
_meterReadingRecordsRepository = meterReadingRecordsRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
[CapSubscribe(ProtocolConst.SubscriberIssuedEventName)]
|
[CapSubscribe(ProtocolConst.SubscriberIssuedEventName)]
|
||||||
@ -90,8 +95,9 @@ namespace JiShe.CollectBus.Subscribers
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await protocolPlugin.AnalyzeAsync(receivedMessage);
|
//todo 会根据不同的协议进行解析,然后做业务处理
|
||||||
await _messageReceivedEventRepository.InsertAsync(receivedMessage);
|
TB3761FN fN = await protocolPlugin.AnalyzeAsync<TB3761FN>(receivedMessage);
|
||||||
|
//await _messageReceivedEventRepository.InsertAsync(receivedMessage);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1,18 +0,0 @@
|
|||||||
using JiShe.CollectBus.Common.Enums;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Volo.Abp.Domain.Entities;
|
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IotSystems.MeterReadingRecords
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 15分钟抄读记录表,包含下发报文和回复报文,以及是否迁移
|
|
||||||
/// </summary>
|
|
||||||
public class MeterFifteenMinuteReadingRecords : BasicMeterReadingRecords
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
using JiShe.CollectBus.Common.Enums;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Volo.Abp.Domain.Entities;
|
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IotSystems.MeterReadingRecords
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 5分钟抄读记录表,包含下发报文和回复报文,以及是否迁移
|
|
||||||
/// </summary>
|
|
||||||
public class MeterFiveMinuteReadingRecords : BasicMeterReadingRecords
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
using JiShe.CollectBus.Common.Enums;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Volo.Abp.Domain.Entities;
|
|
||||||
|
|
||||||
namespace JiShe.CollectBus.IotSystems.MeterReadingRecords
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// 1分钟抄读记录表,包含下发报文和回复报文,以及是否迁移
|
|
||||||
/// </summary>
|
|
||||||
public class MeterOneMinuteReadingRecords : BasicMeterReadingRecords
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -9,9 +9,9 @@ using Volo.Abp.Domain.Entities;
|
|||||||
namespace JiShe.CollectBus.IotSystems.MeterReadingRecords
|
namespace JiShe.CollectBus.IotSystems.MeterReadingRecords
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 抄读记录基类
|
/// 抄读数据记录
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class BasicMeterReadingRecords : AggregateRoot<Guid>
|
public class MeterReadingRecords : AggregateRoot<Guid>
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -55,6 +55,16 @@ namespace JiShe.CollectBus.IotSystems.MeterReadingRecords
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public MeterTypeEnum MeterType { get; set; }
|
public MeterTypeEnum MeterType { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 项目ID
|
||||||
|
/// </summary>
|
||||||
|
public int ProjectID { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 数据库业务ID
|
||||||
|
/// </summary>
|
||||||
|
public int DatabaseBusiID { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// AFN功能码
|
/// AFN功能码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -34,7 +34,7 @@
|
|||||||
"CorsOrigins": "http://localhost:4200,http://localhost:3100"
|
"CorsOrigins": "http://localhost:4200,http://localhost:3100"
|
||||||
},
|
},
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"Default": "mongodb://admin:admin02023@118.190.144.92:37117,118.190.144.92:37119,118.190.144.92:37120/JiSheCollectBus?authSource=admin",
|
"Default": "mongodb://admin:admin02023@118.190.144.92:37117,118.190.144.92:37119,118.190.144.92:37120/JiSheCollectBus?authSource=admin&maxPoolSize=200&minPoolSize=10&waitQueueTimeoutMS=5000",
|
||||||
"Kafka": "121.42.242.91:29092,121.42.242.91:39092,121.42.242.91:49092",
|
"Kafka": "121.42.242.91:29092,121.42.242.91:39092,121.42.242.91:49092",
|
||||||
"PrepayDB": "server=118.190.144.92;database=jishe.sysdb;uid=sa;pwd=admin@2023;Encrypt=False;Trust Server Certificate=False",
|
"PrepayDB": "server=118.190.144.92;database=jishe.sysdb;uid=sa;pwd=admin@2023;Encrypt=False;Trust Server Certificate=False",
|
||||||
"EnergyDB": "server=118.190.144.92;database=db_energy;uid=sa;pwd=admin@2023;Encrypt=False;Trust Server Certificate=False"
|
"EnergyDB": "server=118.190.144.92;database=db_energy;uid=sa;pwd=admin@2023;Encrypt=False;Trust Server Certificate=False"
|
||||||
|
|||||||
@ -24,9 +24,8 @@ public class CollectBusMongoDbContext : AbpMongoDbContext, ICollectBusMongoDbCon
|
|||||||
public IMongoCollection<Device> Devices => Collection<Device>();
|
public IMongoCollection<Device> Devices => Collection<Device>();
|
||||||
public IMongoCollection<ProtocolInfo> ProtocolInfos => Collection<ProtocolInfo>();
|
public IMongoCollection<ProtocolInfo> ProtocolInfos => Collection<ProtocolInfo>();
|
||||||
|
|
||||||
public IMongoCollection<MeterFifteenMinuteReadingRecords> FifteenMinuteReadingRecords => Collection<MeterFifteenMinuteReadingRecords>();
|
public IMongoCollection<MeterReadingRecords> MeterReadingRecords => Collection<MeterReadingRecords>();
|
||||||
public IMongoCollection<MeterFiveMinuteReadingRecords> MeterFiveMinuteReadingRecords => Collection<MeterFiveMinuteReadingRecords>();
|
|
||||||
public IMongoCollection<MeterOneMinuteReadingRecords> MeterOneMinuteReadingRecords => Collection<MeterOneMinuteReadingRecords>();
|
|
||||||
|
|
||||||
protected override void CreateModel(IMongoModelBuilder modelBuilder)
|
protected override void CreateModel(IMongoModelBuilder modelBuilder)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -55,7 +55,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Abstracts
|
|||||||
//await _protocolInfoCache.Get()
|
//await _protocolInfoCache.Get()
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract Task AnalyzeAsync(MessageReceived messageReceived, Action<byte[]>? sendAction = null);
|
public abstract Task<T> AnalyzeAsync<T>(MessageReceived messageReceived, Action<byte[]>? sendAction = null) where T : TB3761FN;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 登录帧解析
|
/// 登录帧解析
|
||||||
|
|||||||
@ -14,7 +14,7 @@ namespace JiShe.CollectBus.Protocol.Contracts.Interfaces
|
|||||||
|
|
||||||
Task AddAsync();
|
Task AddAsync();
|
||||||
|
|
||||||
Task AnalyzeAsync(MessageReceived messageReceived, Action<byte[]>? sendAction = null);
|
Task<T> AnalyzeAsync<T>(MessageReceived messageReceived, Action<byte[]>? sendAction = null) where T : TB3761FN;
|
||||||
|
|
||||||
Task LoginAsync(MessageReceivedLogin messageReceived);
|
Task LoginAsync(MessageReceivedLogin messageReceived);
|
||||||
|
|
||||||
|
|||||||
@ -21,12 +21,15 @@ namespace JiShe.CollectBus.Protocol
|
|||||||
|
|
||||||
public sealed override ProtocolInfo Info => new(nameof(StandardProtocolPlugin), "376.1", "TCP", "376.1协议", "DTS1980");
|
public sealed override ProtocolInfo Info => new(nameof(StandardProtocolPlugin), "376.1", "TCP", "376.1协议", "DTS1980");
|
||||||
|
|
||||||
public override Task AnalyzeAsync(MessageReceived messageReceived, Action<byte[]>? sendAction = null)
|
public override async Task<T> AnalyzeAsync<T>(MessageReceived messageReceived, Action<byte[]>? sendAction = null)
|
||||||
{
|
{
|
||||||
var hexStringList = messageReceived.MessageHexString.StringToPairs();
|
var hexStringList = messageReceived.MessageHexString.StringToPairs();
|
||||||
var aTuple = (Tuple<string, int>)hexStringList.GetAnalyzeValue(CommandChunkEnum.A);
|
var aTuple = (Tuple<string, int>)hexStringList.GetAnalyzeValue(CommandChunkEnum.A);
|
||||||
var afn = (int)hexStringList.GetAnalyzeValue(CommandChunkEnum.AFN);
|
var afn = (int)hexStringList.GetAnalyzeValue(CommandChunkEnum.AFN);
|
||||||
var fn = (int)hexStringList.GetAnalyzeValue(CommandChunkEnum.FN);
|
var fn = (int)hexStringList.GetAnalyzeValue(CommandChunkEnum.FN);
|
||||||
|
|
||||||
|
T analyze = default;
|
||||||
|
|
||||||
switch ((AFN)afn)
|
switch ((AFN)afn)
|
||||||
{
|
{
|
||||||
case AFN.确认或否认:
|
case AFN.确认或否认:
|
||||||
@ -35,15 +38,15 @@ namespace JiShe.CollectBus.Protocol
|
|||||||
case AFN.设置参数: break;
|
case AFN.设置参数: break;
|
||||||
case AFN.查询参数: break;
|
case AFN.查询参数: break;
|
||||||
case AFN.请求实时数据:
|
case AFN.请求实时数据:
|
||||||
if (Enum.IsDefined(typeof(ATypeOfDataItems), fn)) //Enum.TryParse(afn.ToString(), out ATypeOfDataItems parseResult)
|
if (Enum.IsDefined(typeof(ATypeOfDataItems), fn))
|
||||||
{
|
{
|
||||||
AnalyzeReadingDataAsync(messageReceived, sendAction);
|
analyze = (T?)AnalyzeReadingDataAsync(messageReceived, sendAction);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AFN.请求历史数据:
|
case AFN.请求历史数据:
|
||||||
if (Enum.IsDefined(typeof(IIdataTypeItems), fn))
|
if (Enum.IsDefined(typeof(IIdataTypeItems), fn))
|
||||||
{
|
{
|
||||||
AnalyzeReadingTdcDataAsync(messageReceived, sendAction);
|
analyze = (T?)AnalyzeReadingTdcDataAsync(messageReceived, sendAction);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AFN.数据转发:
|
case AFN.数据转发:
|
||||||
@ -51,7 +54,7 @@ namespace JiShe.CollectBus.Protocol
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new NotImplementedException();
|
return await Task.FromResult(analyze);
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 上行命令
|
#region 上行命令
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user