eddielth/iec104

GitHub: eddielth/iec104

一个用Go语言实现的IEC 60870-5-104工业协议客户端库,用于SCADA系统与变电站自动化设备之间的通信。

Stars: 54 | Forks: 4

# IEC 60870-5-104 (IEC 104) Go 库 [![Go 参考](https://pkg.go.dev/badge/github.com/eddielth/iec104.svg)](https://pkg.go.dev/github.com/eddielth/iec104) [![许可证: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 一个健壮高效的 IEC 60870-5-104(IEC 104)协议 Go 实现。该库提供了高级客户端接口,用于与 RTU、网关和其他电力系统自动化设备进行通信。 ## 功能特性 - **完整客户端实现**:支持 I 帧、S 帧和 U 帧(STARTDT、STOPDT、TESTFR)。 - **连接管理**: - 支持可配置退避策略的自动重连。 - 心跳(TESTFR)机制以保持连接稳定。 - 线程安全设计,支持并发操作。 - **协议支持**: - 总查询(GI)。 - 通过轮询或自发报告进行数据采集。 - 命令:单点、双点和设定点(归一化、标度、浮点)。 - 时钟同步。 - **灵活的数据处理**:通过用户定义的处理器进行异步数据接收。 - **日志记录**:内置日志支持,用于调试和监控。 ## 安装 ``` go get github.com/eddielth/iec104 ``` ## 支持的 ASDU 类型 该库支持多种应用服务数据单元(ASDU)类型: | 类型 ID | 描述 | | :--- | :--- | | `0x01` | 单点指示 | | `0x03` | 双点指示 | | `0x09` | 测量值,归一化值带质量描述 | | `0x0D` | 测量值,短浮点数带质量描述 | | `0x2D` | 单点命令 | | `0x2E` | 双点命令 | | `0x30` | 设定点命令,归一化值 | | `0x32` | 设定点命令,短浮点数 | | `0x64` | 总查询命令 | | `0x67` | 时钟同步命令 | | ... | 更多类型(详见 `asdu.go`) | ## 快速入门 ### 带数据处理器的基础客户端 ``` package main import ( "log" "time" "github.com/eddielth/iec104" ) func main() { // Create a new client client := iec104.NewClient("127.0.0.1:2404", 5*time.Second) // Enable logging to console client.EnableLog() // Set a handler for incoming ASDU data client.SetOnDataHandler(func(asdu *iec104.ASDU) { log.Printf("Received ASDU: Type 0x%02X, Cause %d, CommonAddr %d", asdu.TypeID, asdu.Cause, asdu.CommonAddr) for _, obj := range asdu.InfoObjects { log.Printf(" Object Address: %d, Value: %v", obj.Address, obj.Value) } }) // Connect to the server if err := client.Connect(); err != nil { log.Fatalf("Failed to connect: %v", err) } defer client.Close() // Perform General Interrogation if _, err := client.GeneralInterrogation(1); err != nil { log.Printf("GI failed: %v", err) } // Keep the application running select {} } ``` ### 发送命令 ``` // Send a Single Command (ON) err := client.SendSingleCommand(1, 10001, true, false) // Send a Setpoint Command (Short Floating Point) err := client.SendSetpointCommand(1, 20001, 123.45) ``` ## 示例 请查看 `example/` 目录: - `example/main.go`:基础客户端演示。 - `example/sim_server/`:用于测试的模拟 IEC 104 服务器。 ## 许可证 本项目基于 MIT 许可证授权 - 详见 [LICENSE](LICENSE) 文件。 ## 免责声明 本库仅供教育和专业使用。在生产环境中,请务必确保与您的特定硬件和安全协议的兼容性。
标签:EVTX分析, Go, Golang, IEC 104, IEC 60870, IEC 60870-5-104, RTU, Ruby工具, SCADA, SCADA 协议, 协议实现, 协议栈, 变电站自动化, 命令控制, 哈希传递, 安全编程, 客户端库, 工业自动化, 工业通信, 数据采集, 日志审计, 电力系统, 电力通信, 线程安全, 自动化控制