概览 - Snet Docs

📦 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.CoreSnet.ModelSnet.LogSnet.Utility)会作为传递依赖自动引入:

# 安装协议驱动 — 核心包会传递引入
dotnet add package Snet.Modbus
dotnet add package Snet.Mqtt
dotnet add package Snet.Siemens

核心配置通过 Basics 模式完成 — 每个驱动都有自己对应的 {Driver}Data.Basics 类。

🧠 核心概念

  1. 统一 APIIDaq(15 个子接口)用于数据采集,IMq(12 个子接口)用于消息通信,ICommunication(13 个子接口)用于传输层
  2. 单例池CoreUnify<T,B> 管理最多 255 个并发实例
  3. 事件驱动 — 3 对同步/异步事件:OnData、OnInfo、OnLanguage
  4. 内置 WebAPI — 每个驱动自动暴露 6 个 HTTP 端点
  5. 插件热加载 — 基于 AssemblyLoadContext 的可回收程序集加载
  6. 双缓存 — 进程内存(MemoryCache)+ 共享内存(MemoryMappedFile)
  7. 虚拟地址 — 5 种模拟模式用于离线测试
  8. 自动 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();
}

❓ 常见问题

  1. 支持多少种协议? — 35+ 种协议,130+ 种变体
  2. 使用什么许可证? — MIT,可免费用于商业用途
  3. 如何添加新协议? — 扩展 DaqAbstract,通过插件系统注册
  4. 可以在运行时切换协议吗? — 可以,所有驱动共享相同的 IDaq 接口
  5. 有 AI 工具支持吗? — 有,GitHub 上的 Snet AI Skills 可根据自然语言生成完整项目代码

📅 版本历史

日期 变更
最新 当前版本 — 支持 .NET 8 / .NET 10,36 个包,130+ 协议变体