eddielth/iec104
GitHub: eddielth/iec104
一个用Go语言实现的IEC 60870-5-104工业协议客户端库,用于SCADA系统与变电站自动化设备之间的通信。
Stars: 54 | Forks: 4
# IEC 60870-5-104 (IEC 104) Go 库
[](https://pkg.go.dev/github.com/eddielth/iec104)
[](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 协议, 协议实现, 协议栈, 变电站自动化, 命令控制, 哈希传递, 安全编程, 客户端库, 工业自动化, 工业通信, 数据采集, 日志审计, 电力系统, 电力通信, 线程安全, 自动化控制