libIEC61850:开源IEC 61850协议库使用指南

项目概述

【免费下载链接】libiec61850Official repository for libIEC61850, the open-source library for the IEC 61850 protocols 项目地址: https://gitcode.com/gh_mirrors/li/libiec61850

libIEC61850是由MZ Automation开发的开放源码库,主要用于实现IEC 61850标准中的通信协议。该库完全符合IEC 61850标准,支持MMS(制造报文规范)、GOOSE(通用面向对象变电站事件)及SV(采样值)等关键协议。

libIEC61850提供了客户端和服务器端的应用编程接口(API),采用C语言(符合C99标准)开发,确保最大程度的可移植性。它可以在嵌入式系统和运行Linux、Windows、MacOS的PC上使用,已成功应用于多个商业软件产品和设备中。

核心特性

  • 协议支持完整:支持MMS客户端/服务器、GOOSE(IEC 61850-8-1)、采样值(SV - IEC 61850-9-2)
  • 报告功能强大:支持缓冲和非缓冲报告、在线报告控制块配置
  • 数据服务全面:数据访问服务(获取数据、设置数据)、在线数据模型发现和浏览
  • 数据集服务:所有数据集服务(获取值、设置值、浏览)、动态数据集服务(创建和删除)
  • 日志服务灵活:提供连接自定义数据库的抽象接口,附带sqlite实现
  • 文件服务完善:MMS文件服务(浏览、获取文件、设置文件、删除/重命名文件)
  • 安全特性:支持TLS加密通信(IEC 62351-3/4),保护数据传输过程
  • 多语言支持:提供C和C#/.NET API接口

环境搭建与构建

克隆仓库

git clone https://gitcode.com/gh_mirrors/li/libiec61850.git cd libiec61850 

使用CMake构建

mkdir build cd build cmake .. make sudo make install # 安装至系统目录 

构建示例程序

在项目根目录下执行:

make examples 

构建成功后,可以在项目根目录和build目录中找到二进制文件和静态库文件(libiec61850.a)。

快速入门示例

服务器端示例

以下是一个基本的IEC 61850服务器示例,展示如何创建服务器实例并处理控制命令:

#include "iec61850_server.h" #include "hal_thread.h" #include <signal.h> #include <stdlib.h> #include <stdio.h> #include <math.h> #include "static_model.h" static int running = 0; static IedServer iedServer = NULL; void sigint_handler(int signalId) { running = 0; } static ControlHandlerResult controlHandlerForBinaryOutput(ControlAction action, void* parameter, MmsValue* value, bool test) { if (test) return CONTROL_RESULT_FAILED; if (MmsValue_getType(value) == MMS_BOOLEAN) { printf("received binary control command: "); if (MmsValue_getBoolean(value)) printf("on\n"); else printf("off\n"); } else return CONTROL_RESULT_FAILED; uint64_t timeStamp = Hal_getTimeInMs(); IedServer_updateUTCTimeAttributeValue(iedServer, parameter, timeStamp); IedServer_updateAttributeValue(iedServer, parameter, value); return CONTROL_RESULT_OK; } int main(int argc, char** argv) { int tcpPort = 102; printf("Using libIEC61850 version %s\n", LibIEC61850_getVersionString()); /* 创建服务器配置对象 */ IedServerConfig config = IedServerConfig_create(); /* 设置报告缓冲区大小 */ IedServerConfig_setReportBufferSize(config, 200000); /* 创建IEC 61850服务器实例 */ iedServer = IedServer_createWithConfig(&iedModel, NULL, config); IedServerConfig_destroy(config); /* 设置服务器标识信息 */ IedServer_setServerIdentity(iedServer, "MZ", "basic io", "1.6.0"); /* 安装控制处理器 */ IedServer_setControlHandler(iedServer, IEDMODEL_GenericIO_GGIO1_SPCSO1, (ControlHandler) controlHandlerForBinaryOutput, IEDMODEL_GenericIO_GGIO1_SPCSO1); /* 启动服务器监听 */ IedServer_start(iedServer, tcpPort); running = 1; signal(SIGINT, sigint_handler); while (running) { /* 更新模拟量测量值 */ float value = sinf(Hal_getTimeInMs() / 1000.f); IedServer_updateFloatAttributeValue(iedServer, IEDMODEL_GenericIO_GGIO1_AnIn1_mag_f, value); Thread_sleep(100); } /* 停止服务器并清理资源 */ IedServer_stop(iedServer); IedServer_destroy(iedServer); return 0; } 

