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; } } }