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

部署AspNetCore应用后,如何获取客户端串口扫码数据?

问题

我正在开发一款AspNetCore应用,需将条码/二维码扫描器连接至客户端计算机,要在服务器端获取扫码数据进行验证,并将结果返回给客户端。目前开发阶段因客户端与服务器在同一设备,通过SerialPort可读取扫码数据,但担心部署后两者不在同一设备时该方案失效。

当前通过串口获取数据的代码:

static SerialPort _serialPort = new SerialPort("COM3", 115200, Parity.None, 8, StopBits.One);
public ActionResult SelectedPN(String nameobj)
{
    pn_No= nameobj;
          
    _serialPort.WriteTimeout = 500;

    _serialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_Data);

    if (!_serialPort.IsOpen)
    {
        try
        {
            _serialPort.Open();
        }
        catch (IOException ex)
        {
            Console.WriteLine(ex);
        }
}

数据接收时会调用处理方法:_serialPort.DataReceived += new SerialDataReceivedEventHandler(mySerialPort_Data);

处理函数代码如下:

public void mySerialPort_Data(object sender, SerialDataReceivedEventArgs e)
{
    if (_serialPort.ReadExisting() != null)
    {
        newpageList = _db.Categories1;
        string data = _serialPort.ReadExisting();
        barcode = data.Split(";");
        codeValue = barcode[0].Substring(barcode[0].IndexOf(":") + 1);
        GetCurrent();
        //SelectedPN(pn_No);
    }
    //_serialPort.Close();
}

现咨询部署后,如何实现客户端扫码后将数据传递至服务器端?


解决方案

部署后客户端与服务器不在同一设备时,服务器无法直接访问客户端本地串口,原方案必然失效。以下是几种实用的实现方式:

1. 利用扫码器的键盘模拟模式

绝大多数条码/二维码扫描器支持键盘模拟(HID模式),扫码后数据会自动输入到客户端当前聚焦的输入框。你可以在AspNetCore前端页面做如下处理:

  • 添加一个隐藏的输入框,页面加载时自动聚焦:
    <input type="text" id="barcodeInput" style="position:absolute; left:-9999px;">
    <script>
        window.onload = () => document.getElementById('barcodeInput').focus();
    </script>
    
  • 监听输入框的回车事件(多数扫码器会自动追加回车作为数据结束标记),通过AJAX将数据提交到服务器:
    document.getElementById('barcodeInput').addEventListener('keydown', e => {
        if (e.key === 'Enter') {
            const barcode = e.target.value.trim();
            fetch('/api/Barcode/Validate', {
                method: 'POST',
                headers: { 'Content-Type': 'application/json' },
                body: JSON.stringify({ code: barcode })
            })
            .then(res => res.json())
            .then(result => {
                // 处理验证结果,比如弹窗提示
                alert(result.isValid ? '验证通过' : '验证失败');
                e.target.value = ''; // 清空输入框准备下一次扫码
            });
        }
    });
    
  • 服务器端编写对应的API接口处理验证逻辑:
    [ApiController]
    [Route("api/[controller]")]
    public class BarcodeController : ControllerBase
    {
        private readonly YourDbContext _db;
    
        public BarcodeController(YourDbContext db) => _db = db;
    
        [HttpPost("Validate")]
        public IActionResult Validate([FromBody] BarcodeRequest request)
        {
            // 替换为你的实际验证逻辑
            bool isValid = _db.Categories1.Any(c => c.Code == request.Code);
            return Ok(new { isValid });
        }
    }
    
    public class BarcodeRequest
    {
        public string Code { get; set; }
    }
    

2. 开发客户端本地代理程序

如果扫码器不支持键盘模拟,或需要复杂串口交互,可以开发轻量的客户端本地程序(如WinForms/WPF控制台应用):

  • 复用你现有的SerialPort读取代码,在本地程序中读取扫码数据。
  • 本地程序通过HTTP请求将数据发送到AspNetCore服务器的接口。
  • 服务器验证后返回结果,本地程序负责将结果提示给用户(如弹窗、同步到网页)。

3. 使用WebSocket实现实时双向通信

若需要服务器主动推送验证结果,或持续扫码交互,可使用AspNetCore的WebSocket功能建立长连接:

  • 前端页面与服务器建立WebSocket连接。
  • 客户端读取扫码数据后通过WebSocket发送给服务器。
  • 服务器完成验证后,通过WebSocket将结果实时推送给客户端。

关键注意事项

  • 服务器API接口需添加身份验证,避免非法数据提交。
  • 键盘模拟模式下要处理数据完整性,防止输入中断导致数据残缺。
  • 本地代理程序需考虑客户端的部署、更新和兼容性问题。

内容的提问来源于stack exchange,提问作者joeOla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 20:01:33