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

基于Xamarin Forms/Android拣货APP向UWP收银终端推送拣货清单的实现方案及.NET API咨询

嘿,这个需求我之前帮同行处理过类似的,咱们从跨设备通信的核心方案和对应的.NET工具入手,一步步来拆解:

核心方案选型

这种扫码触发的拣货清单同步,主流有两种思路,都能适配你的Xamarin Android和UWP场景:

  • 二维码传递连接定位信息(比如实时通信地址、终端唯一ID),建立连接后推送数据
  • 本地局域网内的服务发现+定向数据推送
推荐的.NET API及入门实现步骤

1. 用SignalR实现实时双向通信(最推荐,适配实时同步场景)

SignalR是.NET官方的实时通信库,对Xamarin和UWP的支持都很完善,能自动处理连接管理、重连,还支持WebSocket、Server-Sent Events等多种传输方式,完全不用你自己写底层的通信逻辑。

入门步骤:

第一步:搭建SignalR Hub服务器(用ASP.NET Core,跨平台)

  • 创建一个新的ASP.NET Core Web应用,通过NuGet安装Microsoft.AspNetCore.SignalR包
  • 定义一个Hub类,负责中转拣货清单:
    public class PicklistHub : Hub
    {
        // 供Xamarin客户端调用,推送拣货清单到指定UWP终端
        public async Task SendPicklistToTerminal(string terminalId, List<PickItem> completedPicklist)
        {
            // 定向推送给绑定了该终端ID的UWP客户端
            await Clients.User(terminalId).SendAsync("ReceivePicklist", completedPicklist);
        }
    
        // 供UWP客户端注册自己的终端ID
        public async Task RegisterTerminal(string terminalId)
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, terminalId);
        }
    }
    
  • 在Program.cs里配置SignalR:
    var builder = WebApplication.CreateBuilder(args);
    builder.Services.AddSignalR();
    var app = builder.Build();
    
    app.MapHub<PicklistHub>("/picklisthub");
    app.Run();
    

第二步:UWP客户端集成SignalR

  • 通过NuGet安装Microsoft.AspNetCore.SignalR.Client包
  • 连接Hub并监听清单推送:
    // 先获取当前UWP终端的唯一标识(比如设备ID,或者用户自定义的终端编号)
    string terminalId = "Terminal_001"; // 可以把这个ID生成二维码展示
    var hubConnection = new HubConnectionBuilder()
        .WithUrl("http://你的服务器IP:端口/picklisthub") // 替换成你的服务器地址
        .Build();
    
    // 监听来自服务器的拣货清单推送
    hubConnection.On<List<PickItem>>("ReceivePicklist", picklist =>
    {
        // 必须切换到UI线程更新界面
        Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            // 把拣货清单绑定到UI控件,比如ListView
            PicklistListView.ItemsSource = picklist;
        });
    });
    
    // 启动连接并注册终端ID
    try
    {
        await hubConnection.StartAsync();
        await hubConnection.InvokeAsync("RegisterTerminal", terminalId);
    }
    catch (Exception ex)
    {
        // 处理连接失败的情况,比如弹窗提示
    }
    

第三步:Xamarin Android客户端集成SignalR

  • 同样安装Microsoft.AspNetCore.SignalR.Client NuGet包
  • 扫描UWP终端展示的二维码(二维码内容可以是服务器Hub地址|终端ID,比如http://192.168.1.100:5000/picklisthub|Terminal_001),然后推送拣货清单:
    // 假设扫码得到的结果是scanResult
    string scanResult = "扫到的二维码内容";
    var parts = scanResult.Split('|');
    string hubUrl = parts[0];
    string targetTerminalId = parts[1];
    
    var hubConnection = new HubConnectionBuilder()
        .WithUrl(hubUrl)
        .Build();
    
    try
    {
        await hubConnection.StartAsync();
        // 推送已完成的拣货清单
        await hubConnection.InvokeAsync("SendPicklistToTerminal", targetTerminalId, MyCompletedPicklist);
        // 推送成功后给用户反馈,比如Toast
    }
    catch (Exception ex)
    {
        // 处理推送失败的情况
    }
    

2. 用ASP.NET Core Web API + HttpClient(轻量单次推送场景)

如果不需要实时同步,只是完成拣货后一次性推送清单,用普通的Web API就足够了,实现起来更简单:

  • API端:搭建一个ASP.NET Core Web API,写一个接收拣货清单的POST接口;UWP客户端可以自己启动一个小型API服务,或者轮询服务器获取更新
  • Xamarin端:扫码得到UWP终端的本地IP和接口地址,用HttpClient发送POST请求:
    var httpClient = new HttpClient();
    // 序列化拣货清单为JSON
    string json = System.Text.Json.JsonSerializer.Serialize(MyCompletedPicklist);
    var content = new StringContent(json, Encoding.UTF8, "application/json");
    // 发送到UWP的API接口
    await httpClient.PostAsync("http://192.168.1.101:5001/api/picklist", content);
    
  • UWP端:用HttpListener或者小型ASP.NET Core API接收请求,解析后更新UI

3. 用.NET原生TcpClient/UdpClient(纯局域网无服务器场景)

如果不想依赖中间服务器,纯本地局域网内直接通信,可以用.NET的TcpClient/UdpClient,但需要自己处理连接、数据序列化等细节,适合有一定网络编程基础的情况:

  • 示例(UWP端启动TCP监听):
    var listener = new TcpListener(IPAddress.Any, 12345);
    listener.Start();
    while (true)
    {
        using var client = await listener.AcceptTcpClientAsync();
        using var stream = client.GetStream();
        using var reader = new StreamReader(stream);
        string json = await reader.ReadToEndAsync();
        var picklist = System.Text.Json.JsonSerializer.Deserialize<List<PickItem>>(json);
        // 切换到UI线程更新界面
        Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
        {
            PicklistListView.ItemsSource = picklist;
        });
    }
    
  • Xamarin端扫码得到UWP的IP和端口,建立TCP连接发送序列化后的拣货清单即可
关键注意事项
  • 二维码内容设计:一定要包含精准的连接信息,比如SignalR Hub地址+终端ID,或者UWP的IP+端口,确保Xamarin端能定位到目标终端
  • 权限配置:Android端需要开启网络权限、相机权限;UWP端需要在Package.appxmanifest里配置私有网络客户端/服务器权限,否则局域网内通信会被拦截
  • 数据序列化:推荐用System.Text.Json(.NET原生)或者Newtonsoft.Json来序列化拣货清单对象,确保跨平台能正确解析
  • 异常处理:通信过程中要处理连接失败、超时等情况,比如SignalR的自动重连逻辑,HttpClient的异常捕获,给用户明确的反馈

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 05:22:43