diff --git a/YD_AllHeartRates.Api/Mqtt/MqttBackgroundService.cs b/YD_AllHeartRates.Api/Mqtt/MqttBackgroundService.cs index e3293cb..9e97da1 100644 --- a/YD_AllHeartRates.Api/Mqtt/MqttBackgroundService.cs +++ b/YD_AllHeartRates.Api/Mqtt/MqttBackgroundService.cs @@ -3,6 +3,7 @@ using Microsoft.EntityFrameworkCore; using MQTTnet; using MQTTnet.Client; using MQTTnet.Protocol; +using System.Collections.Concurrent; using System.Globalization; using System.Reflection.PortableExecutable; using System.Runtime.CompilerServices; @@ -108,41 +109,29 @@ namespace YD_AllHeartRates.Api.Mqtt await foreach (var batch in ReadBatchesAsync(stoppingToken)) { - var heartRateEntities = new List(); - var jumpRopeEntities = new List(); + var heartRateEntities = new ConcurrentBag(); + var jumpRopeEntities = new ConcurrentBag(); - foreach (var msg in batch) + Parallel.ForEach(batch, msg => { - if (string.IsNullOrWhiteSpace(msg.Payload)) continue; + if (string.IsNullOrWhiteSpace(msg.Payload)) return; - List? list = null; + BlePayload payload; try { - var trimmed = msg.Payload.TrimStart(); - - if (trimmed.StartsWith("{")) - { - var single = JsonSerializer.Deserialize(msg.Payload, _jsonOpt); - if (single != null) - list = new List { single }; - } - else if (trimmed.StartsWith("[")) - { - list = JsonSerializer.Deserialize>(msg.Payload, _jsonOpt); - } + payload = JsonSerializer.Deserialize(msg.Payload, _jsonOpt); + if (payload == null) return; } catch (JsonException ex) { _log.LogWarning(ex, "Payload 不是合法 JSON: {Json}", msg.Payload); - continue; + return; } - if (list is null || list.Count == 0) continue; + var heartRateList = payload.devices.Where(x => x.bs_name.Contains("GTY0")).ToList(); + var jumpRopeList = payload.devices.Where(x => x.bs_name.Contains("RS207")).ToList(); - var heartRateList = list.SelectMany(x => x.devices).Where(x => x.bs_name.Contains("GTY0")).ToList(); - var jumpRopeList = list.SelectMany(x => x.devices).Where(x => x.bs_name.Contains("RS207")).ToList(); - - var scoreTime = DateTime.ParseExact(list.Select(x => x.send_time).First(), "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); + var scoreTime = DateTime.ParseExact(payload.send_time, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); foreach (var ble in heartRateList) { @@ -291,7 +280,7 @@ namespace YD_AllHeartRates.Api.Mqtt //RedisHelper.SAdd(studentSetKey, student.StudentNo); } - } + }); // 心率每分钟保存一次 if ((DateTime.Now - _lastHeartRateSaveTime).TotalSeconds >= 60 && _pendingHeartRates.Any()) diff --git a/YD_AllHeartRates.Api/appsettings.json b/YD_AllHeartRates.Api/appsettings.json index 5948be5..ab124e3 100644 --- a/YD_AllHeartRates.Api/appsettings.json +++ b/YD_AllHeartRates.Api/appsettings.json @@ -43,6 +43,6 @@ "Host": "8.153.108.90", "Port": 1883, "Topic": "heartrates/topic", - "BatchSize": 1 + "BatchSize": 10 } } diff --git a/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.AssemblyInfo.cs b/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.AssemblyInfo.cs index 2d6f612..06fee2e 100644 --- a/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.AssemblyInfo.cs +++ b/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.AssemblyInfo.cs @@ -14,7 +14,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("YD_AllHeartRates.Api")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+e2e455beb818072bf47a3f72e7c28aee0d81f2f6")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ac45401a00234bcfe5b0bc7e4b43ab7a3e737f16")] [assembly: System.Reflection.AssemblyProductAttribute("YD_AllHeartRates.Api")] [assembly: System.Reflection.AssemblyTitleAttribute("YD_AllHeartRates.Api")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.AssemblyInfoInputs.cache b/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.AssemblyInfoInputs.cache index 4c45eb7..a836081 100644 --- a/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.AssemblyInfoInputs.cache +++ b/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.AssemblyInfoInputs.cache @@ -1 +1 @@ -24a647519bb5c818af84137d9f158bd3c8bb26dee151c991a4a8d9432822805b +2a88393a86ca30e91023931fadfc25c17abd0bd7e8685dbc1401c11194e83ca9 diff --git a/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.dll b/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.dll index ca19834..dc992dc 100644 Binary files a/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.dll and b/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.dll differ diff --git a/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.pdb b/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.pdb index 3826b19..e6ec14d 100644 Binary files a/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.pdb and b/YD_AllHeartRates.Api/obj/Debug/net6.0/YD_AllHeartRates.Api.pdb differ diff --git a/YD_AllHeartRates.Api/obj/Debug/net6.0/apphost.exe b/YD_AllHeartRates.Api/obj/Debug/net6.0/apphost.exe index 77e2e81..d280ab7 100644 Binary files a/YD_AllHeartRates.Api/obj/Debug/net6.0/apphost.exe and b/YD_AllHeartRates.Api/obj/Debug/net6.0/apphost.exe differ diff --git a/YD_AllHeartRates.Api/obj/Debug/net6.0/ref/YD_AllHeartRates.Api.dll b/YD_AllHeartRates.Api/obj/Debug/net6.0/ref/YD_AllHeartRates.Api.dll index 2b15cb1..c43a069 100644 Binary files a/YD_AllHeartRates.Api/obj/Debug/net6.0/ref/YD_AllHeartRates.Api.dll and b/YD_AllHeartRates.Api/obj/Debug/net6.0/ref/YD_AllHeartRates.Api.dll differ diff --git a/YD_AllHeartRates.Api/obj/Debug/net6.0/refint/YD_AllHeartRates.Api.dll b/YD_AllHeartRates.Api/obj/Debug/net6.0/refint/YD_AllHeartRates.Api.dll index 2b15cb1..c43a069 100644 Binary files a/YD_AllHeartRates.Api/obj/Debug/net6.0/refint/YD_AllHeartRates.Api.dll and b/YD_AllHeartRates.Api/obj/Debug/net6.0/refint/YD_AllHeartRates.Api.dll differ