# EasyDeviceCommunication **Repository Path**: yoodoo/EasyDeviceCommunication ## Basic Information - **Project Name**: EasyDeviceCommunication - **Description**: EasyDeviceCommunication 是一个高度可扩展的设备物联通信模块,支持多种通信协议和传输方式,特别针对工业设备通信场景进行优化。 - **Primary Language**: C# - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2025-05-30 - **Last Updated**: 2025-08-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Uantek 设备物联通信模块 ## 概述 Uantek.Device.Communication 是一个高度可扩展的设备物联通信模块,支持多种通信协议和传输方式,特别针对工业设备通信场景进行优化。 ## 主要特性 - **多协议支持**:内置 Modbus TCP/RTU 协议,支持自定义协议扩展 - **多传输方式**:支持 TCP、UDP、串口等传输方式 - **动态加载**:支持驱动程序的动态加载和热插拔 - **高性能**:异步通信,支持高并发设备连接 - **易于扩展**:基于接口设计,便于添加新的协议和传输方式 - **完善的日志**:集成 Microsoft.Extensions.Logging,提供详细的运行日志 - **错误处理**:完善的异常处理和错误恢复机制 ## 架构设计 ``` ┌─────────────────────────────────────────────────────────────┐ │ 应用层 (Application Layer) │ ├─────────────────────────────────────────────────────────────┤ │ 服务层 (Service Layer) │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ 设备通信服务 │ │ 数据采集服务 │ │ MQTT发布服务 │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 协议层 (Protocol Layer) │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ Modbus协议 │ │ 自定义协议1 │ │ 自定义协议N │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 传输层 (Transport Layer) │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ TCP传输 │ │ 串口传输 │ │ UDP传输 │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ ├─────────────────────────────────────────────────────────────┤ │ 工具层 (Utility Layer) │ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ │ │ 驱动加载器 │ │ 连接字符串构建器 │ │ 配置管理器 │ │ │ └─────────────────┘ └─────────────────┘ └─────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ``` ## 核心组件 ### 1. 协议层 (Protocol Layer) #### IDeviceProtocol 接口 定义设备协议的基本功能: - 数据解析 - 命令构建 - 数据验证 #### BaseDeviceProtocol 基类 提供协议实现的基础功能: - 通用日志记录 - 性能监控 - 异常处理 #### ModbusProtocol 实现 完整的 Modbus 协议实现: - 支持所有标准功能码 - 自动 CRC 校验 - 异常响应处理 ### 2. 传输层 (Transport Layer) #### ICommunicationTransport 接口 定义通信传输的基本功能: - 连接管理 - 数据发送/接收 - 状态监控 #### 传输实现 - **TcpTransport**:TCP 网络传输 - **SerialTransport**:串口传输 - **UdpTransport**:UDP 网络传输 - **ModbusTcpTransport**:Modbus TCP 专用传输 - **ModbusRtuTransport**:Modbus RTU 专用传输 ### 3. 工具层 (Utility Layer) #### DriverLoader 动态驱动加载器: - 运行时加载程序集 - 创建驱动实例 - 实例缓存管理 #### ConnectionStringBuilder 连接字符串构建器: - 类型安全的参数设置 - 多种连接方式支持 - URL 格式解析 ## 快速开始 ### 1. 安装依赖 ```xml ``` ### 2. Modbus TCP 示例 ```csharp using Microsoft.Extensions.Logging; using Uantek.Device.Communication.Devices; using Uantek.Device.Communication.Protocols.Modbus; using Uantek.Device.Communication.Utilities; // 创建日志记录器 using var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole()); var logger = loggerFactory.CreateLogger(); // 创建连接字符串 var connectionBuilder = new ConnectionStringBuilder(logger) .SetModbusTcpParameters("192.168.1.100", 502, 1, 5000); // 创建协议和传输实例 var protocol = new ModbusProtocol(logger); var transport = new ModbusTcpTransport(logger); // 创建设备实例 using var device = new ModbusDevice("Device001", "Modbus TCP设备", protocol, transport, logger); // 连接设备 var connectionParams = connectionBuilder.GetParameters(); var connectResult = await device.ConnectAsync(connectionParams); if (connectResult.Success) { // 读取保持寄存器 var readResult = await device.ReadHoldingRegistersAsync(0, 10); if (readResult.Success && readResult.Data != null) { Console.WriteLine($"读取数据: {string.Join(", ", readResult.Data)}"); } // 写单个寄存器 var writeResult = await device.WriteSingleRegisterAsync(0, 12345); if (writeResult.Success) { Console.WriteLine("写入成功"); } } ``` ### 3. Modbus RTU 示例 ```csharp // 创建连接字符串 var connectionBuilder = new ConnectionStringBuilder(logger) .SetModbusRtuParameters("COM3", 9600, 1, 8, "One", "None", 5000); // 创建协议和传输实例 var protocol = new ModbusProtocol(logger); var transport = new ModbusRtuTransport(logger); // 创建设备实例 using var device = new ModbusDevice("Device002", "Modbus RTU设备", protocol, transport, logger); // 连接和操作设备 var connectionParams = connectionBuilder.GetParameters(); await device.ConnectAsync(connectionParams); // 读取线圈状态 var coilsResult = await device.ReadCoilsAsync(0, 16); if (coilsResult.Success && coilsResult.Data != null) { Console.WriteLine($"线圈状态: {string.Join(", ", coilsResult.Data.Select(b => b ? "1" : "0"))}"); } ``` ### 4. 动态驱动加载示例 ```csharp // 创建驱动加载器 var driverLoader = new DriverLoader(logger); // 加载程序集 var assemblyPath = "CustomDevice.dll"; if (driverLoader.LoadAssembly(assemblyPath)) { // 创建自定义协议实例 var customProtocol = driverLoader.CreateProtocolInstance( "CustomDevice", "CustomDevice.CustomProtocol", logger); if (customProtocol != null) { Console.WriteLine($"自定义协议加载成功: {customProtocol.ProtocolName}"); } } ``` ## 扩展开发 ### 1. 自定义协议开发 ```csharp public class CustomProtocol : BaseDeviceProtocol { public override string ProtocolName => "CustomProtocol"; public override string Version => "1.0.0"; protected override async Task ParseDataAsync(byte[] rawData) { // 实现自定义数据解析逻辑 // ... } protected override async Task BuildCommandDataAsync(string command, Dictionary? parameters) { // 实现自定义命令构建逻辑 // ... } protected override bool ValidateDataInternal(byte[] data) { // 实现自定义数据验证逻辑 // ... } public override IEnumerable GetSupportedTransportTypes() { return new[] { "TCP", "Serial", "UDP" }; } } ``` ### 2. 自定义传输开发 ```csharp public class CustomTransport : BaseCommunicationTransport { public override string TransportType => "CustomTransport"; protected override async Task ConnectInternalAsync( Dictionary connectionParameters, CancellationToken cancellationToken) { // 实现自定义连接逻辑 // ... } protected override async Task DisconnectInternalAsync() { // 实现自定义断开逻辑 // ... } protected override CommunicationResult SendDataInternal(byte[] data) { // 实现自定义数据发送逻辑 // ... } // 实现其他抽象方法... } ``` ## 配置说明 ### 连接字符串格式 #### Modbus TCP ``` modbustcp://192.168.1.100:502?unit=1&timeout=5000 ``` #### Modbus RTU ``` modbusrtu://COM3?baudrate=9600&databits=8&stopbits=One&parity=None&slave=1&timeout=5000 ``` #### TCP ``` tcp://192.168.1.100:502?connecttimeout=5000&receivetimeout=5000&sendtimeout=5000 ``` #### 串口 ``` serial://COM3?baudrate=9600&databits=8&stopbits=One&parity=None&readtimeout=5000&writetimeout=5000 ``` ### 配置参数说明 | 参数名 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | Host | string | 127.0.0.1 | 主机地址 | | Port | int | 502 | 端口号 | | UnitId | byte | 1 | Modbus 单元标识符 | | SlaveId | byte | 1 | Modbus 从站地址 | | PortName | string | COM1 | 串口名称 | | BaudRate | int | 9600 | 波特率 | | DataBits | int | 8 | 数据位 | | StopBits | string | One | 停止位 | | Parity | string | None | 校验位 | | Timeout | int | 5000 | 超时时间(毫秒) | ## 性能优化 ### 1. 连接池管理 ```csharp // 使用连接池减少连接开销 var connectionPool = new ConcurrentDictionary(); ``` ### 2. 批量操作 ```csharp // 批量读取多个寄存器 var batchResult = await device.ReadHoldingRegistersAsync(0, 100); ``` ### 3. 异步并发 ```csharp // 并发处理多个设备 var tasks = devices.Select(device => device.ReadDataAsync()).ToArray(); var results = await Task.WhenAll(tasks); ``` ## 错误处理 ### 1. 连接错误 ```csharp var connectResult = await device.ConnectAsync(parameters); if (!connectResult.Success) { logger.LogError("连接失败: {Message}", connectResult.Message); // 处理连接失败逻辑 } ``` ### 2. 通信错误 ```csharp try { var result = await device.ReadHoldingRegistersAsync(0, 10); } catch (TimeoutException ex) { logger.LogWarning("通信超时: {Message}", ex.Message); // 处理超时逻辑 } ``` ### 3. 协议错误 ```csharp if (result.ErrorCode == "ModbusException") { logger.LogWarning("Modbus协议异常: {Message}", result.Message); // 处理协议异常逻辑 } ``` ## 日志配置 ### 1. 控制台日志 ```csharp using var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole().SetMinimumLevel(LogLevel.Debug)); ``` ### 2. 文件日志 ```csharp using var loggerFactory = LoggerFactory.Create(builder => builder.AddFile("logs/device-communication-{Date}.txt")); ``` ### 3. 结构化日志 ```csharp logger.LogInformation("设备 {DeviceId} 连接状态: {IsConnected}", deviceId, isConnected); ``` ## 最佳实践 ### 1. 资源管理 - 始终使用 `using` 语句或手动调用 `Dispose()` 释放资源 - 及时断开不需要的设备连接 - 监控内存使用情况 ### 2. 异常处理 - 捕获并处理特定的异常类型 - 记录详细的错误日志 - 实现重试机制 ### 3. 性能监控 - 监控连接状态和通信延迟 - 使用性能计数器跟踪吞吐量 - 定期检查设备健康状态 ### 4. 安全考虑 - 验证输入参数 - 限制网络访问权限 - 使用安全的通信协议 ## 故障排除 ### 1. 连接问题 - 检查网络连通性 - 验证端口是否开放 - 确认设备地址和端口配置 ### 2. 通信问题 - 检查协议参数配置 - 验证数据格式 - 检查超时设置 ### 3. 性能问题 - 调整连接池大小 - 优化批量操作 - 检查网络延迟 ## 许可证 本模块遵循 MIT 许可证。 ## 贡献 欢迎提交 Issue 和 Pull Request 来改进这个模块。 ## 联系方式 如有问题或建议,请联系开发团队。