mz-automation/libiec61850
GitHub: mz-automation/libiec61850
libIEC61850 是一个用 C 语言编写的开源 IEC 61850 协议客户端/服务器库,为电力系统自动化设备提供 MMS、GOOSE、SV 等标准通信协议的实现。
Stars: 1198 | Forks: 604
# README libIEC61850
本文件是 **libIEC61850** (版本 1.6.2) 文档的一部分。更多文档请访问 http://libiec61850.com。
API 文档可在此处找到:
* C API: https://support.mz-automation.de/doc/libiec61850/c/latest/
* .NET API: https://support.mz-automation.de/doc/libiec61850/net/latest/
也建议您查看示例,以了解如何使用该库。
目录:
* [概述](#overview)
* [功能](#features)
* [示例](#examples)
* [构建和运行示例](#building-and-running-the-examples-with-the-provided-makefiles)
* [构建支持 TLS 的库](#building-the-library-with-tls-support)
* [安装库和 API 头文件](#installing-the-library-and-the-api-headers)
* [在 Windows 上构建支持 GOOSE 的库](#building-on-windows-with-goose-support)
* [使用 cmake 构建脚本构建](#building-with-the-cmake-build-script)
* [通过 sqlite 使用日志服务](#using-the-log-service-with-sqlite)
* [C# API](#c-api)
* [实验性 Python 绑定](#experimental-python-bindings)
* [授权许可](#commercial-licenses-and-support)
* [贡献](#contributing)
## 概述
libiec61850 是一个开源 (GPLv3) 的 IEC 61850 客户端和服务器库实现,支持 MMS、GOOSE、SV 和 R-Session 协议。它使用 C 语言编写(遵循 C99 标准),以提供最大的可移植性。它可用于在嵌入式系统和运行 Linux、Windows 和 MacOS 的 PC 上实现符合 IEC 61850 标准的客户端和服务器应用程序。其中包含一组简单的示例应用程序,可作为实现您自己的 IEC 61850 设备或与 IEC 61850 设备通信的起点。该库已成功应用于许多商业软件产品和设备中。
对于商业项目,授权许可和支持由 MZ Automation GmbH 提供。请联系 info@mz-automation.de 获取有关许可选项的更多详细信息。
## 功能
该库支持以下 IEC 61850 协议功能:
* MMS 客户端/服务器,GOOSE (IEC 61850-8-1)
* 采样值 (SV - IEC 61850-9-2)
* 支持缓存和非缓存报告
* 在线报告控制块配置
* 数据访问服务(获取数据,设置数据)
* 在线数据模型发现与浏览
* 所有数据集服务(获取值,设置值,浏览)
* 动态数据集服务(创建和删除)
* 日志服务
* 用于连接自定义数据库的灵活 API
* 附带 SQLite 实现
* MMS 文件服务(浏览,获取文件,设置文件,删除/重命名文件)
* 下载 COMTRADE 文件所需
* 定值组处理
* 支持服务跟踪
* GOOSE 和 SV 控制块处理
* TLS 支持 (IEC 62351-3/4)
* R-Session 协议支持 (R-GOOSE/R-SMV - IEC 61850-8-1)
* 用于测试目的的简单 SNTP 客户端 (IEC 61850-5)
* C、C#/.NET 和实验性 Python API
## 示例
当使用 CMake 构建库时,示例会自动构建。
**注意:** 大多数示例旨在展示该库的特定功能。它们被设计为尽可能简单地展示此功能,可能缺少实际应用程序中必须具备的错误处理!
## 使用提供的 makefile 构建和运行示例
在项目根目录下输入:
```
make examples
```
如果构建成功,您可以在项目的根目录中找到一些二进制文件。您还可以在 "build" 目录中找到该库的二进制版本 ("libiec61850.a")。
在示例文件夹中运行示例应用程序。例如,在 Linux 命令行中:
```
cd examples/server_example_basic_io
sudo ./server_example_basic_io
```
您可以使用通用客户端或提供的客户端示例应用程序来测试服务器示例。
## 构建支持 TLS 的库
该库具有与具体实现无关的 TLS 配置接口。
目前它附带该接口的两种不同实现:
- mbedtls 2.28 LTS 版本,支持最高至 TLS 1.2 的 TLS 版本
- mbedtls 3.6.0 版本,仅支持 TLS 1.2 和 1.3
### mbedtls 2.28
1. 下载、解压并将 mbedtls-2.28 复制到 `third_party/mbedtls` 文件夹中。
**注意:** 当前版本支持 mbedtls 2.28 版本。当您从 https://tls.mbed.org/ 下载源代码归档时,必须将解压后的文件夹重命名为 "mbedtls-2.28"。
2. 在 libiec61850 主文件夹中运行:
```
make WITH_MBEDTLS=1
```
使用 CMake 时,如果存在 `third_party/mbedtls/mbedtls-2.28` 文件夹,该库将自动附带 TLS 支持进行构建。
### mbedtls 3.6
或者,您也可以使用 mbedtls 3.6。
1. 下载、解压并将 mbedtls-3.6.0 复制到 `third_party/mbedtls` 文件夹中
2. 在 libiec61850 主文件夹中运行:
```
make WITH_MBEDTLS3=1
```
使用 CMake 时,如果存在 `third_party/mbedtls/mbedtls-3.6.0` 文件夹,该库将自动附带 TLS 支持进行构建。
## 安装库和 API 头文件
make 和 cmake 构建脚本提供了一个安装目标 (install target)。此目标将 API 头文件和静态库复制到用于存放头文件的单个目录 (`INSTALL_PREFIX/include`) 和静态库目录 (`INSTALL_PREFIX/lib`) 中。此功能使得将 libiec61850 集成到外部应用程序变得更加容易,因为您只需将一个简单的 include 目录添加到您选择的构建工具中即可。
可以通过以下命令调用:
```
make install
```
make 构建脚本的默认安装目录是 ".install"。
您可以通过设置 INSTALL_PREFIX 环境变量来修改此目录,例如:
```
make INSTALL_PREFIX=/usr/local install
```
对于 cmake 构建脚本,您必须提供 CMAKE_INSTALL_PREFIX 变量。
## 在 Windows 上构建支持 GOOSE 的库
要在 Windows (10/11) 上构建库并运行支持 GOOSE 的 libiec61850 应用程序,需要第三方库。这是必要的,因为当前版本的 Windows 没有对原始套接字的可用支持。您可以在此处下载 WinPcap:http://www.winpcap.org。
1. 下载并安装 WinPcap。确保 WinPcap 驱动程序在开机时加载(您可以在 WinPcap 安装程序的最后一个界面上选择此选项)。
2. 重启系统(您也可以稍后再执行此操作,但在运行任何使用 GOOSE 的 libiec61850 应用程序之前,您需要重启或加载 WinPcap 驱动程序)。
3. 从此处下载 WinPcap 开发包:http://www.winpcap.org/install/bin/WpdPack_4_1_2.zip
4. 解压 zip 文件。将 WpdPack 目录中的 `Lib` 和 `Include` 文件夹复制到 libiec61850 的 `third_party/winpcap` 目录中。
## 使用 cmake 构建脚本构建
### 在 Linux 上构建
您必须安装构建工具和 cmake(例如,Ubuntu 20.04 上的 "build-essential" 和 "cmake" 包)。
执行以下命令:
```
mkdir build
cd build
cmake ..
make
```
可选地执行以下命令以将库和头文件安装到系统目录中:
```
sudo make install
```
### 可选的仅测试插桩
为了进行确定性测试(例如,针对 MMS 文件 ObtainFile 请求的超时行为),该库提供了一个仅用于测试的插桩 API,可用于修改标准行为。默认情况下此功能处于禁用状态,并且不包含在生产构建中。
通过 CMake 启用它:
```
cmake -DLIB61850_ENABLE_TEST_API=ON ..
```
启用后,一些特定于测试的 API 函数将可用(使用 `LIB61850_TEST_API` 属性导出)。
用法示例:
```
#ifdef LIB61850_ENABLE_TEST_API
/* Introduce 250 ms delay before each FileRead response */
MmsConnection_setFileReadArtificialDelay(conn, 250);
#endif
```
如果该选项为 OFF,相关符号和代码将被完全省略,对运行时行为或内存占用没有任何影响。
### 在 Windows 上使用 Visual Studio 构建
借助 CMake 构建脚本,可以创建独立于平台的项目描述,并让 CMake 为其他工具(如 Make 或 Visual Studio)生成特定的项目或构建文件。
如果您已安装 CMake,请打开命令提示符 (cmd.exe) 并在 libiec61850 文件夹中创建一个新的子目录。切换到该子目录。然后您就可以调用 CMake 了。作为命令行参数,您必须提供一个 "generator",CMake 使用它为实际的构建工具创建项目文件。
为 Visual Studio 2015 (32 位) 创建 "solution":
```
cmake -G "Visual Studio 14 2015" ..
```
要构建 64 位库,必须添加 "Win64" generator 选项:
```
cmake -G "Visual Studio 14 2015 Win64" ..
```
**注意:** 命令行末尾的 ".." 告诉 CMake 在哪里可以找到主构建脚本文件(名为 CMakeLists.txt)。这应该指向 libiec61850 文件夹,在我们的例子中是父目录 (..)。
根据系统的不同,您可能不需要为 CMake 命令提供 generator。
要选择一些配置选项,您可以使用 ccmake 或 cmake-gui。
对于较新版本的 Visual Studio,您可以使用以下命令之一(用于 64 位构建):
**Visual Studio 2017:**
```
cmake -G "Visual Studio 15 2017 Win64" ..
```
**Visual Studio 2019:**
```
cmake -G "Visual Studio 16 2019" .. -A x64
```
**Visual Studio 2022:**
```
cmake -G "Visual Studio 17 2022" .. -A x64
```
## 通过 sqlite 使用日志服务
该库提供对 IEC 61850 日志服务的支持。它为日志数据库提供了一个抽象接口。其中包含一个使用 SQLite 进行日志记录的驱动程序。该驱动程序可以看作是如何使用抽象日志接口的示例。
您可以通过将 `src/logging/drivers/sqlite/log_storage_sqlite.c` 文件包含到您的应用程序构建中来使用该驱动程序。
在 Ubuntu Linux(以及类似的 Linux 发行版)上,只需从标准存储库安装 SQLite 开发包即可。对于其他操作系统(例如 Windows)和交叉编译,建议下载 SQLite 的合并源代码(从 https://www.sqlite.org/download.html 获取)并将其复制到 `third_party/sqlite` 文件夹中。
在 Windows 上,CMake 脚本将检测 SQLite 源代码,并会自动创建用于日志记录的示例项目。
## C# API
在 `dotnet` 文件夹中可以找到 C#/.NET 封装、示例以及 Visual Studio/MonoDevelop 项目文件。示例和 C# 封装 API 可以在 .NET 或 Mono 上构建和运行。
## 实验性 Python 绑定
可以使用 SWIG 和 CMake 创建实验性 Python 绑定。
要启用绑定,您必须使用 ccmake 或 cmake-gui 选择 Python 配置选项。
**注意:** 我们不提供任何关于 Python 绑定的官方支持!
## 商业许可和支持
支持和商业许可选项由 MZ Automation GmbH 提供。请联系 info@mz-automation.de 获取更多详细信息。
## 贡献
如果您想为该库的改进和开发做出贡献,请发送评论、功能请求、错误报告或补丁。
超出微小修改的贡献需要您签署贡献者许可协议。在您计划进行此类贡献之前,请联系 info@libiec61850.com。
**请注意:** 我们不接受针对 GitHub 仓库 (https://github.com/mz-automation/libiec61850) 的 Pull request。GitHub 仓库仅用作只读存档。
标签:Bash脚本, C/C++, GOOSE, IEC61850, impacket, MMS协议, 事务性I/O, 客户端加密, 工业互联网, 工控协议, 物联网, 逆向工具