From 0efb87482d2764ff68ec7a2520256d839d3a0243 Mon Sep 17 00:00:00 2001
From: ChenYi <296215406@outlook.com>
Date: Tue, 18 Mar 2025 15:58:37 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=B8=8B=E5=8F=91=E6=8C=87?=
=?UTF-8?q?=E4=BB=A4=E6=9E=84=E5=BB=BA=E6=9C=BA=E5=88=B6=EF=BC=8C=E5=B0=86?=
=?UTF-8?q?=E6=9E=84=E5=BB=BA=E4=B8=8E=E4=B8=8B=E5=8F=91=E6=8B=86=E5=88=86?=
=?UTF-8?q?=EF=BC=8C=E8=B5=B0=E5=8D=95=E7=8B=AC=E6=B5=81=E7=A8=8B=E5=A4=84?=
=?UTF-8?q?=E7=90=86=E3=80=82?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../IScheduledMeterReadingService.cs | 18 +-
.../BasicScheduledMeterReadingService.cs | 854 +++++---
.../Subscribers/WorkerSubscriberAppService.cs | 13 +-
.../Workers/CreateToBeIssueTaskWorker.cs | 42 +
.../Workers/SubscriberFifteenMinuteWorker.cs | 8 +-
.../Workers/SubscriberFiveMinuteWorker.cs | 10 +-
.../Workers/SubscriberOneMinuteWorker.cs | 11 +-
.../BuildSendDatas/TasksToBeIssueModel.cs | 24 +
.../BuildSendDatas/TelemetryPacketBuilder.cs | 1933 +----------------
.../BuildSendDatas/TelemetryPacketRequest.cs | 34 +
.../Consts/FreeRedisConst.cs | 13 +-
...ScheduledMeterReadingIssuedEventMessage.cs | 7 +-
12 files changed, 796 insertions(+), 2171 deletions(-)
create mode 100644 src/JiShe.CollectBus.Application/Workers/CreateToBeIssueTaskWorker.cs
create mode 100644 src/JiShe.CollectBus.Common/BuildSendDatas/TasksToBeIssueModel.cs
create mode 100644 src/JiShe.CollectBus.Common/BuildSendDatas/TelemetryPacketRequest.cs
diff --git a/src/JiShe.CollectBus.Application.Contracts/ScheduledMeterReading/IScheduledMeterReadingService.cs b/src/JiShe.CollectBus.Application.Contracts/ScheduledMeterReading/IScheduledMeterReadingService.cs
index a89d071..15d60d9 100644
--- a/src/JiShe.CollectBus.Application.Contracts/ScheduledMeterReading/IScheduledMeterReadingService.cs
+++ b/src/JiShe.CollectBus.Application.Contracts/ScheduledMeterReading/IScheduledMeterReadingService.cs
@@ -19,6 +19,12 @@ namespace JiShe.CollectBus.ScheduledMeterReading
///
Task> GetGatherItemByDataTypes();
+ ///
+ /// 构建待处理的下发指令任务处理
+ ///
+ ///
+ Task CreateToBeIssueTasks();
+
#region 电表采集处理
///
/// 获取电表信息
@@ -35,19 +41,19 @@ namespace JiShe.CollectBus.ScheduledMeterReading
Task InitAmmeterCacheData(string gatherCode = "");
///
- /// 1分钟采集电表数据
+ /// 1分钟采集电表数据,只获取任务数据下发,不构建任务
///
///
Task AmmeterScheduledMeterOneMinuteReading();
///
- /// 5分钟采集电表数据
+ /// 5分钟采集电表数据,只获取任务数据下发,不构建任务
///
///
Task AmmeterScheduledMeterFiveMinuteReading();
///
- /// 15分钟采集电表数据
+ /// 15分钟采集电表数据,只获取任务数据下发,不构建任务
///
///
Task AmmeterScheduledMeterFifteenMinuteReading();
@@ -64,7 +70,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
Task> GetWatermeterInfoList(string gatherCode = "");
///
- /// 初始化水表缓存数据
+ /// 初始化水表缓存数据,只获取任务数据下发,不构建任务
///
/// 采集端Code
///
@@ -77,13 +83,13 @@ namespace JiShe.CollectBus.ScheduledMeterReading
Task WatermeterScheduledMeterOneMinuteReading();
///
- /// 5分钟采集水表数据
+ /// 5分钟采集水表数据,只获取任务数据下发,不构建任务
///
///
Task WatermeterScheduledMeterFiveMinuteReading();
///
- /// 15分钟采集水表数据
+ /// 15分钟采集水表数据,只获取任务数据下发,不构建任务
///
///
Task WatermeterScheduledMeterFifteenMinuteReading();
diff --git a/src/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs b/src/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs
index 39be20d..4e8c7d0 100644
--- a/src/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs
+++ b/src/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs
@@ -24,6 +24,7 @@ using MassTransit;
using MassTransit.Internals.GraphValidation;
using Microsoft.Extensions.Logging;
using Volo.Abp.Domain.Repositories;
+using static FreeSql.Internal.GlobalFilter;
namespace JiShe.CollectBus.ScheduledMeterReading
{
@@ -71,6 +72,71 @@ namespace JiShe.CollectBus.ScheduledMeterReading
throw new NotImplementedException($"{nameof(GetGatherItemByDataTypes)}请根据不同系统类型进行实现");
}
+ ///
+ /// 构建待处理的下发指令任务处理
+ ///
+ ///
+ public virtual async Task CreateToBeIssueTasks()
+ {
+ var redisCacheKey = $"{FreeRedisConst.CacheBasicDirectoryKey}{SystemType}:TaskInfo:*";
+ var taskInfos = await FreeRedisProvider.Instance.KeysAsync(redisCacheKey);
+ if (taskInfos == null || taskInfos.Length <= 0)
+ {
+ _logger.LogWarning($"{nameof(CreateToBeIssueTasks)} 构建待处理的下发指令任务处理时没有缓存数据,-101");
+ return;
+ }
+
+ foreach (var item in taskInfos)
+ {
+ var tasksToBeIssueModel = await FreeRedisProvider.Instance.GetAsync(item);
+ if (tasksToBeIssueModel == null)
+ {
+ _logger.LogWarning($"{nameof(CreateToBeIssueTasks)} 构建待处理的下发指令任务处理时Key=>{item}没有缓存数据,102");
+ continue;
+ }
+
+ //item 为 CacheTasksToBeIssuedKey 对应的缓存待下发的指令生产任务数据Redis Key tempArryay[0]=>CollectBus,tempArryay[1]=>SystemTypeConst,tempArryay[2]=>TaskInfo,tempArryay[3]=>表计类别,tempArryay[4]=>采集频率
+ var tempArryay = item.Split(":");
+ string meteryType = tempArryay[3];//表计类别
+ string timeDensity = tempArryay[4];//采集频率
+
+ //获取缓存中的电表信息
+ var redisKeyList = $"{string.Format(FreeRedisConst.CacheMeterInfoKey, SystemType, meteryType, timeDensity)}*";
+ var oneMinutekeyList = await FreeRedisProvider.Instance.KeysAsync(redisKeyList);
+ if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0)
+ {
+ _logger.LogError($"{nameof(CreateToBeIssueTasks)} {timeDensity}分钟采集待下发任务创建失败,没有获取到缓存信息,-103");
+ return;
+ }
+
+ if (meteryType == MeterTypeEnum.Ammeter.ToString())
+ {
+ // 解析结果(结果为嵌套数组)
+ var meterInfos = await GetMeterRedisCacheData(oneMinutekeyList, timeDensity, meteryType);
+ if (meterInfos == null || meterInfos.Count <= 0)
+ {
+ _logger.LogError($"{nameof(CreateToBeIssueTasks)} {timeDensity}分钟采集待下发任务创建失败,没有获取到缓存信息,-104");
+ return;
+ }
+ await AmmerterScheduledMeterReadingIssued(timeDensity, meterInfos);
+ }
+ else if (meteryType == MeterTypeEnum.WaterMeter.ToString())
+ {
+ //todo 水表任务创建待处理
+ //await WatermeterScheduledMeterReadingIssued(timeDensity, meterInfos);
+ }
+ else
+ {
+ _logger.LogError($"{nameof(CreateToBeIssueTasks)} {timeDensity}分钟采集待下发任务创建失败,没有获取到缓存信息,-105");
+ }
+
+ _logger.LogInformation($"{nameof(CreateToBeIssueTasks)} {timeDensity}分钟采集待下发任务创建完成");
+
+ //删除已经处理过的缓存数据
+ await FreeRedisProvider.Instance.DelAsync(item);
+ }
+ }
+
#region 电表采集处理
///
@@ -111,12 +177,21 @@ namespace JiShe.CollectBus.ScheduledMeterReading
var meterInfoGroup = itemTimeDensity.GroupBy(x => x.FocusAddress).ToList();
foreach (var item in meterInfoGroup)
{
- if (string.IsNullOrWhiteSpace(item.Key))
+ if (string.IsNullOrWhiteSpace(item.Key))//集中器号为空,跳过
{
continue;
}
- var redisCacheKey = $"{string.Format(FreeRedisConst.CacheAmmeterInfoKey, SystemTypeConst.Energy, itemTimeDensity.Key)}{item.Key}";
+ var redisCacheKey = $"{string.Format(FreeRedisConst.CacheMeterInfoKey, SystemType, MeterTypeEnum.Ammeter, itemTimeDensity.Key)}{item.Key}";
+
+#if DEBUG
+ //每次缓存时,删除缓存,避免缓存数据错误
+ await FreeRedisProvider.Instance.DelAsync(redisCacheKey);
+#else
+ //每次缓存时,删除缓存,避免缓存数据错误
+ await FreeRedisProvider.Instance.DelAsync(redisCacheKey);
+#endif
+
Dictionary keyValuePairs = new Dictionary();
foreach (var ammeter in item)
{
@@ -166,37 +241,72 @@ namespace JiShe.CollectBus.ScheduledMeterReading
}
await FreeRedisProvider.Instance.HSetAsync(redisCacheKey, keyValuePairs);
}
+
+ //在缓存表信息数据的时候,新增下一个时间的自动处理任务,1分钟后执行
+ TasksToBeIssueModel nextTask = new TasksToBeIssueModel()
+ {
+ TimeDensity = itemTimeDensity.Key,
+ NextTask = DateTime.Now.AddMinutes(1)
+ };
+
+ var taskRedisCacheKey = string.Format(FreeRedisConst.CacheTasksToBeIssuedKey, SystemType, MeterTypeEnum.Ammeter, itemTimeDensity.Key);
+ await FreeRedisProvider.Instance.SetAsync(taskRedisCacheKey, nextTask);
}
_logger.LogInformation($"{nameof(InitAmmeterCacheData)} 初始化电表缓存数据完成");
}
///
- /// 1分钟采集电表数据
+ /// 1分钟采集电表数据,只获取任务数据下发,不构建任务
///
///
public virtual async Task AmmeterScheduledMeterOneMinuteReading()
{
//获取缓存中的电表信息
- var redisKeyList = $"{string.Format(FreeRedisConst.CacheAmmeterInfoKey, SystemTypeConst.Energy, 1)}*";
+ int timeDensity = 5;
+ var redisKeyList = $"{string.Format(FreeRedisConst.CacheTelemetryPacketInfoKey, SystemType, MeterTypeEnum.Ammeter, timeDensity)}*";
var oneMinutekeyList = await FreeRedisProvider.Instance.KeysAsync(redisKeyList);
if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0)
{
- _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理时没有获取到缓存信息,-101");
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-101");
return;
}
- // 解析结果(结果为嵌套数组)
- Dictionary> meterInfos = await GetMeterCacheData(oneMinutekeyList, 1);
- if (meterInfos == null || meterInfos.Count <= 0)
+ //获取下发任务缓存数据
+ Dictionary> meterTaskInfos = await GetMeterRedisCacheData(oneMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.Ammeter).ToString());
+ if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
{
- _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理时没有获取到缓存信息,-102");
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-102");
return;
}
- await AmmerterScheduledMeterReadingIssued(ProtocolConst.AmmeterSubscriberWorkerOneMinuteIssuedEventName, meterInfos);
+ List meterTaskInfosList = new List();
- _logger.LogInformation($"{nameof(AmmeterScheduledMeterOneMinuteReading)} 1分钟采集电表数据处理完成");
+ //将取出的缓存任务数据发送到Kafka消息队列中
+ foreach (var focusItem in meterTaskInfos)
+ {
+ foreach (var ammerterItem in focusItem.Value)
+ {
+ await _capBus.PublishAsync(ProtocolConst.AmmeterSubscriberWorkerOneMinuteIssuedEventName, ammerterItem.Value);
+ meterTaskInfosList.Add(ammerterItem.Value);
+ }
+ }
+ if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
+ {
+ await _meterReadingIssuedRepository.InsertManyAsync(meterTaskInfosList);
+ }
+
+ //缓存下一个时间的任务
+ TasksToBeIssueModel nextTask = new TasksToBeIssueModel()
+ {
+ TimeDensity = timeDensity,
+ NextTask = DateTime.Now.AddMinutes(timeDensity)
+ };
+
+ var redisCacheKey = string.Format(FreeRedisConst.CacheTasksToBeIssuedKey, SystemType, MeterTypeEnum.Ammeter, timeDensity);
+ await FreeRedisProvider.Instance.SetAsync(redisCacheKey, nextTask);
+
+ _logger.LogInformation($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理完成");
}
@@ -207,24 +317,50 @@ namespace JiShe.CollectBus.ScheduledMeterReading
public virtual async Task AmmeterScheduledMeterFiveMinuteReading()
{
//获取缓存中的电表信息
- var redisKeyList = $"{string.Format(FreeRedisConst.CacheAmmeterInfoKey, SystemTypeConst.Energy, 5)}*";
+ int timeDensity = 5;
+ var redisKeyList = $"{string.Format(FreeRedisConst.CacheTelemetryPacketInfoKey, SystemType, MeterTypeEnum.Ammeter, timeDensity)}*";
var oneMinutekeyList = await FreeRedisProvider.Instance.KeysAsync(redisKeyList);
if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0)
{
- _logger.LogError($"{nameof(AmmeterScheduledMeterFiveMinuteReading)} 5分钟采集电表数据处理时没有获取到缓存信息,-101");
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-101");
return;
}
- // 解析结果(结果为嵌套数组)
- Dictionary> meterInfos = await GetMeterCacheData(oneMinutekeyList, 5);
- if (meterInfos == null || meterInfos.Count <= 0)
+ //获取下发任务缓存数据
+ Dictionary> meterTaskInfos = await GetMeterRedisCacheData(oneMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.Ammeter).ToString());
+ if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
{
- _logger.LogError($"{nameof(AmmeterScheduledMeterFiveMinuteReading)} 5分钟采集电表数据处理时没有获取到缓存信息,-102");
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-102");
return;
}
- await AmmerterScheduledMeterReadingIssued(ProtocolConst.AmmeterSubscriberWorkerFiveMinuteIssuedEventName, meterInfos);
- _logger.LogInformation($"{nameof(AmmeterScheduledMeterFiveMinuteReading)} 5分钟采集电表数据处理完成");
+ List meterTaskInfosList = new List();
+
+ //将取出的缓存任务数据发送到Kafka消息队列中
+ foreach (var focusItem in meterTaskInfos)
+ {
+ foreach (var ammerterItem in focusItem.Value)
+ {
+ await _capBus.PublishAsync(ProtocolConst.AmmeterSubscriberWorkerFiveMinuteIssuedEventName, ammerterItem.Value);
+ meterTaskInfosList.Add(ammerterItem.Value);
+ }
+ }
+ if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
+ {
+ await _meterReadingIssuedRepository.InsertManyAsync(meterTaskInfosList);
+ }
+
+ //缓存下一个时间的任务
+ TasksToBeIssueModel nextTask = new TasksToBeIssueModel()
+ {
+ TimeDensity = timeDensity,
+ NextTask = DateTime.Now.AddMinutes(timeDensity)
+ };
+
+ var redisCacheKey = string.Format(FreeRedisConst.CacheTasksToBeIssuedKey, SystemType, MeterTypeEnum.Ammeter, timeDensity);
+ await FreeRedisProvider.Instance.SetAsync(redisCacheKey, nextTask);
+
+ _logger.LogInformation($"{nameof(AmmeterScheduledMeterFiveMinuteReading)} {timeDensity}分钟采集电表数据处理完成");
}
///
@@ -233,31 +369,288 @@ namespace JiShe.CollectBus.ScheduledMeterReading
///
public virtual async Task AmmeterScheduledMeterFifteenMinuteReading()
{
- //获取缓存中的电表信息
- var redisKeyList = $"{string.Format(FreeRedisConst.CacheAmmeterInfoKey, SystemTypeConst.Energy, 15)}*";
- var oneMinutekeyList = await FreeRedisProvider.Instance.KeysAsync(redisKeyList);
- if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0)
- {
- _logger.LogError($"{nameof(AmmeterScheduledMeterFifteenMinuteReading)} 15分钟采集电表数据处理时没有获取到缓存信息,-101");
- return;
- }
-
- // 解析结果(结果为嵌套数组)
- Dictionary> meterInfos = await GetMeterCacheData(oneMinutekeyList, 15);
- if (meterInfos == null || meterInfos.Count <= 0)
- {
- _logger.LogError($"{nameof(AmmeterScheduledMeterFifteenMinuteReading)} 15分钟采集电表数据处理时没有获取到缓存信息,-102");
- return;
- }
-
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
- await AmmerterScheduledMeterReadingIssued(ProtocolConst.AmmeterSubscriberWorkerFifteenMinuteIssuedEventName, meterInfos);
+ //获取缓存中的电表信息
+ int timeDensity = 15;
+ var redisKeyList = $"{string.Format(FreeRedisConst.CacheTelemetryPacketInfoKey, SystemType, MeterTypeEnum.Ammeter, timeDensity)}*";
+ var oneMinutekeyList = await FreeRedisProvider.Instance.KeysAsync(redisKeyList);
+ if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0)
+ {
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-101");
+ return;
+ }
+
+ //获取下发任务缓存数据
+ Dictionary> meterTaskInfos = await GetMeterRedisCacheData(oneMinutekeyList, timeDensity.ToString(), MeterTypeEnum.Ammeter.ToString());
+ if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
+ {
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集电表数据处理时没有获取到缓存信息,-102");
+ return;
+ }
+ List meterTaskInfosList = new List();
+
+ //将取出的缓存任务数据发送到Kafka消息队列中
+ foreach (var focusItem in meterTaskInfos)
+ {
+ foreach (var ammerterItem in focusItem.Value)
+ {
+ _= _capBus.PublishAsync(ProtocolConst.AmmeterSubscriberWorkerFifteenMinuteIssuedEventName, ammerterItem.Value);
+ meterTaskInfosList.Add(ammerterItem.Value);
+ }
+ }
+ if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
+ {
+ await _meterReadingIssuedRepository.InsertManyAsync(meterTaskInfosList);
+ }
+
+ //删除任务数据
+ await FreeRedisProvider.Instance.DelAsync(redisKeyList);
+
+ //缓存下一个时间的任务
+ TasksToBeIssueModel nextTask = new TasksToBeIssueModel()
+ {
+ TimeDensity = timeDensity,
+ NextTask = DateTime.Now.AddMinutes(timeDensity)
+ };
+
+ var redisCacheKey = string.Format(FreeRedisConst.CacheTasksToBeIssuedKey, SystemType, MeterTypeEnum.Ammeter, timeDensity);
+ await FreeRedisProvider.Instance.SetAsync(redisCacheKey, nextTask);
+
stopwatch.Stop();
- _logger.LogError($"{nameof(AmmeterScheduledMeterFifteenMinuteReading)} 15分钟采集电表数据处理完成,共消耗{stopwatch.ElapsedMilliseconds}毫秒。");
+ _logger.LogError($"{nameof(AmmeterScheduledMeterFifteenMinuteReading)} {timeDensity}分钟采集电表数据处理完成,共消耗{stopwatch.ElapsedMilliseconds}毫秒。");
+ }
+
+ ///
+ /// 电表采集任务指令创建
+ ///
+ /// 采集频率1分钟、5分钟、15分钟
+ /// 集中器数据分组
+ ///
+ private async Task AmmerterScheduledMeterReadingIssued(string timeDensity, Dictionary> focusGroup)
+ {
+ if (string.IsNullOrWhiteSpace(timeDensity) || focusGroup == null || focusGroup.Count <= 0)
+ {
+ _logger.LogError($"{nameof(AmmerterScheduledMeterReadingIssued)} 电表数据采集指令生成失败,参数异常,-101");
+ return;
+ }
+ try
+ {
+ //将采集器编号的hash值取模分组
+ const int TotalShards = 1024;
+ var focusHashGroups = new Dictionary>>();
+
+ foreach (var (collectorId, ammetersDictionary) in focusGroup)
+ {
+ if (string.IsNullOrWhiteSpace(collectorId))
+ {
+ _logger.LogError($"{nameof(AmmerterScheduledMeterReadingIssued)} 集中器信息分组取模失败,无效Key -102");
+ continue;
+ }
+
+ // 计算哈希分组ID
+ int hashGroupId = Math.Abs(collectorId.GetHashCode() % TotalShards);
+
+ // 获取或创建分组(避免重复查找)
+ if (!focusHashGroups.TryGetValue(hashGroupId, out var group))
+ {
+ group = new Dictionary>();
+ focusHashGroups[hashGroupId] = group;
+ }
+
+ // 将当前集中器数据加入分组
+ group[collectorId] = ammetersDictionary;
+ }
+
+ if (focusHashGroups == null)
+ {
+ _logger.LogError($"{nameof(AmmerterScheduledMeterReadingIssued)} 集中器信息分组取模失败 -103");
+ return;
+ }
+
+ //根据分组创建线程批处理集中器
+ foreach (var group in focusHashGroups)
+ {
+ await AmmerterCreatePublishTask(timeDensity, group.Value);
+ }
+ }
+ catch (Exception)
+ {
+
+ throw;
+ }
+ }
+
+ ///
+ /// 电表创建发布任务
+ ///
+ /// 采集频率
+ /// 集中器号hash分组的集中器集合数据
+ ///
+ private async Task AmmerterCreatePublishTask(string timeDensity
+ , Dictionary> focusGroup)
+ {
+ var HandlerPacketBuilder = TelemetryPacketBuilder.AFNHandlersDictionary;
+
+ var currentTime = DateTime.Now;
+ foreach (var focusInfo in focusGroup)
+ {
+ //构建缓存任务key,依然 表计类型+采集频率+集中器地址,存hash类型
+ var redisCacheKey = $"{string.Format(FreeRedisConst.CacheTelemetryPacketInfoKey, SystemType, MeterTypeEnum.Ammeter, timeDensity)}{focusInfo.Key}";
+
+ foreach (var ammeterInfo in focusInfo.Value)
+ {
+ var ammeter = ammeterInfo.Value;
+
+ if (string.IsNullOrWhiteSpace(ammeter.ItemCodes))
+ {
+ _logger.LogError($"{nameof(AmmerterCreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}数据采集指令生成失败,采集项为空,-101");
+ continue;
+ }
+
+ //载波的不处理
+ if (ammeter.MeteringPort == (int)MeterLinkProtocolEnum.Carrierwave)
+ {
+ _logger.LogError($"{nameof(AmmerterCreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}数据采集指令生成失败,载波不处理,-102");
+ continue;
+ }
+
+ if (ammeter.State.Equals(2))
+ {
+ _logger.LogWarning($"{nameof(AmmerterCreatePublishTask)} {ammeter.Name} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}状态为禁用,不处理");
+ continue;
+ }
+
+ ////排除1天未在线的集中器生成指令 或 排除集中器配置为自动上报的集中器
+ //if (!IsGennerateCmd(ammeter.LastTime, -1))
+ //{
+ // _logger.LogInformation($"{nameof(CreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name},采集时间:{ammeter.LastTime},已超过1天未在线,不生成指令");
+ // continue;
+ //}
+
+ if (string.IsNullOrWhiteSpace(ammeter.AreaCode))
+ {
+ _logger.LogError($"{nameof(AmmerterCreatePublishTask)} 表ID:{ammeter.ID},集中器通信区号为空");
+ continue;
+ }
+ if (string.IsNullOrWhiteSpace(ammeter.Address))
+ {
+ _logger.LogError($"{nameof(AmmerterCreatePublishTask)} 表ID:{ammeter.ID},集中器通信地址为空");
+ continue;
+ }
+ if (Convert.ToInt32(ammeter.Address) > 65535)
+ {
+ _logger.LogError($"{nameof(AmmerterCreatePublishTask)} 表ID:{ammeter.ID},集中器通信地址无效,确保大于65535");
+ continue;
+ }
+ if (ammeter.MeteringCode <= 0 || ammeter.MeteringCode > 2033)
+ {
+ _logger.LogError($"{nameof(AmmerterCreatePublishTask)} 表ID:{ammeter.ID},非有效测量点号({ammeter.MeteringCode})");
+ continue;
+ }
+
+ List tempCodes = ammeter.ItemCodes.Deserialize>()!;
+
+ //TODO:自动上报数据只主动采集1类数据。
+ if (ammeter.AutomaticReport.Equals(1))
+ {
+ var tempSubCodes = new List();
+ if (tempCodes.Contains("0C_49"))
+ {
+ tempSubCodes.Add("0C_49");
+ }
+
+ if (tempSubCodes.Contains("0C_149"))
+ {
+ tempSubCodes.Add("0C_149");
+ }
+
+ if (ammeter.ItemCodes.Contains("10_97"))
+ {
+ tempSubCodes.Add("10_97");
+ }
+
+ if (tempSubCodes == null || tempSubCodes.Count <= 0)
+ {
+ _logger.LogInformation($"{nameof(AmmerterCreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}自动上报数据主动采集1类数据时数据类型为空");
+ continue;
+ }
+ else
+ {
+ tempCodes = tempSubCodes;
+ }
+ }
+
+ Dictionary keyValuePairs = new Dictionary();
+
+ foreach (var tempItem in tempCodes)
+ {
+ //排除已发送日冻结和月冻结采集项配置
+ if (DayFreezeCodes.Contains(tempItem))
+ {
+ continue;
+ }
+
+ if (MonthFreezeCodes.Contains(tempItem))
+ {
+ continue;
+ }
+
+ var itemCodeArr = tempItem.Split('_');
+ var aFNStr = itemCodeArr[0];
+ var aFN = (AFN)aFNStr.HexToDec();
+ var fn = int.Parse(itemCodeArr[1]);
+ byte[] dataInfos = null;
+ if (ammeter.AutomaticReport.Equals(1) && aFN == AFN.请求实时数据)
+ {
+ //实时数据
+ dataInfos = Build3761SendData.BuildAmmeterReadRealTimeDataSendCmd(ammeter.FocusAddress, ammeter.MeteringCode, (ATypeOfDataItems)fn);
+ }
+ else
+ {
+ string methonCode = $"AFN{aFNStr}_Fn_Send";
+ //特殊表暂不处理
+ if (HandlerPacketBuilder != null && HandlerPacketBuilder.TryGetValue(methonCode
+ , out var handler))
+ {
+ dataInfos = handler(new TelemetryPacketRequest()
+ {
+ FocusAddress = ammeter.FocusAddress,
+ Fn = fn,
+ Pn = ammeter.MeteringCode
+ });
+ }
+ else
+ {
+ _logger.LogWarning($"{nameof(AmmerterCreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}采集项{tempItem}无效编码。");
+ continue;
+ }
+ }
+ //TODO:特殊表
+
+ if (dataInfos == null || dataInfos.Length <= 0)
+ {
+ _logger.LogWarning($"{nameof(AmmerterCreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}采集项{tempItem}未能正确获取报文。");
+ continue;
+ }
+
+ var evenMessageInfo = new ScheduledMeterReadingIssuedEventMessage
+ {
+ MessageHexString = Convert.ToHexString(dataInfos),
+ DeviceNo = ammeter.FocusAddress,
+ MessageId = NewId.NextGuid().ToString(),
+ TimeDensity = timeDensity,
+ WasSuccessful = false,
+ CreationTime = currentTime,
+ };
+ keyValuePairs.TryAdd($"{ammeter.ID}_{tempItem}", evenMessageInfo);
+ }
+ await FreeRedisProvider.Instance.HSetAsync(redisCacheKey, keyValuePairs);
+ }
+ }
}
#endregion
@@ -307,7 +700,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
continue;
}
- var redisCacheKey = $"{string.Format(FreeRedisConst.CacheWatermeterInfoKey, SystemTypeConst.Energy, itemTimeDensity.Key)}{item.Key}";
+ var redisCacheKey = $"{string.Format(FreeRedisConst.CacheMeterInfoKey, SystemType, MeterTypeEnum.WaterMeter, itemTimeDensity.Key)}{item.Key}";
Dictionary keyValuePairs = new Dictionary();
foreach (var subItem in item)
{
@@ -316,6 +709,16 @@ namespace JiShe.CollectBus.ScheduledMeterReading
}
await FreeRedisProvider.Instance.HSetAsync(redisCacheKey, keyValuePairs);
}
+
+ //在缓存表信息数据的时候,新增下一个时间的自动处理任务,1分钟后执行
+ TasksToBeIssueModel nextTask = new TasksToBeIssueModel()
+ {
+ TimeDensity = itemTimeDensity.Key,
+ NextTask = DateTime.Now.AddMinutes(1)
+ };
+
+ var taskRedisCacheKey = string.Format(FreeRedisConst.CacheTasksToBeIssuedKey, SystemType, MeterTypeEnum.WaterMeter, itemTimeDensity.Key);
+ await FreeRedisProvider.Instance.SetAsync(taskRedisCacheKey, nextTask);
}
_logger.LogInformation($"{nameof(InitAmmeterCacheData)} 初始化水表缓存数据完成");
}
@@ -327,76 +730,160 @@ namespace JiShe.CollectBus.ScheduledMeterReading
public virtual async Task WatermeterScheduledMeterOneMinuteReading()
{
//获取缓存中的水表信息
- var redisKeyList = $"{string.Format(FreeRedisConst.CacheWatermeterInfoKey, SystemTypeConst.Energy, 1)}*";
+ int timeDensity = 5;
+ var redisKeyList = $"{string.Format(FreeRedisConst.CacheTelemetryPacketInfoKey, SystemType, MeterTypeEnum.WaterMeter, timeDensity)}*";
var oneMinutekeyList = await FreeRedisProvider.Instance.KeysAsync(redisKeyList);
if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0)
{
- _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集水表据处理时没有获取到缓存信息,-101");
+ _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-101");
return;
}
- // 解析结果(结果为嵌套数组)
- Dictionary> meterInfos = await GetMeterCacheData(oneMinutekeyList, 1);
- if (meterInfos == null || meterInfos.Count <= 0)
+ //获取下发任务缓存数据
+ Dictionary> meterTaskInfos = await GetMeterRedisCacheData(oneMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.WaterMeter).ToString());
+ if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
{
- _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集水表数据处理时没有获取到缓存信息,-102");
+ _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-102");
return;
}
- _logger.LogInformation($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 1分钟采集水表数据处理完成");
+ List meterTaskInfosList = new List();
+
+ //将取出的缓存任务数据发送到Kafka消息队列中
+ foreach (var focusItem in meterTaskInfos)
+ {
+ foreach (var ammerterItem in focusItem.Value)
+ {
+ await _capBus.PublishAsync(ProtocolConst.WatermeterSubscriberWorkerOneMinuteIssuedEventName, ammerterItem.Value);
+ meterTaskInfosList.Add(ammerterItem.Value);
+ }
+ }
+ if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
+ {
+ await _meterReadingIssuedRepository.InsertManyAsync(meterTaskInfosList);
+ }
+
+ //缓存下一个时间的任务
+ TasksToBeIssueModel nextTask = new TasksToBeIssueModel()
+ {
+ TimeDensity = timeDensity,
+ NextTask = DateTime.Now.AddMinutes(timeDensity)
+ };
+
+ var redisCacheKey = string.Format(FreeRedisConst.CacheTasksToBeIssuedKey, SystemType, MeterTypeEnum.WaterMeter, timeDensity);
+ await FreeRedisProvider.Instance.SetAsync(redisCacheKey, nextTask);
+
+
+ _logger.LogInformation($"{nameof(WatermeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理完成");
}
///
- /// 5分钟采集电表数据
+ /// 5分钟采集水表数据
///
///
public virtual async Task WatermeterScheduledMeterFiveMinuteReading()
{
- //获取缓存中的水表信息
- var redisKeyList = $"{string.Format(FreeRedisConst.CacheWatermeterInfoKey, SystemTypeConst.Energy, 5)}*";
+ //获取缓存中的电表信息
+ int timeDensity = 5;
+ var redisKeyList = $"{string.Format(FreeRedisConst.CacheTelemetryPacketInfoKey, SystemType, MeterTypeEnum.WaterMeter, timeDensity)}*";
var oneMinutekeyList = await FreeRedisProvider.Instance.KeysAsync(redisKeyList);
if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0)
{
- _logger.LogError($"{nameof(WatermeterScheduledMeterFiveMinuteReading)} 5分钟采集水表据处理时没有获取到缓存信息,-101");
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-101");
return;
}
- // 解析结果(结果为嵌套数组)
- Dictionary> meterInfos = await GetMeterCacheData(oneMinutekeyList, 5);
- if (meterInfos == null || meterInfos.Count <= 0)
+ //获取下发任务缓存数据
+ Dictionary> meterTaskInfos = await GetMeterRedisCacheData(oneMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.WaterMeter).ToString());
+ if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
{
- _logger.LogError($"{nameof(WatermeterScheduledMeterFiveMinuteReading)} 5分钟采集水表数据处理时没有获取到缓存信息,-102");
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-102");
return;
}
- _logger.LogInformation($"{nameof(WatermeterScheduledMeterFiveMinuteReading)} 5分钟采集水表数据处理完成");
+ List meterTaskInfosList = new List();
+
+ //将取出的缓存任务数据发送到Kafka消息队列中
+ foreach (var focusItem in meterTaskInfos)
+ {
+ foreach (var ammerterItem in focusItem.Value)
+ {
+ await _capBus.PublishAsync(ProtocolConst.WatermeterSubscriberWorkerFiveMinuteIssuedEventName, ammerterItem.Value);
+ meterTaskInfosList.Add(ammerterItem.Value);
+ }
+ }
+ if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
+ {
+ await _meterReadingIssuedRepository.InsertManyAsync(meterTaskInfosList);
+ }
+
+ //缓存下一个时间的任务
+ TasksToBeIssueModel nextTask = new TasksToBeIssueModel()
+ {
+ TimeDensity = timeDensity,
+ NextTask = DateTime.Now.AddMinutes(timeDensity)
+ };
+
+ var redisCacheKey = string.Format(FreeRedisConst.CacheTasksToBeIssuedKey, SystemType, MeterTypeEnum.WaterMeter, timeDensity);
+ await FreeRedisProvider.Instance.SetAsync(redisCacheKey, nextTask);
+
+
+ _logger.LogInformation($"{nameof(WatermeterScheduledMeterFiveMinuteReading)} {timeDensity}分钟采集水表数据处理完成");
}
///
- /// 15分钟采集电表数据
+ /// 15分钟采集水表数据
///
///
public virtual async Task WatermeterScheduledMeterFifteenMinuteReading()
{
- //获取缓存中的水表信息
- var redisKeyList = $"{string.Format(FreeRedisConst.CacheWatermeterInfoKey, SystemTypeConst.Energy, 15)}*";
+ //获取缓存中的电表信息
+ int timeDensity = 15;
+ var redisKeyList = $"{string.Format(FreeRedisConst.CacheTelemetryPacketInfoKey, SystemType, MeterTypeEnum.WaterMeter, timeDensity)}*";
var oneMinutekeyList = await FreeRedisProvider.Instance.KeysAsync(redisKeyList);
if (oneMinutekeyList == null || oneMinutekeyList.Length <= 0)
{
- _logger.LogError($"{nameof(WatermeterScheduledMeterFifteenMinuteReading)} 15分钟采集水表据处理时没有获取到缓存信息,-101");
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-101");
return;
}
- // 解析结果(结果为嵌套数组)
- Dictionary> meterInfos = await GetMeterCacheData(oneMinutekeyList, 15);
- if (meterInfos == null || meterInfos.Count <= 0)
+ //获取下发任务缓存数据
+ Dictionary> meterTaskInfos = await GetMeterRedisCacheData(oneMinutekeyList, timeDensity.ToString(), ((int)MeterTypeEnum.WaterMeter).ToString());
+ if (meterTaskInfos == null || meterTaskInfos.Count <= 0)
{
- _logger.LogError($"{nameof(WatermeterScheduledMeterFifteenMinuteReading)} 15分钟采集水表数据处理时没有获取到缓存信息,-102");
+ _logger.LogError($"{nameof(AmmeterScheduledMeterOneMinuteReading)} {timeDensity}分钟采集水表数据处理时没有获取到缓存信息,-102");
return;
}
- _logger.LogInformation($"{nameof(WatermeterScheduledMeterFifteenMinuteReading)} 15分钟采集水表数据处理完成");
+ List meterTaskInfosList = new List();
+
+ //将取出的缓存任务数据发送到Kafka消息队列中
+ foreach (var focusItem in meterTaskInfos)
+ {
+ foreach (var ammerterItem in focusItem.Value)
+ {
+ await _capBus.PublishAsync(ProtocolConst.WatermeterSubscriberWorkerFifteenMinuteIssuedEventName, ammerterItem.Value);
+ meterTaskInfosList.Add(ammerterItem.Value);
+ }
+ }
+ if (meterTaskInfosList != null && meterTaskInfosList.Count > 0)
+ {
+ await _meterReadingIssuedRepository.InsertManyAsync(meterTaskInfosList);
+ }
+
+ //缓存下一个时间的任务
+ TasksToBeIssueModel nextTask = new TasksToBeIssueModel()
+ {
+ TimeDensity = timeDensity,
+ NextTask = DateTime.Now.AddMinutes(timeDensity)
+ };
+
+ var redisCacheKey = string.Format(FreeRedisConst.CacheTasksToBeIssuedKey, SystemType, MeterTypeEnum.WaterMeter, timeDensity);
+ await FreeRedisProvider.Instance.SetAsync(redisCacheKey, nextTask);
+
+
+ _logger.LogInformation($"{nameof(WatermeterScheduledMeterFiveMinuteReading)} {timeDensity}分钟采集水表数据处理完成");
}
#endregion
@@ -407,9 +894,10 @@ namespace JiShe.CollectBus.ScheduledMeterReading
///
/// 表信息数据对象
/// 采集频率对应的缓存Key集合
- /// 采集频率,1分钟、5分钟、15分钟
+ /// 采集频率,1分钟、5分钟、15分钟
+ /// 表计类型
///
- private async Task>> GetMeterCacheData(string[] redisKeys, int minute)
+ private async Task>> GetMeterRedisCacheData(string[] redisKeys, string timeDensity, string meterType) where T : class
{
//通过lua脚本一次性获取所有缓存内容
var luaScript = @"
@@ -419,22 +907,22 @@ namespace JiShe.CollectBus.ScheduledMeterReading
results[i] = {key, data}
end
return results";
- var oneMinuteAmmerterResult = await FreeRedisProvider.Instance.EvalAsync(luaScript, redisKeys); //传递 KEYS
- if (oneMinuteAmmerterResult == null)
+ var merterResult = await FreeRedisProvider.Instance.EvalAsync(luaScript, redisKeys); //传递 KEYS
+ if (merterResult == null)
{
- _logger.LogError($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 定时任务采集表数据处理时没有获取到缓存信息,-102");
+ _logger.LogError($"{nameof(GetMeterRedisCacheData)} 定时任务采集表数据处理时没有获取到缓存信息,-102");
return null;
}
// 解析结果(结果为嵌套数组)
var meterInfos = new Dictionary>(); ;
- if (oneMinuteAmmerterResult is object[] arr)
+ if (merterResult is object[] arr)
{
foreach (object[] item in arr)
{
string key = (string)item[0];//集中器地址对应的Redis缓存Key
object[] fieldsAndValues = (object[])item[1];//缓存Key对应的Hash表数据集合
- var redisCacheKey = $"{string.Format(FreeRedisConst.CacheAmmeterInfoKey, SystemTypeConst.Energy, minute)}";
+ var redisCacheKey = $"{string.Format(FreeRedisConst.CacheMeterInfoKey, SystemType, meterType, timeDensity)}";
string focusAddress = key.Replace(redisCacheKey, "");//集中器地址
var meterHashs = new Dictionary();
@@ -443,7 +931,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
string meterld = (string)fieldsAndValues[i];//表ID
string meterStr = (string)fieldsAndValues[i + 1];//表详情数据
- T meterInfo = default;
+ T meterInfo = default!;
if (!string.IsNullOrWhiteSpace(meterStr))
{
meterInfo = meterStr.Deserialize()!;
@@ -454,7 +942,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
}
else
{
- _logger.LogInformation($"{nameof(WatermeterScheduledMeterOneMinuteReading)} 定时任务采集表数据处理时集中器缓存{key}数据的{meterld}处理异常");
+ _logger.LogInformation($"{nameof(GetMeterRedisCacheData)} 定时任务采集表数据处理时集中器缓存{key}数据的{meterld}处理异常");
}
}
meterInfos[focusAddress] = meterHashs;
@@ -463,225 +951,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading
return meterInfos;
}
-
- ///
- /// 电表采集任务指令创建
- ///
- /// 采集频率订阅主题
- /// 集中器数据分组
- ///
- private async Task AmmerterScheduledMeterReadingIssued(string eventName, Dictionary> focusGroup)
- {
- if (string.IsNullOrWhiteSpace(eventName) || focusGroup == null || focusGroup.Count <= 0)
- {
- _logger.LogError($"{nameof(AmmerterScheduledMeterReadingIssued)} 电表数据采集指令生成失败,参数异常,-101");
- return;
- }
- try
- {
- //将采集器编号的hash值取模分组
- const int TotalShards = 1024;
- var focusHashGroups = new Dictionary>>();
-
- foreach (var (collectorId, ammetersDictionary) in focusGroup)
- {
- if (string.IsNullOrWhiteSpace(collectorId))
- {
- _logger.LogError($"{nameof(AmmerterScheduledMeterReadingIssued)} 集中器信息分组取模失败,无效Key -102");
- continue;
- }
-
- // 计算哈希分组ID
- int hashGroupId = Math.Abs(collectorId.GetHashCode() % TotalShards);
-
- // 获取或创建分组(避免重复查找)
- if (!focusHashGroups.TryGetValue(hashGroupId, out var group))
- {
- group = new Dictionary>();
- focusHashGroups[hashGroupId] = group;
- }
-
- // 将当前集中器数据加入分组
- group[collectorId] = ammetersDictionary;
- }
-
- if (focusHashGroups == null)
- {
- _logger.LogError($"{nameof(AmmerterScheduledMeterReadingIssued)} 集中器信息分组取模失败 -103");
- return;
- }
-
- //根据分组创建线程批处理集中器
- foreach (var group in focusHashGroups)
- {
- //TODO _meterReadingIssuedRepository 需要优化
- //_ = Task.Run(async () => { await CreatePublishTask(eventName, group.Value); });
- await CreatePublishTask(eventName, group.Value);
- }
-
- //await Task.CompletedTask;
- }
- catch (Exception)
- {
-
- throw;
- }
- }
-
- ///
- /// 创建发布任务
- ///
- ///
- ///
- ///
- private async Task CreatePublishTask(string eventName, Dictionary> focusGroup)
- {
- foreach (var focusInfo in focusGroup)
- {
- foreach (var ammeterInfo in focusInfo.Value)
- {
- var ammeter = ammeterInfo.Value;
-
- if (string.IsNullOrWhiteSpace(ammeter.ItemCodes))
- {
- _logger.LogError($"{nameof(CreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}数据采集指令生成失败,采集项为空,-101");
- continue;
- }
-
- //载波的不处理
- if (ammeter.MeteringPort == (int)MeterLinkProtocolEnum.Carrierwave)
- {
- _logger.LogError($"{nameof(CreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}数据采集指令生成失败,载波不处理,-102");
- continue;
- }
-
- if (ammeter.State.Equals(2))
- {
- _logger.LogWarning($"{nameof(CreatePublishTask)} {ammeter.Name} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}状态为禁用,不处理");
- continue;
- }
-
- ////排除1天未在线的集中器生成指令 或 排除集中器配置为自动上报的集中器
- //if (!IsGennerateCmd(ammeter.LastTime, -1))
- //{
- // _logger.LogInformation($"{nameof(CreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name},采集时间:{ammeter.LastTime},已超过1天未在线,不生成指令");
- // continue;
- //}
-
- if (string.IsNullOrWhiteSpace(ammeter.AreaCode))
- {
- _logger.LogError($"{nameof(CreatePublishTask)} 表ID:{ammeter.ID},集中器通信区号为空");
- continue;
- }
- if (string.IsNullOrWhiteSpace(ammeter.Address))
- {
- _logger.LogError($"{nameof(CreatePublishTask)} 表ID:{ammeter.ID},集中器通信地址为空");
- continue;
- }
- if (Convert.ToInt32(ammeter.Address) > 65535)
- {
- _logger.LogError($"{nameof(CreatePublishTask)} 表ID:{ammeter.ID},集中器通信地址无效,确保大于65535");
- continue;
- }
- if (ammeter.MeteringCode <= 0 || ammeter.MeteringCode > 2033)
- {
- _logger.LogError($"{nameof(CreatePublishTask)} 表ID:{ammeter.ID},非有效测量点号({ammeter.MeteringCode})");
- continue;
- }
-
- List tempCodes = ammeter.ItemCodes.Deserialize>()!;
-
- //TODO:自动上报数据只主动采集1类数据。
- if (ammeter.AutomaticReport.Equals(1))
- {
- var tempSubCodes = new List();
- if (tempCodes.Contains("0C_49"))
- {
- tempSubCodes.Add("0C_49");
- }
-
- if (tempSubCodes.Contains("0C_149"))
- {
- tempSubCodes.Add("0C_149");
- }
-
- if (ammeter.ItemCodes.Contains("10_97"))
- {
- tempSubCodes.Add("10_97");
- }
-
- if (tempSubCodes == null || tempSubCodes.Count <= 0)
- {
- _logger.LogInformation($"{nameof(CreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}自动上报数据主动采集1类数据时数据类型为空");
- continue;
- }
- else
- {
- tempCodes = tempSubCodes;
- }
- }
-
- List evenMessageInfoList = new List();
- foreach (var tempItem in tempCodes)
- {
- //排除已发送日冻结和月冻结采集项配置
- if (DayFreezeCodes.Contains(tempItem))
- {
- continue;
- }
-
- if (MonthFreezeCodes.Contains(tempItem))
- {
- continue;
- }
-
- var itemCodeArr = tempItem.Split('_');
- var aFN = (AFN)itemCodeArr[0].HexToDec();
- var fn = int.Parse(itemCodeArr[1]);
- byte[] dataInfos = null;
- if (ammeter.AutomaticReport.Equals(1) && aFN == AFN.请求实时数据)
- {
- //实时数据
- dataInfos = Build3761SendData.BuildAmmeterReadRealTimeDataSendCmd(ammeter.FocusAddress, ammeter.MeteringCode, (ATypeOfDataItems)fn);
- }
- else
- {
- //特殊表暂不处理
- if (TelemetryPacketBuilder.AFNHandlers.TryGetValue(tempItem, out var handler))
- {
- dataInfos = handler(ammeter.FocusAddress, fn, ammeter.MeteringCode);
- }
- else
- {
- _logger.LogWarning($"{nameof(CreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}采集项{tempItem}无效编码。");
- continue;
- }
- }
- //TODO:特殊表
-
- if (dataInfos == null || dataInfos.Length <= 0)
- {
- _logger.LogWarning($"{nameof(CreatePublishTask)} 集中器{ammeter.FocusAddress}的电表{ammeter.Name}采集项{tempItem}未能正确获取报文。");
- continue;
- }
-
- var evenMessageInfo = new ScheduledMeterReadingIssuedEventMessage
- {
- Message = dataInfos!,
- DeviceNo = ammeter.FocusAddress,
- MessageId = NewId.NextGuid().ToString(),
- TimeDensity = eventName,
- WasSuccessful = false,
- };
- await _capBus.PublishAsync(eventName, evenMessageInfo);
- evenMessageInfoList.Add(evenMessageInfo);
- }
-
- await _meterReadingIssuedRepository.InsertManyAsync(evenMessageInfoList);
- }
- }
- }
-
+
///
/// 指定时间对比当前时间
///
diff --git a/src/JiShe.CollectBus.Application/Subscribers/WorkerSubscriberAppService.cs b/src/JiShe.CollectBus.Application/Subscribers/WorkerSubscriberAppService.cs
index 8d0d154..50ed9e0 100644
--- a/src/JiShe.CollectBus.Application/Subscribers/WorkerSubscriberAppService.cs
+++ b/src/JiShe.CollectBus.Application/Subscribers/WorkerSubscriberAppService.cs
@@ -34,6 +34,7 @@ namespace JiShe.CollectBus.Subscribers
///
/// The logger.
/// The TCP service.
+ /// The Device pepository.
/// The service provider.
public WorkerSubscriberAppService(ILogger logger,
ITcpService tcpService,
@@ -69,7 +70,7 @@ namespace JiShe.CollectBus.Subscribers
var device = await _deviceRepository.FindAsync(a => a.Number == receivedMessage.DeviceNo);
if (device != null)
{
- await _tcpService.SendAsync(device.ClientId, receivedMessage.Message);
+ await _tcpService.SendAsync(device.ClientId, Convert.FromHexString(receivedMessage.MessageHexString));
}
}
@@ -96,7 +97,7 @@ namespace JiShe.CollectBus.Subscribers
var device = await _deviceRepository.FindAsync(a => a.Number == receivedMessage.DeviceNo);
if (device != null)
{
- await _tcpService.SendAsync(device.ClientId, receivedMessage.Message);
+ await _tcpService.SendAsync(device.ClientId, Convert.FromHexString(receivedMessage.MessageHexString));
}
}
@@ -123,7 +124,7 @@ namespace JiShe.CollectBus.Subscribers
var device = await _deviceRepository.FindAsync(a => a.Number == receivedMessage.DeviceNo);
if (device != null)
{
- await _tcpService.SendAsync(device.ClientId, receivedMessage.Message);
+ await _tcpService.SendAsync(device.ClientId, Convert.FromHexString(receivedMessage.MessageHexString));
}
}
@@ -152,7 +153,7 @@ namespace JiShe.CollectBus.Subscribers
var device = await _deviceRepository.FindAsync(a => a.Number == receivedMessage.DeviceNo);
if (device != null)
{
- await _tcpService.SendAsync(device.ClientId, receivedMessage.Message);
+ await _tcpService.SendAsync(device.ClientId, Convert.FromHexString(receivedMessage.MessageHexString));
}
}
@@ -179,7 +180,7 @@ namespace JiShe.CollectBus.Subscribers
var device = await _deviceRepository.FindAsync(a => a.Number == receivedMessage.DeviceNo);
if (device != null)
{
- await _tcpService.SendAsync(device.ClientId, receivedMessage.Message);
+ await _tcpService.SendAsync(device.ClientId, Convert.FromHexString(receivedMessage.MessageHexString));
}
}
@@ -206,7 +207,7 @@ namespace JiShe.CollectBus.Subscribers
var device = await _deviceRepository.FindAsync(a => a.Number == receivedMessage.DeviceNo);
if (device != null)
{
- await _tcpService.SendAsync(device.ClientId, receivedMessage.Message);
+ await _tcpService.SendAsync(device.ClientId, Convert.FromHexString(receivedMessage.MessageHexString));
}
}
}
diff --git a/src/JiShe.CollectBus.Application/Workers/CreateToBeIssueTaskWorker.cs b/src/JiShe.CollectBus.Application/Workers/CreateToBeIssueTaskWorker.cs
new file mode 100644
index 0000000..c3b4886
--- /dev/null
+++ b/src/JiShe.CollectBus.Application/Workers/CreateToBeIssueTaskWorker.cs
@@ -0,0 +1,42 @@
+using System.Threading;
+using System.Threading.Tasks;
+using Hangfire;
+using JiShe.CollectBus.Common.Consts;
+using JiShe.CollectBus.ScheduledMeterReading;
+using Microsoft.Extensions.Logging;
+using Volo.Abp.BackgroundWorkers.Hangfire;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Uow;
+
+namespace JiShe.CollectBus.Workers
+{
+ ///
+ /// 构建待处理的下发指令任务处理
+ ///
+ public class CreateToBeIssueTaskWorker : HangfireBackgroundWorkerBase, ITransientDependency, ICollectWorker
+ {
+ private readonly ILogger _logger;
+ private readonly IScheduledMeterReadingService _scheduledMeterReadingService;
+
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ /// The logger.
+ /// 定时任务
+ public CreateToBeIssueTaskWorker(ILogger logger, IScheduledMeterReadingService scheduledMeterReadingService)
+ {
+ _logger = logger;
+ RecurringJobId = nameof(CreateToBeIssueTaskWorker);
+ CronExpression = $"*/{1} * * * *"; ;
+ this._scheduledMeterReadingService = scheduledMeterReadingService;
+ }
+
+
+ public override async Task DoWorkAsync(CancellationToken cancellationToken = new CancellationToken())
+ {
+ _logger.LogWarning($"构建待处理的下发指令任务处理开始");
+ //await _scheduledMeterReadingService.CreateToBeIssueTasks();
+ _logger.LogWarning($"构建待处理的下发指令任务处理结束");
+ }
+ }
+}
diff --git a/src/JiShe.CollectBus.Application/Workers/SubscriberFifteenMinuteWorker.cs b/src/JiShe.CollectBus.Application/Workers/SubscriberFifteenMinuteWorker.cs
index 90c032f..9be418a 100644
--- a/src/JiShe.CollectBus.Application/Workers/SubscriberFifteenMinuteWorker.cs
+++ b/src/JiShe.CollectBus.Application/Workers/SubscriberFifteenMinuteWorker.cs
@@ -26,14 +26,18 @@ namespace JiShe.CollectBus.Workers
{
_logger = logger;
RecurringJobId = nameof(SubscriberFifteenMinuteWorker);
- CronExpression = Cron.Hourly(15);
+ CronExpression = $"*/{15} * * * *";
this._scheduledMeterReadingService = scheduledMeterReadingService;
}
public override async Task DoWorkAsync(CancellationToken cancellationToken = new CancellationToken())
{
- await _scheduledMeterReadingService.AmmeterScheduledMeterFifteenMinuteReading();
+ _logger.LogWarning($"15分钟采集数据开始");
+ //await _scheduledMeterReadingService.AmmeterScheduledMeterFifteenMinuteReading();
+ //await _scheduledMeterReadingService.WatermeterScheduledMeterFifteenMinuteReading();
+
+ _logger.LogWarning($"15分钟采集数据结束");
//using (var uow = LazyServiceProvider.LazyGetRequiredService().Begin())
//{
// Logger.LogInformation("Executed MyLogWorker..!");
diff --git a/src/JiShe.CollectBus.Application/Workers/SubscriberFiveMinuteWorker.cs b/src/JiShe.CollectBus.Application/Workers/SubscriberFiveMinuteWorker.cs
index f20cf86..94e323d 100644
--- a/src/JiShe.CollectBus.Application/Workers/SubscriberFiveMinuteWorker.cs
+++ b/src/JiShe.CollectBus.Application/Workers/SubscriberFiveMinuteWorker.cs
@@ -18,7 +18,7 @@ namespace JiShe.CollectBus.Workers
private readonly IScheduledMeterReadingService _scheduledMeterReadingService;
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The logger.
/// 定时任务
@@ -26,14 +26,18 @@ namespace JiShe.CollectBus.Workers
{
_logger = logger;
RecurringJobId = nameof(SubscriberFiveMinuteWorker);
- CronExpression = Cron.Hourly(15);
+ CronExpression = $"*/{5} * * * *";
this._scheduledMeterReadingService = scheduledMeterReadingService;
}
public override async Task DoWorkAsync(CancellationToken cancellationToken = new CancellationToken())
{
- await _scheduledMeterReadingService.AmmeterScheduledMeterFifteenMinuteReading();
+ _logger.LogWarning($"5分钟采集数据开始");
+ //await _scheduledMeterReadingService.AmmeterScheduledMeterFiveMinuteReading();
+ //await _scheduledMeterReadingService.WatermeterScheduledMeterFiveMinuteReading();
+
+ _logger.LogWarning($"5分钟采集数据结束");
}
}
}
diff --git a/src/JiShe.CollectBus.Application/Workers/SubscriberOneMinuteWorker.cs b/src/JiShe.CollectBus.Application/Workers/SubscriberOneMinuteWorker.cs
index 2132cdf..d7c8325 100644
--- a/src/JiShe.CollectBus.Application/Workers/SubscriberOneMinuteWorker.cs
+++ b/src/JiShe.CollectBus.Application/Workers/SubscriberOneMinuteWorker.cs
@@ -18,7 +18,7 @@ namespace JiShe.CollectBus.Workers
private readonly IScheduledMeterReadingService _scheduledMeterReadingService;
///
- /// Initializes a new instance of the class.
+ /// Initializes a new instance of the class.
///
/// The logger.
/// 定时任务
@@ -26,14 +26,19 @@ namespace JiShe.CollectBus.Workers
{
_logger = logger;
RecurringJobId = nameof(SubscriberOneMinuteWorker);
- CronExpression = Cron.Hourly(15);
+ CronExpression = $"*/{1} * * * *";
this._scheduledMeterReadingService = scheduledMeterReadingService;
}
public override async Task DoWorkAsync(CancellationToken cancellationToken = new CancellationToken())
{
- await _scheduledMeterReadingService.AmmeterScheduledMeterFifteenMinuteReading();
+ _logger.LogWarning($"1分钟采集数据开始");
+ //await _scheduledMeterReadingService.AmmeterScheduledMeterOneMinuteReading();
+
+ //await _scheduledMeterReadingService.WatermeterScheduledMeterOneMinuteReading();
+
+ _logger.LogWarning($"1分钟采集数据结束");
}
}
}
diff --git a/src/JiShe.CollectBus.Common/BuildSendDatas/TasksToBeIssueModel.cs b/src/JiShe.CollectBus.Common/BuildSendDatas/TasksToBeIssueModel.cs
new file mode 100644
index 0000000..67d9abe
--- /dev/null
+++ b/src/JiShe.CollectBus.Common/BuildSendDatas/TasksToBeIssueModel.cs
@@ -0,0 +1,24 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Common.BuildSendDatas
+{
+ ///
+ /// 待下发的指令生产任务数据
+ ///
+ public class TasksToBeIssueModel
+ {
+ ///
+ /// 下个任务时间
+ ///
+ public DateTime NextTask { get; set; }
+
+ ///
+ /// 采集时间间隔,1分钟,5分钟,15分钟
+ ///
+ public int TimeDensity { get; set; }
+ }
+}
diff --git a/src/JiShe.CollectBus.Common/BuildSendDatas/TelemetryPacketBuilder.cs b/src/JiShe.CollectBus.Common/BuildSendDatas/TelemetryPacketBuilder.cs
index 9f5c3ec..8ad2a39 100644
--- a/src/JiShe.CollectBus.Common/BuildSendDatas/TelemetryPacketBuilder.cs
+++ b/src/JiShe.CollectBus.Common/BuildSendDatas/TelemetryPacketBuilder.cs
@@ -12,22 +12,22 @@ using System.Threading.Tasks;
namespace JiShe.CollectBus.Common.BuildSendDatas
{
///
- /// 构建下发报文
+ /// 构建下发报文,只适用与定时抄读
///
public static class TelemetryPacketBuilder
{
///
/// 构建报文的委托
///
- ///
- ///
- ///
- public delegate byte[] AFNDelegate(string address, int fn, int pn = 0);
+ ///
+ ///
+ ///
+ public delegate byte[] AFNDelegate(TelemetryPacketRequest request);
///
/// 编码与方法的映射表
///
- public static readonly Dictionary AFNHandlers = new();
+ public static readonly Dictionary AFNHandlersDictionary = new();
static TelemetryPacketBuilder()
{
@@ -35,56 +35,33 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
var methods = typeof(TelemetryPacketBuilder).GetMethods(BindingFlags.Static | BindingFlags.Public);
foreach (var method in methods)
{
- if (method.Name.StartsWith("AFN") && method.Name.EndsWith("_Send"))
+ if (method.Name.StartsWith("AFN") && method.Name.EndsWith("_Fn_Send"))
{
- // 提取编码部分(例如 "AFN0D_F184_Send" -> "0D_184")
- string code = method.Name[3..^5].Replace("F", ""); // 移除前缀和后缀,替换F为_
+ string code = method.Name;
var delegateInstance = (AFNDelegate)Delegate.CreateDelegate(typeof(AFNDelegate), method);
- AFNHandlers[code] = delegateInstance;
+ AFNHandlersDictionary[code] = delegateInstance;
}
}
}
#region AFN_00H 确认∕否认
- public static byte[] AFN00_F1_Send(string address,int fn,int pn = 0)
+ public static byte[] AFN00_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
AFN = AFN.确认或否认,
FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
+ CON = CON.需要对该帧进行确认,
PRSEQ = 0,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN00_F3_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.确认或否认,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
return bytes;
@@ -93,23 +70,23 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
#region AFN_01H 复位命令
- public static byte[] AFN01_F1_Send(string address, int fn, int pn = 0)
+ public static byte[] AFN01_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
AFN = AFN.复位,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ FunCode = (int)CMasterStationFunCode.复位命令,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
+ CON = CON.需要对该帧进行确认,
+ PRSEQ = 10,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
return bytes;
@@ -118,13 +95,13 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
#region AFN_02H 链路接口检测
- public static byte[] AFN02_F2_Send(string address, int fn, int pn = 0)
+ public static byte[] AFN02_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
AFN = AFN.链路接口检测,
FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
@@ -132,9 +109,9 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
CON = CON.不需要对该帧进行确认,
PRSEQ = 0,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
return bytes;
@@ -142,113 +119,48 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
#endregion
#region AFN_04H 设置参数
- public static byte[] AFN04_F3_Send(string address, int fn, int pn = 0)
+ public static byte[] AFN04_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ AFN = AFN.设置参数,
+ FunCode = (int)CMasterStationFunCode.请求1级数据,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
+ CON = CON.需要对该帧进行确认,
+ PRSEQ = 10,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
return bytes;
}
- public static byte[] AFN04_F10_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN04_F66_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN04_F88_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
#endregion
#region AFN_05H 控制命令
- public static byte[] AFN05_F31_Send(string address, int fn, int pn = 0)
+ public static byte[] AFN05_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ AFN = AFN.控制命令,
+ FunCode = (int)CMasterStationFunCode.请求1级数据,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
+ CON = CON.需要对该帧进行确认,
+ PRSEQ = 10,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
return bytes;
@@ -256,13 +168,13 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
#endregion
#region AFN_09H 请求终端配置及信息
- public static byte[] AFN09_F1_Send(string address, int fn, int pn = 0)
+ public static byte[] AFN09_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
- AFN = AFN.链路接口检测,
+ AFN = AFN.请求终端配置,
FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
@@ -270,45 +182,24 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
CON = CON.不需要对该帧进行确认,
PRSEQ = 0,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
return bytes;
}
- public static byte[] AFN09_F9_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
#endregion
#region AFN_0AH 查询参数
- public static byte[] AFN0A_F10_Send(string address, int fn, int pn = 0)
+ public static byte[] AFN0A_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
- AFN = AFN.链路接口检测,
+ AFN = AFN.查询参数,
FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
@@ -316,53 +207,9 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
CON = CON.不需要对该帧进行确认,
PRSEQ = 0,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0A_F66_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0A_F88_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
return bytes;
@@ -370,1450 +217,47 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
#endregion
#region AFN_0CH 请求一类数据
- public static byte[] AFN0C_F2_Send(string address, int fn, int pn = 0)
+ public static byte[] AFN0C_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
- AFN = AFN.链路接口检测,
+ AFN = AFN.请求实时数据,
FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
FIRFIN = FIRFIN.单帧,
CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
+ PRSEQ = 2,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
return bytes;
}
-
- public static byte[] AFN0C_F25_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0C_F33_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0C_F49_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0C_F129_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0C_F130_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0C_F131_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0C_F132_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0C_F145_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0C_F149_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0C_F188_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
#endregion
#region AFN_0DH 请求二类数据
- public static byte[] AFN0D_F3_Send(string address, int fn, int pn = 0)
+ public static byte[] AFN0D_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
- AFN = AFN.链路接口检测,
+ AFN = AFN.请求历史数据,
FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
FIRFIN = FIRFIN.单帧,
CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
+ PRSEQ = 2,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F4_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F11_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F19_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F81_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F82_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F83_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F84_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F85_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F86_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F87_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
- public static byte[] AFN0D_F88_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F89_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F90_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F91_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F92_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F93_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F94_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F95_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
- public static byte[] AFN0D_F96_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
- public static byte[] AFN0D_F97_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F98_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F99_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F100_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F101_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F102_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F103_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F104_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F105_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
- public static byte[] AFN0D_F106_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F107_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F108_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F145_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F146_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F147_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F148_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F161_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F162_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
- public static byte[] AFN0D_F163_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F164_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F165_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F166_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F167_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F1618_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F177_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F178_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F179_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
- public static byte[] AFN0D_F180_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F181_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F182_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F183_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F184_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F190_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F193_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN0D_F195_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
return bytes;
@@ -1821,13 +265,13 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
#endregion
#region AFN10H 数据转发
- public static byte[] AFN10_F4_Send(string address, int fn, int pn = 0)
+ public static byte[] AFN10_Fn_Send(TelemetryPacketRequest request)
{
var reqParameter = new ReqParameter2()
{
- AFN = AFN.链路接口检测,
+ AFN = AFN.数据转发,
FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
+ A = request.FocusAddress,
Seq = new Seq()
{
TpV = TpV.附加信息域中无时间标签,
@@ -1835,230 +279,11 @@ namespace JiShe.CollectBus.Common.BuildSendDatas
CON = CON.不需要对该帧进行确认,
PRSEQ = 0,
},
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
+ MSA = Build3761SendData.GetMSA(request.FocusAddress),
+ Pn = request.Pn,
+ Fn = request.Fn
};
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN10_F94_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN10_F97_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
- public static byte[] AFN10_F101_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN10_F102_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN10_F103_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN10_F104_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN10_F105_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN10_F106_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN10_F107_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
- return bytes;
- }
-
- public static byte[] AFN10_F249_Send(string address, int fn, int pn = 0)
- {
- var reqParameter = new ReqParameter2()
- {
- AFN = AFN.链路接口检测,
- FunCode = (int)CMasterStationFunCode.请求2级数据,
- A = address,
- Seq = new Seq()
- {
- TpV = TpV.附加信息域中无时间标签,
- FIRFIN = FIRFIN.单帧,
- CON = CON.不需要对该帧进行确认,
- PRSEQ = 0,
- },
- MSA = Build3761SendData.GetMSA(address),
- Pn = pn,
- Fn = fn
- };
- var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter);
+ var bytes = Build3761SendData.BuildSendCommandBytes(reqParameter,request.DataUnit);
return bytes;
}
diff --git a/src/JiShe.CollectBus.Common/BuildSendDatas/TelemetryPacketRequest.cs b/src/JiShe.CollectBus.Common/BuildSendDatas/TelemetryPacketRequest.cs
new file mode 100644
index 0000000..d22f923
--- /dev/null
+++ b/src/JiShe.CollectBus.Common/BuildSendDatas/TelemetryPacketRequest.cs
@@ -0,0 +1,34 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace JiShe.CollectBus.Common.BuildSendDatas
+{
+ ///
+ /// 报文构建参数
+ ///
+ public class TelemetryPacketRequest
+ {
+ ///
+ /// 集中器地址
+ ///
+ public string FocusAddress { get; set; }
+
+ ///
+ /// 抄读功能码
+ ///
+ public int Fn { get; set; }
+
+ ///
+ /// 抄读计量点,也就是终端电表对应端口
+ ///
+ public int Pn { get; set; }
+
+ ///
+ /// 透明转发单元
+ ///
+ public List DataUnit { get; set; }
+ }
+}
diff --git a/src/JiShe.CollectBus.Common/Consts/FreeRedisConst.cs b/src/JiShe.CollectBus.Common/Consts/FreeRedisConst.cs
index 859e86e..12e9053 100644
--- a/src/JiShe.CollectBus.Common/Consts/FreeRedisConst.cs
+++ b/src/JiShe.CollectBus.Common/Consts/FreeRedisConst.cs
@@ -29,13 +29,18 @@ namespace JiShe.CollectBus.Common.Consts
public const string FifteenMinuteAcquisitionTimeInterval = $"Fifteen";
///
- /// 缓存电表信息
+ /// 缓存表计信息,{0}=>系统类型,{1}=>表计类别
///
- public const string CacheAmmeterInfoKey = $"{CacheBasicDirectoryKey}{"{0}"}:{"{1}"}:AmmeterInfo:";
+ public const string CacheMeterInfoKey = $"{CacheBasicDirectoryKey}{"{0}"}:MeterInfo:{"{1}"}:{"{2}"}:";
///
- /// 缓存水表信息
+ /// 缓存待下发的指令生产任务数据,{0}=>系统类型,{1}=>表计类别,{2}=>采集频率
///
- public const string CacheWatermeterInfoKey = $"{CacheBasicDirectoryKey}{"{0}"}:{"{1}"}:WatermeterInfo:";
+ public const string CacheTasksToBeIssuedKey = $"{CacheBasicDirectoryKey}{"{0}"}:TaskInfo:{"{1}"}:{"{2}"}";
+
+ ///
+ /// 缓存表计下发指令数据集,{0}=>系统类型,{1}=>表计类别,{2}=>采集频率
+ ///
+ public const string CacheTelemetryPacketInfoKey = $"{CacheBasicDirectoryKey}{"{0}"}:TelemetryPacket:{"{1}"}:{"{2}"}:";
}
}
diff --git a/src/JiShe.CollectBus.Domain/IotSystems/MessageIssueds/ScheduledMeterReadingIssuedEventMessage.cs b/src/JiShe.CollectBus.Domain/IotSystems/MessageIssueds/ScheduledMeterReadingIssuedEventMessage.cs
index cdab61a..ce3cc87 100644
--- a/src/JiShe.CollectBus.Domain/IotSystems/MessageIssueds/ScheduledMeterReadingIssuedEventMessage.cs
+++ b/src/JiShe.CollectBus.Domain/IotSystems/MessageIssueds/ScheduledMeterReadingIssuedEventMessage.cs
@@ -12,7 +12,7 @@ namespace JiShe.CollectBus.IotSystems.MessageIssueds
///
/// 消息内容
///
- public byte[] Message { get; set; }
+ public string MessageHexString { get; set; }
///
/// 集中器编号
@@ -33,5 +33,10 @@ namespace JiShe.CollectBus.IotSystems.MessageIssueds
/// 是否下发成功
///
public bool WasSuccessful { get; set; }
+
+ ///
+ /// 创建时间
+ ///
+ public DateTime CreationTime { get; set; }
}
}