客户端示例

以下是一个简单的IEC 61850客户端示例,展示如何连接服务器并读取数据:

#include "iec61850_client.h" #include <stdlib.h> #include <stdio.h> #include "hal_thread.h" int main(int argc, char** argv) { char* hostname = argc > 1 ? argv[1] : "localhost"; int tcpPort = argc > 2 ? atoi(argv[2]) : 102; IedClientError error; IedConnection con = IedConnection_create(); printf("Connecting to %s:%i\n", hostname, tcpPort); IedConnection_connect(con, &error, hostname, tcpPort); if (error == IED_ERROR_OK) { printf("Connected successfully\n"); /* 读取模拟量测量值 */ MmsValue* value = IedConnection_readObject(con, &error, "simpleIOGenericIO/GGIO1.AnIn1.mag.f", IEC61850_FC_MX); if (value != NULL && MmsValue_getType(value) == MMS_FLOAT) { float fval = MmsValue_toFloat(value); printf("Read float value: %f\n", fval); MmsValue_delete(value); } IedConnection_close(con); } else { printf("Failed to connect (error code: %i)\n", error); } IedConnection_destroy(con); return 0; } 

运行示例程序

构建完成后,可以运行示例程序进行测试:

cd examples/server_example_basic_io sudo ./server_example_basic_io 

在另一个终端中运行客户端:

cd examples/iec61850_client_example1 ./client_example1 

TLS支持配置

libIEC61850支持TLS加密通信,可以使用mbedTLS库来实现:

使用mbedTLS 2.28

make WITH_MBEDTLS=1 

使用mbedTLS 3.6

make WITH_MBEDTLS3=1 

使用CMake构建时,如果third_party/mbedtls目录中存在相应的mbedtls版本,会自动启用TLS支持。

最佳实践建议

1. 错误处理

在实际应用中,务必添加完善的错误处理机制。所有libIEC61850 API函数都会返回错误代码,应该检查这些代码以确保操作成功。

2. 资源管理

及时释放分配的资源,使用相应的destroy或delete函数来避免内存泄漏。

3. 线程安全

在多线程环境中使用libIEC61850时,注意线程同步问题。服务器API通常提供数据模型锁定机制来确保线程安全。

4. 性能优化

根据实际应用场景调整配置参数,如报告缓冲区大小、最大连接数等,以达到最佳性能。

5. 安全性考虑

在生产环境中,始终启用TLS加密通信,并妥善管理证书和密钥。

许可证信息

libIEC61850采用GNU General Public License v3.0许可证。对于商业项目,MZ Automation GmbH提供商业许可证和支持选项。

技术支持与贡献

该库由MZ Automation GmbH提供商业支持和技术服务。如果您希望为项目做出贡献,请联系[email protected]获取贡献者许可协议。

通过遵循本指南,您可以快速开始使用libIEC61850库来开发符合IEC 61850标准的电力自动化系统应用程序。库中提供的丰富示例代码是学习和理解API用法的绝佳资源。

【免费下载链接】libiec61850Official repository for libIEC61850, the open-source library for the IEC 61850 protocols 项目地址: https://gitcode.com/gh_mirrors/li/libiec61850

Read more

某物data魔改与变种算法还原(含加解密Py纯算)

某物data魔改与变种算法还原(含加解密Py纯算)

