如何让本地ASP.NET Core 5通过WebSocket/TCP/IP接收设备数据?
ASP.NET Core 5 本地WebSocket接收设备数据实现方案
1. 配置WebSocket服务
在Startup.cs中完成WebSocket服务的注册与启用:
public void ConfigureServices(IServiceCollection services) { services.AddControllers(); // 注册内置WebSocket服务 services.AddWebSockets(); } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthorization(); // 启用WebSocket中间件(必须在路由映射前配置) app.UseWebSockets(); // 映射设备数据接收端点 app.Map("/ws/device-data", async context => { // 校验WebSocket请求合法性 if (!context.WebSockets.IsWebSocketRequest) { context.Response.StatusCode = StatusCodes.Status400BadRequest; return; } // 建立WebSocket连接 using var webSocket = await context.WebSockets.AcceptWebSocketAsync(); var buffer = new byte[1024 * 4]; // 根据设备数据大小调整缓冲区 try { // 持续接收设备数据 while (webSocket.State == WebSocketState.Open) { var receiveResult = await webSocket.ReceiveAsync( new ArraySegment<byte>(buffer), CancellationToken.None); // 处理接收的数据(示例:转字符串输出,可替换为写入DB/日志等业务逻辑) var receivedContent = Encoding.UTF8.GetString(buffer, 0, receiveResult.Count); Console.WriteLine($"Received device data: {receivedContent}"); // 处理设备发起的关闭请求 if (receiveResult.MessageType == WebSocketMessageType.Close) { await webSocket.CloseAsync( receiveResult.CloseStatus.Value, receiveResult.CloseStatusDescription, CancellationToken.None); } } } catch (Exception ex) { Console.WriteLine($"WebSocket connection error: {ex.Message}"); } }); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
2. 设备端模拟验证代码
用控制台程序模拟设备发送数据,验证接收功能:
using System; using System.Net.WebSockets; using System.Text; using System.Threading; using System.Threading.Tasks; class DeviceSimulator { static async Task Main(string[] args) { using var client = new ClientWebSocket(); var serverUri = new Uri("ws://localhost:5000/ws/device-data"); // 替换为你的应用端口 try { await client.ConnectAsync(serverUri, CancellationToken.None); Console.WriteLine("Connected to server"); // 模拟设备周期性发送数据 while (client.State == WebSocketState.Open) { var data = $"Device heartbeat at {DateTime.Now:yyyy-MM-dd HH:mm:ss}"; var dataBuffer = Encoding.UTF8.GetBytes(data); await client.SendAsync( new ArraySegment<byte>(dataBuffer), WebSocketMessageType.Text, endOfMessage: true, CancellationToken.None); Console.WriteLine($"Sent data: {data}"); await Task.Delay(2000); // 每2秒发送一次 } } catch (Exception ex) { Console.WriteLine($"Device connection error: {ex.Message}"); } } }
3. 核心注意事项
- 缓冲区调整:根据设备实际发送的数据帧大小修改
buffer长度,避免数据截断。 - 二进制数据处理:如果设备发送二进制格式数据,直接操作字节数组,不要用
Encoding.UTF8转换。 - 连接稳定性:设备端建议添加重连逻辑,应对意外断连场景。
- 并发安全:多设备同时连接时,确保业务逻辑(如数据存储)的线程安全性。
内容的提问来源于stack exchange,提问作者Yeasin Ahmed
相关产品推荐
相关产品推荐

