You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让本地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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 00:25:26