文章目录 * 1. 写在前面 * 2. 接口分析 * 3. data加解密 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、ZEEKLOG博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研究与开发工作! 【🌟作者推荐】:对爬虫领域以及JS逆向分析感兴趣的朋友可以关注《爬虫JS逆向实战》《深耕爬虫领域》 未来作者会持续更新所用到、学到、看到的技术知识!包括但不限于:各类验证码突防、爬虫APP与JS逆向分析、RPA自动化、分布式爬虫、Python领域等相关文章 作者声明:文章仅供学习交流与参考!严禁用于任何商业与非法用途!否则由此产生的一切后果均与作者无关!如有侵权,请联系作者本人进行删除! 1. 写在前面 之前看过一次data的加解密,今天周五截止目前凌晨一点多,还原验证后匆忙记录一下(刚好很久没更新文章了

By Ne0inhk
【LeetCode_21】合并两个有序链表

【LeetCode_21】合并两个有序链表

刷爆LeetCode系列 * LeetCode第21题: * github地址 * 前言 * 题目描述 * 题目与思路分析 * 思路一:尾插 * 思路二 * 代码实现 * 思路一 * 思路二 * 算法代码优化 * 优化思路一 * 优化思路二 LeetCode第21题: github地址 有梦想的电信狗 前言 * 本文用C++解答LeetCode第21题 题目描述 题目链接:https://leetcode-cn.com/problems/merge-two-sorted-lists/description/ 题目与思路分析 目标分析: 1. 将两个升序链表合并为一个升序链表 2. 返回新链表的头指针 3. 新链表中的结点由已有两链表中的节点组成 4. 提高要求:时间复杂度为O(n),空间复杂度为O(1) 思路一:尾插 思路:创建一个新的空链表newHead,同时逐个遍历两个链表的结点,将val较小的节点尾插到新链表中 操作:

By Ne0inhk
【数据结构-初阶】详解线性表(1)---顺序表

【数据结构-初阶】详解线性表(1)---顺序表

🎈主页传送门:良木生香 🔥个人专栏:《C语言》 《数据结构-初阶》 《程序设计》 🌟人为善,福随未至,祸已远行;人为恶,祸虽未至,福已远离 上期回顾:上一篇文章中(有兴趣的小伙伴可以看看上一篇文章:【数据结构-初阶】详解算法复杂度:时间与空间复杂度),我们已经学习了判断一个算法程序好与坏的方法:时间复杂度与空间复杂度,那么现在我们继续向下面学习数据结构的新知识:线性表中的顺序表 在介绍顺序表之前,我们先来了解线性表的概念 1.线性表 线性表(liner list)是由n个具有相同特性的数据元素组成的有限序列,其在生活中的运用非常广泛,常见的线性表有:顺序表,链表,栈,队列、字符串......线性表在逻辑上是连续的,但是在物理上不一定连续,线性表在物理上进行存储时,通常以数组或者链表结构的形式进行存储. 下面我们就来看看线性表之一的顺序表~~~ 2.顺序表 2.1.顺序表的概念 顺序表使用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组进行存储.言外之意就是,

By Ne0inhk
A*算法(A-Star Algorithm)详解

A*算法(A-Star Algorithm)详解

A*算法(A-Star Algorithm)是一种启发式搜索算法,广泛应用于路径规划(如游戏寻路、机器人导航)、图遍历等领域。它通过结合实际代价与启发式估计代价,在保证找到最优路径的同时,显著减少搜索范围,效率远高于传统的Dijkstra算法或贪心搜索。 一、核心思想:评估函数f(n) A*算法的核心是定义一个评估函数,用于优先扩展“最有希望”到达目标的节点。该函数表示为: f(n)=g(n)+h(n) f(n) = g(n) + h(n) f(n)=g(n)+h(n) * g(n):从起点(Start)到当前节点 nnn 的实际代价(已消耗的代价)。例如,

By Ne0inhk