📦 Snet 框架
包含完整 Snet 工业通信框架的主仓库。它包含 36+ 个 NuGet 包,涵盖 35+ 种工业协议、5 种消息中间件类型和 12 个传输层——全部基于统一的 API。
关键信息:
- 目标框架:.NET 8.0 / .NET 10.0
- 开源协议:MIT
- 36+ 个 NuGet 包
- 130+ 协议变体
- 5 种中间件类型
- 12 个传输层
- 通过 AssemblyLoadContext 实现插件热加载
子项目表(包名称 + 描述):
| 包名 | 描述 |
|---|---|
| Snet.Core | 基础层 — CoreUnify、DaqAbstract、MqAbstract、CommunicationAbstract、单例池、事件、WebAPI |
| Snet.Model | 契约层 — IDaq、IMq、ICommunication 接口、数据模型、枚举、特性 |
| Snet.Utility | 工具层 — 150+ 扩展方法、JSON/XML/Protobuf 序列化、处理器 |
| Snet.Log | 结构化日志(基于 Serilog,6 个级别) |
| Snet.Modbus | Modbus TCP/UDP/RTU/ASCII(6 种变体) |
| Snet.Siemens | 西门子 S7/PPI/S7Plus/FetchWrite(10 种变体) |
| Snet.Mitsubishi | 三菱 MC/FX/A1E/A3C/CIP/Links(14 种变体) |
| Snet.Omron | 欧姆龙 Fins/CIP/HostLink/CMode(8 种变体) |
| Snet.AllenBradley | Allen-Bradley CIP/PCCC/SLC/DF1/Micro800(6 种变体) |
| (以及 25+ 个更多协议驱动) | |
| Snet.Mqtt | MQTT 客户端 + 代理 + WebSocket 代理 |
| Snet.Kafka | Kafka 生产者 + 消费者 + AdminClient |
| Snet.RabbitMQ | RabbitMQ Direct/Topic/Fanout/Headers |
| Snet.NetMQ | ZeroMQ 发布/订阅 |
| Snet.Netty | TCP 客户端 + 服务端(自定义帧格式) |
▶️ 快速开始
dotnet add package Snet.Modbus
using Snet.Modbus;
using Snet.Model.data;
using Snet.Model.@enum;
// 1. 配置
var basics = new ModbusData.Basics { IpAddress = "192.168.1.100", Port = 502, Station = 1 };
// 2. 实例化 —— `new` + `await using` 用于独立使用时的释放语义。
// 如需单例池模式(共享实例,上限 255),请改用 `await ModbusOperate.InstanceAsync(basics)`。
await using var modbus = new ModbusOperate(basics);
// 3. 连接
await modbus.OnAsync();
// 4. 读取
var result = await modbus.ReadAsync(new Address(new AddressDetails("Temperature", "40001", DataType.Float)));
Console.WriteLine(result.GetSource<AddressValue>().ResultValue);
// 5. 断开 — using 自动调用 DisposeAsync
⚙️ 安装与配置
安装方式 — 只需安装所需的协议驱动。核心包(Snet.Core、Snet.Model、Snet.Log、Snet.Utility)会作为传递依赖自动引入:
# 安装协议驱动 — 核心包会传递引入
dotnet add package Snet.Modbus
dotnet add package Snet.Mqtt
dotnet add package Snet.Siemens
核心配置通过 Basics 模式完成 — 每个驱动都有自己对应的 {Driver}Data.Basics 类。
🧠 核心概念
- 统一 API —
IDaq(15 个子接口)用于数据采集,IMq(12 个子接口)用于消息通信,ICommunication(13 个子接口)用于传输层 - 单例池 —
CoreUnify<T,B>管理最多 255 个并发实例 - 事件驱动 — 3 对同步/异步事件:OnData、OnInfo、OnLanguage
- 内置 WebAPI — 每个驱动自动暴露 6 个 HTTP 端点
- 插件热加载 — 基于 AssemblyLoadContext 的可回收程序集加载
- 双缓存 — 进程内存(MemoryCache)+ 共享内存(MemoryMappedFile)
- 虚拟地址 — 5 种模拟模式用于离线测试
- 自动 MQ 转发 — AddressMqParam 配置从任意驱动自动转发到 MQ
📚 子项目
每个子项目都有独立的详细文档:
基础层:
| 章节 | 内容 |
|---|---|
| 核心引擎 | DaqAbstract、MqAbstract、CommunicationAbstract、缓存、通道、事件等 |
| API 参考 | IDaq、IMq、ICommunication、CoreUnify、OperateResult、数据模型 |
协议层:
| 章节 | 内容 |
|---|---|
| 协议概述 | 35+ 种工业协议驱动(西门子、Modbus、三菱等) |
中间件层:
| 章节 | 内容 |
|---|---|
| 中间件概述 | MQTT、Kafka、RabbitMQ、NetMQ、Netty |
配套库:
| 章节 | 内容 |
|---|---|
| RPC 概述 | 基于 DotNetty 的高性能 RPC 框架 |
| Redis 概述 | StackExchange.Redis 封装,提供统一 API |
| WPF 概述 | 现代 WPF UI 库,支持 MVVM/主题/本地化 |
💻 代码示例
多协议统一 API 示例:
// 同一套代码模式适用于所有 30+ 协议
async Task ReadFromDevice<T>(T operate) where T : IDaq
{
await operate.OnAsync();
var addr = new Address(new AddressDetails("Reading", "40001", DataType.Float));
var result = await operate.ReadAsync(addr);
if (result.Status)
Console.WriteLine(result.GetSource<ConcurrentDictionary<string, AddressValue>>()
.First().Value.ResultValue);
await operate.OffAsync();
}
❓ 常见问题
- 支持多少种协议? — 35+ 种协议,130+ 种变体
- 使用什么许可证? — MIT,可免费用于商业用途
- 如何添加新协议? — 扩展 DaqAbstract,通过插件系统注册
- 可以在运行时切换协议吗? — 可以,所有驱动共享相同的 IDaq 接口
- 有 AI 工具支持吗? — 有,GitHub 上的 Snet AI Skills 可根据自然语言生成完整项目代码
📅 版本历史
| 日期 | 变更 |
|---|---|
| 最新 | 当前版本 — 支持 .NET 8 / .NET 10,36 个包,130+ 协议变体 |
