From 101dc1fef6548af6be51c2edeba1577d70a4430b Mon Sep 17 00:00:00 2001 From: yanghongwei <330334037@qq.com> Date: Mon, 2 Sep 2024 14:24:54 +0800 Subject: [PATCH] =?UTF-8?q?gps=20=E6=95=B0=E6=8D=AE=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- langguanApi/Common/WebSocket/PushService.cs | 10 +++- langguanApi/Program.cs | 14 +++-- langguanApi/Service/GpsService.cs | 59 ++++++++++++++++----- 3 files changed, 67 insertions(+), 16 deletions(-) diff --git a/langguanApi/Common/WebSocket/PushService.cs b/langguanApi/Common/WebSocket/PushService.cs index 63c36aa..b735114 100644 --- a/langguanApi/Common/WebSocket/PushService.cs +++ b/langguanApi/Common/WebSocket/PushService.cs @@ -13,6 +13,14 @@ namespace langguanApi.Common.WebSocket { private readonly IHubContext _hubContext; /// + /// 构造函数 + /// + /// + public PushService(IHubContext hubContext) + { + _hubContext = hubContext; + } + /// /// 全部消息 /// /// @@ -23,7 +31,7 @@ namespace langguanApi.Common.WebSocket { ContractResolver = new CamelCasePropertyNamesContractResolver() }; - Console.WriteLine($"gps:{JsonConvert.SerializeObject(message, settings)}"); + Console.WriteLine($"gps 推送数据:{JsonConvert.SerializeObject(message, settings)}"); var data = JsonConvert.SerializeObject(message, settings); await _hubContext.Clients.All.SendAsync("ReceiveMessage", data); } diff --git a/langguanApi/Program.cs b/langguanApi/Program.cs index 3a236dd..f7d791f 100644 --- a/langguanApi/Program.cs +++ b/langguanApi/Program.cs @@ -1,4 +1,5 @@ using langguanApi.Common.Redis; +using langguanApi.Common.WebSocket; using langguanApi.Extensions; using langguanApi.Extensions.AutoDI; using langguanApi.Middleware; @@ -45,7 +46,8 @@ builder.Services.AddSwaggerGen( }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); - +//websocket +builder.Services.AddSignalR(); //redis var redisoptions = builder.Configuration.GetSection("Redis").Get(); if (redisoptions != null) @@ -76,6 +78,13 @@ builder.Services.AddCors(options => var app = builder.Build(); ServiceLocator.Instance = app.Services; +app.UseRouting(); +//ִƥĶ˵ +app.UseEndpoints(endpoints => +{ + endpoints.MapHub("/notification"); + endpoints.MapControllers(); +}); // Configure the HTTP request pipeline. @@ -90,9 +99,8 @@ app.UseCors("CorsPolicy"); //app.UseAuthorization(); + - -app.MapControllers(); if (!await GetNowTimeAsync()) { Console.WriteLine("ǰʱ䲻ڿʱ䷶ΧڣϵӦ̡"); diff --git a/langguanApi/Service/GpsService.cs b/langguanApi/Service/GpsService.cs index 93882cf..ef9986c 100644 --- a/langguanApi/Service/GpsService.cs +++ b/langguanApi/Service/GpsService.cs @@ -1,15 +1,17 @@ using langguanApi.Model.Entity; using MongoDB.Bson.IO; +using Org.BouncyCastle.Utilities.Net; using System.Net; using System.Net.Sockets; using System.Text; +using IPAddress = System.Net.IPAddress; namespace langguanApi.Service { public class GpsService { - private GpsHistoryService _service = ServiceLocator.Instance.GetService(); + /// /// 缓冲器 /// @@ -22,17 +24,24 @@ namespace langguanApi.Service public async Task Start() { // 创建本地IP地址和TCP端口号 - var ipEndPoint = new IPEndPoint(IPAddress.Any, port); - TcpListener listener = new(ipEndPoint); + // 定义监听地址和端口 try { + // 定义监听地址和端口 + IPAddress ipAddress = IPAddress.Any; // 使用本地所有可用的 IP 地址 + + // 创建 TcpListener 实例 + TcpListener listener = new TcpListener(ipAddress, port); + // 开始监听 listener.Start(); - Console.WriteLine($"Waiting for gps connection... port:{port}"); - using TcpClient handler = await listener.AcceptTcpClientAsync(); - await using NetworkStream stream = handler.GetStream(); - int received = await stream.ReadAsync(result); - var message = Encoding.UTF8.GetString(result, 0, received); - Console.WriteLine($"GPS received: \"{message}\""); + Console.WriteLine($" gps Listening on {ipAddress}:{port}..."); + while (true) + { + // 接受客户端连接 + TcpClient client = await listener.AcceptTcpClientAsync(); + // 处理客户端连接 + _ = Task.Run(() => HandleClientAsync(client)); + } } catch (Exception ex) { @@ -44,10 +53,36 @@ namespace langguanApi.Service /// /// /// - public async Task Send(string message) + public async Task HandleClientAsync(TcpClient client) { - var json = Newtonsoft.Json.JsonConvert.DeserializeObject(message); - await _service.AddGpsHistory(json); + + string receivedData = string.Empty; + using (NetworkStream stream = client.GetStream()) + { + byte[] buffer = new byte[1024]; + int bytesRead; + + // 持续读取数据直到客户端断开连接 + while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) != 0) + { + // 将字节数据转换为字符串 + receivedData = Encoding.UTF8.GetString(buffer, 0, bytesRead); + Console.WriteLine($" gps Received: {receivedData}"); + + + var json = Newtonsoft.Json.JsonConvert.DeserializeObject(receivedData); + var _service = ServiceLocator.Instance.GetService(); + await _service.AddGpsHistory(json); + // 发送响应给客户端 + string response = "Data received"; + byte[] responseData = Encoding.UTF8.GetBytes(response); + await stream.WriteAsync(responseData, 0, responseData.Length); + } + } + + client.Close(); + Console.WriteLine("Client disconnected."); + } } }