![]() |
VOOZH | about |
dotnet add package CSoft.Communication.Bluetooth --version 10.6.2
NuGet\Install-Package CSoft.Communication.Bluetooth -Version 10.6.2
<PackageReference Include="CSoft.Communication.Bluetooth" Version="10.6.2" />
<PackageVersion Include="CSoft.Communication.Bluetooth" Version="10.6.2" />Directory.Packages.props
<PackageReference Include="CSoft.Communication.Bluetooth" />Project file
paket add CSoft.Communication.Bluetooth --version 10.6.2
#r "nuget: CSoft.Communication.Bluetooth, 10.6.2"
#:package CSoft.Communication.Bluetooth@10.6.2
#addin nuget:?package=CSoft.Communication.Bluetooth&version=10.6.2Install as a Cake Addin
#tool nuget:?package=CSoft.Communication.Bluetooth&version=10.6.2Install as a Cake Tool
专为.NET环境设计的高性能、灵活且高度可扩展的通讯库。支持多种通讯口协议、分包方式和自动重连机制,能有效降低通讯代码开发成本,帮助开发者将更多精力投入业务逻辑实现。
using CommBuilder;
// ==================== 顶层通讯口(无队列) ====================
// 1. 顶层点对点 - 串口
var port = Comm.Top()
.UseSerial("COM3", 9600)
.WithHeadFootParser([0xAA], [0x55])
.OnReceived(data => Console.WriteLine(BitConverter.ToString(data)))
.Build();
await port.OpenAsync();
await port.SendAsync([0x01, 0x02, 0x03]);
// 2. 顶层点对点 - TCP 客户端
var tcp = Comm.Top()
.UseTcp("192.168.1.100", 9000)
.WithHeadLengthParser([0xAA], data => data[2])
.AutoReconnect()
.Build();
await tcp.OpenAsync();
// 3. 顶层服务端 - TCP Server
var server = Comm.TopServer()
.UseTcpServer("0.0.0.0", 9000)
.WithHeadFootParser([0xAA], [0x55])
.OnClientConnected(id => Console.WriteLine($"客户端连接: {id}"))
.OnReceived((id, data) => Handle(data, id))
.Build();
await server.OpenAsync();
// 4. 顶层服务端 - UDP 多对多
var udp = Comm.TopServer()
.UseUdp("0.0.0.0", 9000)
.WithTimeParser(50)
.Build();
// ==================== 队列版本 ====================
// 乌鸦场景 - RS485 主从通讯(请求-响应队列)
// 解析器由协议层提供,外层只负责组装
var crow = Comm.Crow()
.UseSerial("COM3", 9600)
.WithParser(MyProtocol.CreateParser())
.Timeout(5000)
.SendInterval(20)
.Build();
var protocol = new MyProtocol(crow);
await protocol.OpenAsync();
var response = await protocol.ReadValueAsync();
// 鸽子场景 - TCP 全双工(支持主动推送)
var pigeon = Comm.Pigeon()
.UseTcp("192.168.1.100", 9000)
.WithParser(MyProtocol.CreateParser())
.Timeout(3000)
.Build();
var pigeonProtocol = new MyProtocol(pigeon);
await pigeonProtocol.OpenAsync();
// 鸽子场景 - TCP Server(队列版本,默认绑定首个客户端)
var pigeonServer = Comm.Pigeon()
.UseTcpServer("0.0.0.0", 9000)
.WithParserFactory(MyProtocol.CreateParser) // 每个客户端独立解析器
.Build();
var pigeonServerProtocol = new MyProtocol(pigeonServer);
await pigeonServerProtocol.OpenAsync();
// 麻雀场景 - UDP 多对多(队列版本)
var sparrow = Comm.Sparrow()
.UseUdp("0.0.0.0", 9000)
.WithTimeParser(50)
.Build();
await sparrow.StartAsync();
以TCP服务器接入为例:
using Communication.Bus;
using Communication.Interfaces;
// 1. 创建TcpServer,配置端口
IBusPort tcpServer = new TcpServer("127.0.0.1", 9000);
// 2. 注册事件与回调
tcpServer.OnReceived += (sender, args) => {
// 处理收到的数据包
};
// 3. 启动服务
tcpServer.StartAsync();
如需接入自定义协议,直接实现 IParser 即可无缝接入分包处理。
# 核心库
NuGet\Install-Package CSoft.TopPortLib -Version 10.6.2
# Fluent Builder API(推荐)
NuGet\Install-Package CSoft.Communication.Builder -Version 10.6.2
下载 GitHub项目 源码或将其作为子模块导入。
将 /Communication、/TopPortLib、/Crow、/Parser、/CommBuilder 等核心目录作为项目引用即可。
using Communication.Bus.PhysicalPort;
var serialPort = new SerialPort("COM1", 9600);
// 配置与启动
serialPort.OpenAsync();
using Communication.Bus.PhysicalPort;
var tcpClient = new TcpClient("127.0.0.1", 9000);
tcpClient.OpenAsync();
using Communication.Bus.PhysicalPort;
var pipeClient = new NamedPipeClient("PipeName");
pipeClient.OpenAsync();
using Communication.Bluetooth;
var bluetooth = new BluetoothClassic("设备MAC地址");
bluetooth.ConnectAsync();
实现 IParser,支持任意自定义协议:
public class MyParser : IParser
{
public IEnumerable<byte[]> Parse(byte[] buffer)
{
// 自定义分包算法...
}
}
IPhysicalPort:物理口基接口(串口/TCP/蓝牙/命名管道等)SerialPort, TcpClient, NamedPipeClient, BluetoothClassic:各类物理口实现类OpenAsync()/CloseAsync():开启/关闭通讯SendAsync(byte[] data):发送数据IBusPort:总线抽象层(数据包收发)TcpServer, Udp, NamedPipeServer:各类服务端实现StartAsync()/StopAsync():启动/停止服务OnReceived:数据包接收事件IParser:数据包分割接口BaseParser, HeadFootParser, HeadLengthParser, TimeParser:内建协议分割实现ConnectFailedException, NotConnectedException, SendException(Communication/Exceptions)RequestParameterToBytesFailedException, ResponseCreateFailedException(TopPortLib/Exceptions)TopPort, CrowPort, PigeonPort, CrowPort_Server, PigeonPort_Server(TopPortLib)
CommBuilder 提供了简洁的 Fluent API,大幅降低入门门槛:
TopServer()
ITopPort_ServerITopPort_M2MPigeon().UseTcpServer() / Sparrow()
Pigeon().UseTcpServer() → IPigeonPort(单客户端绑定)Sparrow() → ISparrowPortTop()
ITopPortCrow() / Pigeon()
Crow() → ICrowPortPigeon() → IPigeonPort| 场景 | 适用协议 | 特点 | 返回类型 |
|---|---|---|---|
| 顶层 (Top) | 串口/TCP客户端/管道 | 无队列,直接收发,最简单 | ITopPort |
| 顶层服务端 (TopServer) | TCP Server/UDP | 无队列,服务端模式 | ITopPort_Server / ITopPort_M2M |
| 乌鸦 (Crow) | RS485/串口/TCP | 主从队列,请求-响应模式 | ICrowPort |
| 鸽子 (Pigeon) | TCP 全双工/TCP Server | 支持被动推送,TCP Server 下绑定单客户端 | IPigeonPort |
| 乌鸦服务端 (Crow Server) | TCP Server | 单客户端队列(为每个连接创建独立队列) | ICrowPort |
| 麻雀 (Sparrow) | UDP | 多对多广播通讯 | ISparrowPort |
| 特性 | 无队列 (Top/TopServer) | 有队列 (Crow/Pigeon/Sparrow) |
|---|---|---|
| 发送方式 | SendAsync(data) 直接发送 |
RequestAsync<TReq, TRsp>(req) 请求-响应 |
| 队列管理 | ❌ 无 | ✅ 自动排队,防止数据冲突 |
| 超时重试 | ❌ 无 | ✅ 请求超时自动重试 |
| 响应匹配 | ❌ 手动处理 | ✅ 自动通过 Response 类型匹配 |
| 适用场景 | 简单收发、自定义协议 | 工业设备、Modbus 等主从协议 |
using CommBuilder;
// 串口 + 头尾分包
var port = Comm.Top()
.UseSerial("COM3", 9600)
.WithHeadFootParser([0xAA], [0x55])
.OnReceived(data => Console.WriteLine(BitConverter.ToString(data)))
.OnConnected(() => Console.WriteLine("已连接"))
.OnDisconnected(() => Console.WriteLine("已断开"))
.Build();
await port.OpenAsync();
// 发送数据
await port.SendAsync([0x01, 0x02, 0x03]);
// TCP + 头长度分包 + 自动重连
var tcp = Comm.Top()
.UseTcp("192.168.1.100", 9000)
.WithHeadLengthParser([0xAA, 0x55], data => data[2]) // 帧头 + 长度字段
.AutoReconnect() // 断线自动重连
.OnReceived(data => Handle(data))
.Build();
await tcp.OpenAsync();
using CommBuilder;
// TCP Server,每个客户端独立分包器
var server = Comm.TopServer()
.UseTcpServer("0.0.0.0", 9000)
.WithHeadFootParser([0xAA], [0x55])
.OnClientConnected(clientId => Console.WriteLine($"客户端连接: {clientId}"))
.OnClientDisconnected(clientId => Console.WriteLine($"客户端断开: {clientId}"))
.OnReceived((clientId, data) =>
{
Console.WriteLine($"收到来自 {clientId}: {BitConverter.ToString(data)}");
// 处理数据后回复
await server.SendAsync(clientId, [0x01, 0x02]);
})
.Build();
await server.OpenAsync();
// UDP 多对多
var udp = Comm.TopServer()
.UseUdp("0.0.0.0", 9000)
.WithTimeParser(50) // 定时分包
.OnReceived((clientId, data) => Handle(data))
.Build();
await udp.OpenAsync();
// 添加目标客户端
var clientId = await udp.AddClientAsync("192.168.1.101", 9001);
// 向指定客户端发送
await udp.SendAsync(clientId, [0x01, 0x02, 0x03]);
// RS485 主从通讯,自动队列
// 协议层不创建端口,只接收端口;解析器也由协议层暴露
var crow = Comm.Crow()
.UseSerial("COM3", 9600)
.WithParser(MyProtocol.CreateParser()) // 协议层决定用什么解析器
.Timeout(5000)
.SendInterval(20)
.Build();
var protocol = new MyProtocol(crow); // 注入端口
await protocol.OpenAsync();
var response = await protocol.ReadValueAsync();
// TCP 全双工,支持主动推送
var pigeon = Comm.Pigeon()
.UseTcp("192.168.1.100", 9000)
.WithParser(MyProtocol.CreateParser())
.Timeout(3000)
.Build();
var protocol = new MyProtocol(pigeon);
await protocol.OpenAsync();
// 请求-响应
var response = await protocol.ReadSignalValueAsync();
// TCP Server + Crow 队列;默认绑定首个连接的客户端
var crow = Comm.Crow()
.UseTcpServer("0.0.0.0", 9000)
.WithParser(MyProtocol.CreateParser())
.Build();
var protocol = new MyProtocol(crow); // 协议层支持 ICrowPort
crow.OnConnect += async () =>
{
var value = await protocol.ReadValueAsync();
};
await protocol.OpenAsync();
// 支持连接字符串快速创建
var crow = Comm.Crow()
.FromConnectionString("serial://COM3:9600:N:8:1")
.WithHeadFootParser([0xAA], [0x55])
.Build();
var pigeon = Comm.Pigeon()
.FromConnectionString("tcp://192.168.1.100:9000")
.WithHeadLengthParser([0xAA], data => data[2])
.Build();
连接字符串格式:
serial://COM3:9600 或 serial://COM3:9600:N:8:1tcp://192.168.1.100:9000pipe://PipeName只需实现 IParser 接口,即可用自定义协议处理底层字节流。例如:
public class CustomParser : IParser { ... }
ITopPort port = new TopPort(new TcpClient("127.0.0.1", 9000), new CustomParser());
TopPortLib 提供了对工业协议常用模式的抽象,可灵活叠加堆栈组合业务逻辑,如异步M2M、设备逻辑拆分等。
每次新增一个协议类,都需要手写大量重复的 Builder 包装代码(物理口选择、解析器注入、配置转发等)。
本库内置了 TopPortLib.SourceGenerators,只需给协议类加上一个 Attribute,编译器会自动生成对应的 Fluent Builder 静态方法。
| Attribute | 对应场景 | 生成的入口方法 | 配置方法 |
|---|---|---|---|
[AutoCrowPortBuilder] |
乌鸦 (Crow) | UseTcp / UseTcpServer / UseSerial / UseNamedPipe / FromConnectionString |
Timeout / SendInterval / BindClient / OnReceived / OnConnected / OnDisconnected |
[AutoPigeonPortBuilder] |
鸽子 (Pigeon) | UseTcp / UseTcpServer / UseSerial / UseNamedPipe / FromConnectionString |
Timeout / SendInterval / BindClient / WithCheck |
[AutoSparrowPortBuilder] |
麻雀 (Sparrow) | UseUdp |
Timeout / OnClientDisconnected / OnSent |
协议类只需满足一个条件:提供 public static IParser CreateParser() 方法(供生成器自动注入解析器)。
其余全部由 Source Generator 在编译期自动生成:
ICrowPortProtocol 等,自动从 Request/Response 配对推断方法签名)ReadValueReq + ReadValueRsp → ReadValueAsync(),自动传播 Request 构造参数及默认值)[ActivelyPushResponse] 即可自动生成 On{Event} 事件与注册逻辑)CrowPortProtocolBase,包含 _port、状态、事件、日志)I{className} 由生成器自动附加到 partial class)UseTcp / UseSerial 等静态方法)IsConnect / IsListened)ILogger,无需手写)using TopPortLib;
using Parser.Interfaces;
using Parser.Parsers;
namespace CrowPortProtocolDemo
{
[AutoCrowPortBuilder] // ← 加这一行即可
public partial class CrowPortProtocol
{
public static IParser CreateParser() => new FootParser([0x0d]);
// 只需写业务方法,其他全部自动生成
public async Task<List<decimal>?> ReadValueAsync() { /* ... */ }
}
}
只需在 Response 类上标记 [ActivelyPushResponse],生成器会自动创建事件与注册逻辑:
using TopPortLib;
namespace PigeonPortProtocolDemo
{
[ActivelyPushResponse] // ← 标记这一行
public partial class ReadValueRsp : IAsyncResponse<(List<decimal> recData, int result)>
{
// ... 解析逻辑
}
}
编译器自动生成:
public event ActivelyPushDataEventHandler<(List<decimal> recData, int result)>? OnReadValue;
private async Task ReadValueRspEvent((List<decimal> recData, int result) value)
=> OnReadValue?.Invoke(value);
只要按约定命名 ReadValueReq + ReadValueRsp,生成器会自动推断并生成 ReadValueAsync 方法。
Crow 模式(一问一答)下无需任何特性标注,命名约定即可自动配对。Req 和 Rsp 可分别放在
Request/Response子命名空间下,只要去掉后缀后的名称一致即可配对。
// Request(构造参数会自动传播到生成的方法签名)
public partial class ReadValueReq(string addr = "01") : IAsyncRequest { ... }
// Response
public partial class ReadValueRsp : IAsyncResponse<(List<decimal> recData, int result)> { ... }
自动生成的方法签名:
public virtual async Task<(List<decimal> recData, int result)?> ReadValueAsync(
string addr = "01", CancellationToken cancellationToken = default)
外部使用时,无需再手动组装 Comm.Crow() 和 WithParser():
using CrowPortProtocolDemo;
// 解析器已自动注入,外部只关心物理口
var protocol = CrowPortProtocol.UseTcp("127.0.0.1", 2756)
.Timeout(5000)
.Build();
await protocol.OpenAsync();
var value = await protocol.ReadValueAsync();
// TCP Server 场景同样走协议 Builder,默认绑定首个连接的客户端
var serverProtocol = CrowPortProtocol.UseTcpServer("0.0.0.0", 2756)
.Timeout(5000)
.Build();
await serverProtocol.OpenAsync();
Sparrow(UDP 多对多)示例:
using TopPortLib;
using Parser.Interfaces;
using Parser.Parsers;
namespace SparrowPortProtocolDemo
{
[AutoSparrowPortBuilder] // ← 麻雀模式
public partial class SparrowPortProtocol
{
public static IParser CreateParser() => new FootParser([0x0d]);
}
}
// 使用
using SparrowPortProtocolDemo;
var protocol = SparrowPortProtocol.UseUdp("0.0.0.0", 2757)
.Timeout(5000)
.Build();
await protocol.StartAsync();
// UDP 需主动添加客户端
var clientId = await protocol.AddClientAsync("192.168.1.100", 2758);
var value = await protocol.ReadValueAsync(clientId);
传统方式(需要手写 80+ 行 Boilerplate):
var crow = Comm.Crow()
.UseTcp("127.0.0.1", 2756)
.WithParser(MyProtocol.CreateParser()) // 手动注入
.Timeout(5000)
.Build();
var protocol = new MyProtocol(crow);
自动生成方式(零重复代码):
var protocol = MyProtocol.UseTcp("127.0.0.1", 2756)
.Timeout(5000)
.Build(); // CreateParser() 自动注入,一步到位
<EmitCompilerGeneratedFiles>true</EmitCompilerGeneratedFiles>,生成文件将输出到 obj/generated/ 目录。/TestDemo 下包含众多实际协议、分包和通讯测试用例,例如:
TestNamedPipeClient, TcpServer, TestUdp1, PigeonPortProtocolDemo 等,
提供从基础通讯到进阶协议解码的全流程样例。支持自定义通讯参数,如串口波特率、网络端口、协议分包超时时间等,大多通过构造函数或属性设置即可。
var serial = new SerialPort(portName: "COM2", baudRate: 9600, parity: Parity.None);
对于高级需求,参见各类接口提供的扩展属性(详见源码与examples)。
IPhysicalPort, IParser)。TcpClient 与经典蓝牙客户端的 IsOpen 移除 socket Poll/Available 轮询探测,避免状态检查本身造成误判。TrackingPipeReader 在读完成/读异常时标记,并由发送异常路径兜底标记。10.6.2。TcpClient 和经典蓝牙客户端共用 TrackingPipeReader,在底层读完成或读异常时及时标记远端断开。TcpClient 保留轻量 socket 状态检查,并收紧打开失败、主动关闭和释放时的资源清理。BluetoothClient,避免复用已关闭实例导致连接状态不稳定。10.6.1。CondorPort / ICondorPort / CondorLayer 与相关 demo,Pigeon TCP Server 场景统一回到 Pigeon 命名。Comm.Pigeon().UseTcpServer(...) 直接构建 IPigeonPort,不再暴露独立的 PigeonServerBuilder / AutoPigeonServerPortBuilder。[AutoPigeonPortBuilder],PigeonPortProtocol.UseTcpServer(...) 与客户端入口共用同一个协议类型。IAsyncResponse 新增 clientInfo 参数,客户端传物理口信息,服务端传客户端信息。IAsyncResponse_Server,ResponseRegistry 与 source generator 同步使用统一接口。CommTask.Interfaces。IPigeonTilesLayer,通过 Guid? 表示数据来源是否包含客户端 ID。10.6.0。Comm.Crow() 新增 UseTcpServer、BindClient 与 WithParserFactory,TCP Server 场景可自动适配 CrowPort_Server。[AutoCrowPortBuilder] 生成的协议 Builder 新增 UseTcpServer / BindClient,可直接使用 CrowPortProtocol.UseTcpServer(...)。CrowPortDemo 与 CrowPortServerDemo,示例运行时输入选择串口或 TCP Server 模式。10.5.1。StreamPipeReader 在读到流结束后调用 Complete 可能不归还 ArrayPool 缓冲区的问题。BaseParser.ReceiveOriginalDataAsync fallback 路径增加异步串行保护,避免并发读写同一缓冲区。PigeonLayer、SparrowLayer 请求匹配从线性扫描优化为按响应类型与校验字节分桶查找。BaseParser、CrowLayer、SparrowLayer 内部队列改为有界通道,增加背压,减少慢消费场景下的内存堆积。Tmds.DBus 至 0.93.0,修复传递依赖高危漏洞告警。/proc/sys/net/ipv4 全局 TCP keepalive 参数的行为,改为 socket 级 KeepAlive。10.5.0。README.md 的 NuGet 安装示例更新为 10.4.10。CommBuilder/README.md 的 Builder 安装示例更新为 10.4.10。StreamPipeReader.AdvanceTo 中,.NET Framework 4.8 与 .NET Core/.NET 5+ 对 SequencePosition 的内部编码方式不同,导致跨平台调用 AdvanceTo(consumed, examined) 时可能抛出 ArgumentException 或产生错误偏移。ReadOnlySequence<byte>.GetPosition(long) 计算位置,避免直接依赖底层 SequencePosition 的内存布局差异,确保在 .NET Framework 4.8 下也能正确推进管道读取位置。TcpClient.IsOpen 增加半开连接(half-open)检测逻辑:在 _client.Connected 基础上,通过 Poll(0, SelectRead) && Available == 0 判断对方是否已静默断开,避免连接实际已断开但仍返回 true 的误判。false。TimeParser 解析循环中 _timer(SemaphoreSlim)未正确释放的问题,每次循环结束后添加 _timer.Release(),避免长时间运行后信号量耗尽导致解析任务卡死。CSoft.Utils 10.0.4 → 10.0.5System.IO.Ports / System.IO.Pipelines / System.Threading.Channels 10.0.7 → 10.0.8CSoft.LogInterface 1.0.0 → 10.0.0(Crow 项目版本修正)MSTest 4.2.2 → 4.2.3(测试项目)TimeInterval 的定时器超时轮询机制,改为直接调用 reader.ReadAsync,简化流程并避免超时竞争。Dispose 时先释放定时器、等待后台 HandleDataAsync 任务完成,再取消 CTS 和释放信号量,避免任务泄漏与资源竞争。OperationCanceledException 和 IOException,遇到时直接退出解析循环。IOException(InnerException 为 SocketException 且 NativeErrorCode: 995,即操作已取消)的捕获,避免 socket 异常关闭时抛未处理异常。TcpServer.SendDataAsync 前置 Connected 检查导致的非原子性问题,改为直接写入、异常时清理,避免误判连接状态。TcpClient.IsOpen 中 Poll(1) 超时太短(1 微秒)导致的漏判问题,简化为直接检查 Connected。TcpClient.CloseAsync 重复 Dispose NetworkStream 的顺序问题,避免资源关闭混乱。TcpClient 同步 Dispose 中阻塞等待异步 CloseAsync 的潜在死锁风险。TcpServer.StopAsync 未清理 CancellationTokenSource 和 PipeReader 的问题,使用 ToArray() 避免遍历时字典被修改。BusPort.SendAsync 发送失败时主动触发断开流程,避免依赖轮询检测延迟发现断连。TcpServer 集成测试,验证客户端断开后服务端发送异常并正确清理字典。TcpServer.StopAsync 测试,验证多客户端场景下资源完整释放。AdvanceTo(consumed, examined) 双参数重载未正确处理 examined 位置,导致 _consumed 可能回退的问题。ReadAsync 重复返回已消费数据的问题。_examinedToEnd 标志)。StreamPipeReader 使用 ReadOnlySequence<byte> 新构造函数优化内存布局。CrowEndToEndTests),覆盖请求发送-响应注入-帧拆分完整链路。StreamPipeReader 边界条件单元测试,验证部分消费、多次 Advance、examined-to-end 等场景。IParser 新增 ReceiveOriginalDataAsync(ReadOnlyMemory<byte>) 非零拷贝路径(测试/简单场景)。StreamPipeReader 统一流管道读取器,消除各物理口重复代码。BaseParser 重构为基于 ParseSequenceAsync 虚方法,RunAsync 改为虚方法,所有内置 Parser 全面适配。IPhysicalPort.Input 重命名为 PipeReader,职责更清晰。BusPort 移除 Parser 属性,解析职责完全上浮至 TopPortLib。StreamPipeReader 封装。TryMatchClient / TryMatchServer,使用缓存 Check 实例避免重复创建对象。_closeCts 重建逻辑)。[AutoSparrowPortBuilder] 完整支持 Builder / 接口 / 业务方法 / 主动推送事件自动生成,与 Crow / Pigeon 保持一致。OnSentData / OnReceivedData 事件转发:Crow / Pigeon / Sparrow 三种模式均已支持,无需手写日志订阅。AddClientAsync / RemoveClientAsync:UDP 多对多场景需主动管理客户端,生成器已自动暴露到协议接口。[CrowResponse] 特性依赖,改为按命名约定自动配对(XxxReq + XxxRsp)。OpenAsync / CloseAsync。CS0050。Result 属性的 Response,避免 CS0050。ActivelyPushResponse 特性,支持主动推送事件自动生成。Communication 通讯库是 .NET 下通用高扩展性的通讯中间件,开箱即用,易于扩展,可显著提升上位机通讯开发效率,减少代码出错概率并提升系统健壮性。适合各类工控、物联网、业务信息系统场景。
立即集成,专注业务,高效通讯!
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 net5.0 was computed. net5.0-windows net5.0-windows was computed. net6.0 net6.0 was computed. net6.0-android net6.0-android was computed. net6.0-ios net6.0-ios was computed. net6.0-maccatalyst net6.0-maccatalyst was computed. net6.0-macos net6.0-macos was computed. net6.0-tvos net6.0-tvos was computed. net6.0-windows net6.0-windows was computed. net7.0 net7.0 was computed. net7.0-android net7.0-android was computed. net7.0-ios net7.0-ios was computed. net7.0-maccatalyst net7.0-maccatalyst was computed. net7.0-macos net7.0-macos was computed. net7.0-tvos net7.0-tvos was computed. net7.0-windows net7.0-windows was computed. net8.0 net8.0 was computed. net8.0-android net8.0-android was computed. net8.0-browser net8.0-browser was computed. net8.0-ios net8.0-ios was computed. net8.0-maccatalyst net8.0-maccatalyst was computed. net8.0-macos net8.0-macos was computed. net8.0-tvos net8.0-tvos was computed. net8.0-windows net8.0-windows was computed. net9.0 net9.0 was computed. net9.0-android net9.0-android was computed. net9.0-browser net9.0-browser was computed. net9.0-ios net9.0-ios was computed. net9.0-maccatalyst net9.0-maccatalyst was computed. net9.0-macos net9.0-macos was computed. net9.0-tvos net9.0-tvos was computed. net9.0-windows net9.0-windows was computed. net10.0 net10.0 is compatible. net10.0-android net10.0-android was computed. net10.0-browser net10.0-browser was computed. net10.0-ios net10.0-ios was computed. net10.0-maccatalyst net10.0-maccatalyst was computed. net10.0-macos net10.0-macos was computed. net10.0-tvos net10.0-tvos was computed. net10.0-windows net10.0-windows was computed. |
| .NET Core | netcoreapp2.0 netcoreapp2.0 was computed. netcoreapp2.1 netcoreapp2.1 was computed. netcoreapp2.2 netcoreapp2.2 was computed. netcoreapp3.0 netcoreapp3.0 was computed. netcoreapp3.1 netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.0 netstandard2.0 is compatible. netstandard2.1 netstandard2.1 was computed. |
| .NET Framework | net461 net461 was computed. net462 net462 was computed. net463 net463 was computed. net47 net47 was computed. net471 net471 was computed. net472 net472 was computed. net48 net48 was computed. net481 net481 was computed. |
| MonoAndroid | monoandroid monoandroid was computed. |
| MonoMac | monomac monomac was computed. |
| MonoTouch | monotouch monotouch was computed. |
| Tizen | tizen40 tizen40 was computed. tizen60 tizen60 was computed. |
| Xamarin.iOS | xamarinios xamarinios was computed. |
| Xamarin.Mac | xamarinmac xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos xamarinwatchos was computed. |
This package is not used by any NuGet packages.
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated | |
|---|---|---|---|
| 10.6.2 | 111 | 5/28/2026 | |
| 10.6.1 | 104 | 5/28/2026 | |
| 10.6.0 | 104 | 5/27/2026 | |
| 10.5.1 | 75 | 5/25/2026 | |
| 10.5.0 | 98 | 5/25/2026 | |
| 10.4.11 | 109 | 5/20/2026 | |
| 10.4.10 | 104 | 5/19/2026 | |
| 10.4.9 | 100 | 5/19/2026 | |
| 10.4.8 | 98 | 5/18/2026 | |
| 10.4.7 | 97 | 5/18/2026 | |
| 10.4.6 | 98 | 5/15/2026 | |
| 10.4.5 | 94 | 5/14/2026 | |
| 10.4.3 | 101 | 5/14/2026 | |
| 10.4.1 | 97 | 5/11/2026 | |
| 10.4.0 | 102 | 5/11/2026 | |
| 10.3.1 | 101 | 5/7/2026 | |
| 10.3.0 | 94 | 5/7/2026 | |
| 10.2.3 | 93 | 5/6/2026 | |
| 10.2.2 | 95 | 4/30/2026 | |
| 10.2.1 | 110 | 4/30/2026 | 10.2.1 is deprecated because it has critical bugs. |
同步版本号至 10.6.2
优化经典蓝牙客户端 IsOpen 判定,移除 socket Poll/Available 轮询探测,避免状态检查误判;断连继续由 TrackingPipeReader 读完成/异常和发送异常标记。