IEC60870-5-104 协议源码架构详细分析

news2024/12/26 23:11:54

IEC60870-5-104 协议源码架构

  • 前言
  • 一、资源
  • 三、目录层级一
  • 二、目录层级二
    • config/lib60870_config.h
    • dependencies/README
    • examples
      • CMakeLists.txt
      • cs101_master_balanced
      • cs104_client_async
      • multi_client_server
      • tls_client
      • tls_server
      • 说明
    • make
      • 这些文件的作用
      • 是否需要导入这些文件?
    • src
      • common
      • file-service
      • hal
        • Inc
        • memory
        • serial
        • socket
        • thread
        • time
        • tls
      • iec60870
        • apl
        • cs101
        • CS104
        • link_layer
      • inc
        • api
        • internal
    • tests
      • certs
      • unity
  • 源码结构
    • 核心模块
      • 1. 数据结构
      • 2. 连接管理
      • 3. 数据传输
      • 4. 应用层
      • 示例代码
      • 测试
  • 总结
  • 我是将军我一直都在,。!


前言

提示:这里将军所使用的协议为:lib60870-2.3.2

IEC60870-5-104协议是IEC60870-5-101协议在TCP/IP上的扩展,提供了更高效的传输方式和更灵活的网络配置。其源码架构分为多个模块,每个模块负责特定的功能,确保数据传输的可靠性和安全性。


提示:以下是基于IEC104源码做的架构分析

一、资源

协议版本:lib60870-2.3.2
协议开源地址: IEC60870-5-104
在这里插入图片描述

三、目录层级一

CHANGELOG:记录项目的版本历史和变更信息。

COPYING:包含软件的版权和许可证信息。

sonar-project:配置文件,用于代码质量和静态分析工具(如 SonarQube)。

user_guide.adoc:用户指南或文档文件,通常以 AsciiDoc 格式编写。

在集成 IEC 60870-5-104 库到嵌入式项目(例如:FreeRTOS + LWIP)或者其他项目中时,通常并不需要导入像 CHANGELOGCOPYINGsonar-project 以及 user_guide.adoc 这样的文件。

二、目录层级二

在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中的过程中,通常不需要将 CMakeLists.txtDoxyfileMakefile 文件导入到你的生产代码中。这些文件主要用于项目构建和文档生成。

具体来说:

  • CMakeLists.txt:用于配置CMake构建系统的文件。在开发阶段,它帮助你编译和链接项目代码,但在生产环境中,通常不需要包含这些构建文件。
  • Doxyfile:用于配置Doxygen文档生成工具的文件。它帮助你在开发阶段生成代码文档,但在生产代码中不需要包含。
  • Makefile:用于配置Make构建系统的文件。在开发阶段,它帮助你编译和链接项目代码,但在生产环境中,通常不需要包含这些构建文件。

这些文件在开发和测试阶段非常有用,可以帮助你编译、链接和生成项目文档。但在最终的生产代码中,通常不需要包含这些文件,以保持代码的简洁和高效。

config/lib60870_config.h

通常需要导入 config/lib60870_config.h 文件。这个配置文件用于配置库的各种参数和选项,确保库能够正确地与 FreeRTOS 和 lwIP 项目配合工作。

lib60870_config.h 文件可能包含许多重要的配置项,例如:

  • 调试选项
  • 超时设置
  • 网络参数
  • 硬件特定的定义和设置

用于配置IEC60870-5-104协议库中的各种参数。这些配置选项允许用户根据具体需求定制库的行为,如调试输出、消息队列大小、线程和信号量支持、冗余组模式、客户端连接数量以及TCP keep alive机制等。

这些配置项在库的运行过程中非常关键,因此导入并正确配置这个文件是必要的。如果你没有这个文件,或者不确定如何配置,可以参考库的文档或示例代码来进行设置。

dependencies/README

在集成 IEC 60870-5-104 库到 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目中时,dependencies/README 文件通常不是必需的。这个文件一般用于提供关于库依赖项和安装说明的信息。在实际运行时,只有源代码文件和相关的头文件是必需的。

你可以参考 README 文件来了解依赖项和安装说明,但不需要将其集成到你的项目中。如果你遇到任何集成相关的问题,可以随时查阅该文件获取帮助,但它不会影响你项目的编译和运行。

examples

CMakeLists.txt

examples/CMakeLists.txt 文件通常不是必需的。这是因为这个文件主要用于示例项目的构建和配置。如果你的项目使用不同的构建系统或不需要这些示例项目,你可以选择不导入这个文件。

然而,CMakeLists.txt 文件可以作为有用的参考,特别是如果你正在使用 CMake 作为项目的构建工具。它展示了如何配置和构建项目,你可以根据这些示例来配置你自己的项目。

cs101_master_balanced

examples/cs101_master_balanced 文件夹中的 CMakeLists.txtMakefilemaster_example.c 文件并不是必需的,但它们可以为你提供有用的参考和指导。让将军逐一看看它们的用途:

  1. CMakeLists.txt 和 Makefile:这些文件是构建系统文件,分别用于 CMake 和 Make 工具。如果你使用这些工具来构建项目,这些文件可以为你提供如何集成库的示例配置。如果你的项目使用不同的构建系统,它们可以作为参考,帮助你创建等效的配置。
  2. master_example.c:这是一个示例代码文件,展示了如何使用 IEC 60870-5-104 协议库进行通信。它可以为你提供如何初始化和使用库的实际代码示例,非常有助于理解库的用法。

cs104_client_async

在将 IEC 60870-5-104 库集成到 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目中时,通常不需要直接导入 examples/cs104_client_async 文件夹中的 CMakeLists.txtMakefilecs104_client_async.c 文件。然而,这些文件可以为你提供非常有用的参考,特别是在配置和使用库的过程中。

  • CMakeLists.txt 和 Makefile:这些文件展示了如何使用 CMake 或 Make 工具构建示例项目。如果你也使用这些工具来管理项目构建,它们可以作为模板帮助你配置项目。如果你使用的是不同的构建系统或IDE,可以参考其中的配置来设置你的项目。

  • cs104_client_async.c:这个文件包含了异步客户端的示例代码,展示了如何使用库来实现 IEC 60870-5-104 协议。这可以为你提供如何初始化和调用库功能的实际代码示例,对你开发自己的应用程序非常有帮助。

multi_client_server

集成 IEC 60870-5-104 库到 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目中时,通常不需要直接导入 examples/multi_client_server 文件夹中的 CMakeLists.txtMakefilemulti_client_server.c 文件。然而,这些文件可以为你提供非常有用的参考,特别是在配置和使用库的过程中。

  • CMakeLists.txt 和 Makefile:这些文件展示了如何使用 CMake 或 Make 工具构建示例项目。如果你也使用这些工具来管理项目构建,它们可以作为模板帮助你配置项目。如果你使用的是不同的构建系统或IDE,可以参考其中的配置来设置你的项目。
  • multi_client_server.c:这个文件包含了多客户端和服务器示例代码,展示了如何使用库来实现 IEC 60870-5-104 协议。这可以为你提供如何初始化和调用库功能的实际代码示例,对你开发自己的应用程序非常有帮助。

tls_client

导入 examples/tls_client 文件夹中的文件(如 client1.cerclient1-key.pemCMakeLists.txtMakefileroot.cerserver.certls_client.c)并不是必需的,这些文件通常用于示例项目,展示如何在带有 TLS(传输层安全)的环境中使用 IEC 60870-5-104 库。

这些文件包含了以下内容:

  • 证书文件(client1.cerclient1-key.pemroot.cerserver.cer:这些文件用于 TLS 通信,确保数据传输的安全性。
  • 构建文件(CMakeLists.txtMakefile:用于构建示例项目,展示如何配置项目以使用库。
  • 示例代码(tls_client.c:包含了如何在带有 TLS 的环境中实现 IEC 60870-5-104 客户端的示例代码。

你可以根据需要参考这些文件。如果你计划在你的项目中实现 TLS 安全通信,那么这些示例文件将非常有用,可以帮助你理解和实现相应的功能。

但是,如果你的项目不需要 TLS 安全通信,或者你使用的是不同的构建系统,你可以选择不导入这些文件,而是根据需要创建和配置你自己的项目文件。

tls_server

examples/tls_server 文件夹中的文件(如 client1.cerclient2.cerCMakeLists.txtMakefileroot.cerserver.cerserver-key.pemtls_server.c)并不是必需的,这些文件主要用于示例项目,展示如何在带有 TLS(传输层安全)的环境中使用 IEC 60870-5-104 库。

这些文件包含以下内容:

  • 证书文件(client1.cerclient2.cerroot.cerserver.cerserver-key.pem:这些文件用于 TLS 通信,确保数据传输的安全性。
  • 构建文件(CMakeLists.txtMakefile:用于构建示例项目,展示如何配置项目以使用库。如果你使用 CMake 或 Make 作为构建工具,它们可以作为模板来配置你的项目。
  • 示例代码(tls_server.c:包含了如何在带有 TLS 的环境中实现 IEC 60870-5-104 服务器的示例代码。

如果你计划在你的项目中实现 TLS 安全通信,那么这些示例文件将非常有用,可以帮助你理解和实现相应的功能。

如果你的项目不需要 TLS 安全通信,或者你使用的是不同的构建系统,你可以选择不导入这些文件,而是根据需要创建和配置你自己的项目文件。

说明

examples其余文件夹中的文件同上。
总之,虽然这些文件不必直接集成到你的项目中,但它们可以为你提供宝贵的参考和示例代码,帮助你更好地完成集成工作。

make

在将 IEC 60870-5-104 库集成到 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目中时,是否需要导入 make 文件夹中的 common_targets.mkstack_includes.mktarget_system.mk 文件,取决于项目的构建系统和需求。这些文件通常在使用 Makefile 构建系统时用于配置和管理构建过程。

这些文件的作用

  • common_targets.mk:定义了一些常见的构建目标和规则,方便复用。
  • stack_includes.mk:通常包含了一些与协议栈相关的头文件路径配置。
  • target_system.mk:定义了特定于目标系统的设置和编译选项。

是否需要导入这些文件?

  • 需要导入:如果你正在使用 Makefile 构建系统,并且这些文件是你的 IEC 60870-5-104 库所依赖的文件,那么导入这些文件是必要的。
  • 不需要导入:如果你使用的是其他构建系统(如 CMake、IDE 项目文件等),你可以参考这些文件的内容,将其中的配置和规则转换为你所使用的构建系统所需的配置。

总之,如果你的项目使用 Makefile 作为构建系统,并且这些文件是库的一部分,你应该导入这些文件以确保正确的构建过程。如果你使用其他构建系统,可以根据需要转换这些配置。

src

在将 IEC 60870-5-104 库集成到 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目中时,src 文件夹中的 CMakeLists.txtlib60870.pc.inversion.rc.in 文件并不是必需的,但它们可以为你提供有用的构建和配置参考。

让将军来看看每个文件的用途:

  • CMakeLists.txt:用于 CMake 构建系统的配置文件。如果你使用 CMake 作为项目的构建工具,这个文件是必需的,因为它定义了构建规则和依赖项。如果你使用其他构建系统,可以参考这个文件来配置你的项目。
  • lib60870.pc.in:这是一个用于 pkg-config 的模板文件,通常用于生成 .pc 文件,这些文件描述了库的编译和链接参数。它在某些构建系统中是有用的,但在 FreeRTOS 项目中通常不是必需的,除非你特意需要使用 pkg-config。
  • version.rc.in:这是一个资源脚本模板文件,通常用于定义库的版本信息和元数据。在嵌入式系统中,它可能不是必需的,除非你有特定的版本管理需求。

总结来说,这些文件在特定的构建系统中是有用的,但在 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目中是否需要导入它们,取决于你的构建系统和具体需求。如果你使用 CMake 作为构建工具,导入 CMakeLists.txt 是有必要的,而其他两个文件则可以视具体情况而定。

common

在将 IEC 60870-5-104 库集成到 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目中时,通常需要导入 src/common/linked_list.c 文件。如果该文件在库的实现中被引用并包含了重要的数据结构和函数定义,那么导入它是必要的。

linked_list.c 文件通常包含链表的数据结构和相关操作函数,这些可能在库的其他部分中被使用。如果你在编译项目时缺少该文件,可能会导致链接错误或功能不完整。

因此,建议你根据库的文档和代码依赖性导入 linked_list.c 文件,以确保库的完整功能。

需要导入 src/common/inc/linked_list.h 文件。如果该文件在库的实现中被引用并包含了重要的数据结构和函数定义,那么导入它是必要的。

linked_list.h 文件通常包含链表的数据结构定义和相关操作函数的声明,这些在库的其他部分中可能被使用。如果缺少该文件,可能会导致编译错误或功能不完整。

因此,建议你根据库的文档和代码依赖性导入 linked_list.h 文件,以确保库的完整功能。

源码详解

这段代码实现了一个简单的链表(Linked List)数据结构,并包含了一些基本的操作函数。这些操作函数用于在嵌入式系统中管理链表数据。具体来说,这段代码的作用包括:

  1. 创建和销毁链表
    • LinkedList_create 函数创建一个新的链表节点。
    • LinkedList_destroyLinkedList_destroyDeepLinkedList_destroyStatic 函数用于销毁链表并释放内存,LinkedList_destroyDeep 还会释放每个节点中的数据。
  2. 添加和移除元素
    • LinkedList_add 函数用于在链表的末尾添加一个新的节点。
    • LinkedList_remove 函数用于从链表中移除包含指定数据的节点。
  3. 获取和遍历元素
    • LinkedList_getLastElement 函数返回链表的最后一个节点。
    • LinkedList_getNext 函数返回链表的下一个节点。
    • LinkedList_get 函数根据索引获取链表中的节点。
    • LinkedList_getData 函数返回链表节点的数据。
  4. 插入元素
    • LinkedList_insertAfter 函数在链表的指定位置后插入一个新的节点。
  5. 其他操作
    • LinkedList_size 函数返回链表的大小(节点数量)。

这些操作函数提供了对链表数据结构的基本管理功能,适用于IEC60870-5-104协议中的数据处理和存储需求。链表是一种常用的数据结构,用于存储动态数据集合,并支持快速插入和删除操作。

file-service

是否需要导入 src/file-service 文件夹中的 cs101_file_service.hfile_server.c 文件,取决于你的具体项目需求和库的依赖情况。

这些文件通常与文件服务功能相关,如果你的项目需要使用 IEC 60870-5-104 协议库中的文件服务功能,那么导入这些文件是必要的。具体而言:

  • cs101_file_service.h:这个头文件可能包含了文件服务功能的声明和必要的数据结构定义。
  • file_server.c:这个源文件可能包含了实现文件服务功能的代码。

如果你的项目确实需要文件服务功能,并且这些文件是库的一部分,那么你应该导入它们,以确保库的完整功能。

总之,建议你根据项目需求和库的文档,确定是否需要导入这些文件

hal

src/hal/CMakeLists.txt 文件的必要性取决于你是否使用 CMake 作为项目的构建工具。如果你的 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目使用 CMake 进行构建,那么导入 src/hal/CMakeLists.txt 文件是有用的,因为它包含了与硬件抽象层(HAL)相关的构建配置。

具体来说,CMakeLists.txt 文件通常会包含如下内容:

  • 指定源文件和头文件的位置。
  • 定义构建目标和依赖关系。
  • 设置编译选项和宏定义。

如果你确实使用 CMake 作为构建工具,那么你应该导入这个文件,并根据你的项目需求进行相应的配置。如果你使用其他构建系统(如 Makefile 或 IDE 项目文件),那么你可以参考 CMakeLists.txt 文件中的配置内容,但不需要直接导入它。

总之,如果你使用 CMake 进行项目构建,导入 src/hal/CMakeLists.txt 文件将有助于正确配置和构建你的项目。

Inc

在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你确实需要导入这些头文件。每个文件都有其特定的功能:

  • hal_base.h:基本硬件抽象层配置。
  • hal_serial.h:串行通信的配置。
  • hal_socket.h:套接字编程接口。
  • hal_thread.h:线程管理。
  • hal_time.h:时间管理。
  • lib_memory.h:内存管理功能。
  • platform_endian.h:处理平台字节序。
  • tls_config.h:TLS配置。
  • tls_socket.h:TLS套接字编程接口。

这些文件的导入可以确保库功能在FreeRTOS环境中正常运行。导入这些文件后,请确保在你的项目中正确配置并初始化这些功能,以避免运行时错误。

memory

在集成IEC60870-5-104库到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你需要导入 src/hal/memory 目录中的 lib_memory.c 文件。这个文件主要负责内存管理功能,确保库在运行时能够正确分配和管理内存。

lib_memory.c 主要实现了一些内存管理函数的封装,并添加了内存分配失败时的异常处理机制。通过设置一个异常处理器,当内存分配失败时,可以执行指定的处理逻辑。这在嵌入式系统和资源受限环境中尤为重要,以确保系统能够及时处理内存不足的情况。

导入 lib_memory.c 文件后,请确保正确配置和初始化内存管理功能,以避免运行时内存分配错误。

serial

在FreeRTOS上运行的嵌入式项目中,不需要导入 src/hal/serial/linux/serial_port_linux.c 文件,因为这个文件是为Linux平台设计的串行端口实现。在FreeRTOS环境中,你应该使用适用于你特定硬件平台的串行端口实现文件。

win32/serial_port_win32.c也是一样的。

FreeRTOS本身并不是依赖于任何特定的操作系统内核的,而是一个独立的实时操作系统。因此,你需要找到或者编写适用于你的硬件的串行驱动程序,而不是使用Linux专属的驱动文件。

socket

在FreeRTOS上运行的嵌入式项目中,是否需要导入 src/hal/socket/bsd/socket_bsd.c 文件,取决于你的网络接口和套接字实现需求。这个文件通常用于BSD套接字接口的实现,如果你的项目依赖BSD套接字接口来进行网络通信,那么导入这个文件是必要的。

然而,如果你的嵌入式项目使用了不同的套接字接口实现(例如,lwIP的原生套接字接口),那么可能不需要导入这个文件,而是导入与你所使用接口相匹配的文件。

总的来说,根据具体的网络通信需求和硬件平台选择合适的套接字接口实现文件是确保项目成功集成的关键。

在FreeRTOS上运行的嵌入式项目中,通常不需要导入 src/hal/socket/linux/socket_linux.c 文件。这个文件是为Linux平台设计的套接字实现,而FreeRTOS本身并不依赖Linux内核。

win32/socket_win32.c也是一样的。

对于嵌入式项目,你应该选择适用于你特定硬件平台的套接字接口实现文件。例如,如果你的项目使用LWIP网络堆栈,你应使用LWIP提供的套接字接口和相关文件。

thread

在FreeRTOS上运行的嵌入式项目中,不需要导入 src/hal/thread/bsd/thread_bsd.c 文件。这个文件是为BSD(Berkeley Software Distribution)系统设计的线程实现,通常与FreeRTOS无关。

在FreeRTOS上运行的嵌入式项目中,不需要导入 src/hal/thread/linux/thread_linux.c 文件。这个文件是为Linux平台设计的线程实现,而FreeRTOS有自己的线程管理机制和API。

macos/thread_macos.c和win32/thread_win32.c也是一样的。

FreeRTOS 有自己的线程管理机制,你应该使用FreeRTOS提供的线程管理API和功能。导入与FreeRTOS相关的库和头文件,并正确配置你的项目,以确保线程功能的正常运行。

time

在FreeRTOS上运行的嵌入式项目中,不需要导入 src/hal/time/unix/time.c 文件。这个文件是为Unix平台设计的时间管理实现,而FreeRTOS有自己的时间管理机制和API。

在FreeRTOS上运行的嵌入式项目中,不需要导入 src/hal/time/win32/time.c 文件。这个文件是为Windows平台设计的时间管理实现,而FreeRTOS有自己的时间管理机制和API。

你应该使用FreeRTOS提供的时间管理功能和相关库文件,而不是使用Unix专用的时间实现文件。确保在你的项目中正确配置和使用FreeRTOS的时间管理功能,以实现可靠的时间调度和管理。

tls

在FreeRTOS上运行的嵌入式项目中,集成IEC60870-5-104库时,如果你使用mbedTLS作为TLS库,那么导入 src\hal\tls\mbedtls 目录中的 mbedtls_config.htls_mbedtls.c 文件是必要的。这两个文件包含了mbedTLS配置和实现的相关代码,确保TLS通信功能在FreeRTOS环境中正常运行。

  • mbedtls_config.h:用于配置mbedTLS库的头文件。
  • tls_mbedtls.c:mbedTLS库的TLS实现文件。

确保这些文件被正确导入和配置,有助于实现安全可靠的TLS通信。

iec60870

在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你需要导入 src\iec60870 目录中的 frame.clib60870_common.c 这两个文件。这些文件包含了IEC60870-5-104协议的核心实现,确保库在你的FreeRTOS环境中能够正常工作。

具体来说:

  • frame.c:处理IEC60870-5-104帧的相关逻辑。

代码实现了帧处理的基本功能,包括销毁、重置、设置字节、附加字节、获取消息大小、获取缓冲区和获取剩余空间。每个功能都通过虚函数表(virtualFunctionTable)中的相应函数实现。这种设计模式允许在不修改接口的情况下,灵活地实现不同的帧处理逻辑。

  • lib60870_common.c:实现协议中的通用功能和工具。

代码实现了LIB60870库的调试输出功能和版本信息获取功能。主要功能包括:

  1. 调试输出功能
    • 使用 lib60870_debug_print 函数打印调试信息。
    • 通过 Lib60870_enableDebugOutput 函数启用或禁用调试输出。
  2. 版本信息获取
    • 使用 Lib60870_getLibraryVersionInfo 函数获取库的版本信息,包括主版本号、次版本号和补丁版本号。

确保这些文件被正确导入和配置,有助于实现IEC60870-5-104协议在FreeRTOS环境中的功能。

apl

在将IEC60870-5-104库集成到在FreeRTOS上运行的嵌入式项目中时,是否需要导入 src\iec60870\apl\cpXXtime2a.c 文件取决于该文件的具体功能和你的项目需求。 cpXXtime2a.c 文件可能包含了与应用层时间处理相关的功能。如果你的项目需要这些功能,那么导入该文件是必要的。

cpXXtime2a.c 代码实现了IEC 60870-5-104协议中几种时间类型(如CP16Time2a、CP24Time2a、CP32Time2a、CP56Time2a)的编码、解码和设置功能。

主要函数包括从缓冲区读取数据(getFromBuffer),获取和设置毫秒、秒、分钟数(getMillisecondgetSecondgetMinute),以及设置和获取无效标志和替代数据标志。

isInvalidisSubstituted 用于判断数据是否有效或是否为替代数据,setInvalidsetSubstituted 用于设置这些标志。

通常情况下,导入这些文件是为了确保所有必需的协议功能能够正常运行。因此,如果这个文件是库的一部分,并且实现了你项目所需的功能,导入它是合理的。

确保在你的项目中正确集成和配置这些文件,以避免运行时错误。

cs101

在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,通常需要导入 src\iec60870\cs101 目录下的以下文件:

将军来逐一说明这些文件在IEC60870-5-104库中的功能:

  1. cs101_asdu.c
    • 这个文件实现了应用服务数据单元(ASDU)的处理。ASDU是IEC60870-5-104协议中传输数据的基本单位,它包含了数据的实际内容和相关的元数据。
  2. cs101_bcr.c
    • 这个文件实现了计数量(BCR,Binary Counter Reading)的处理。BCR用于传输计数器值,是一种特定类型的信息对象。
  3. cs101_information_objects.c
    • 这个文件负责管理和处理信息对象。信息对象是ASDU的一部分,用于表示不同类型的测量值和状态信息。
  4. cs101_master.c
    • 这个文件实现了主站的功能。主站是主动发起通信的设备,负责发送命令和请求数据。
  5. cs101_master_connection.c
    • 这个文件管理主站的连接,处理连接的建立、维护和终止。它确保主站与从站之间的通信顺畅。
  6. cs101_queue.c
    • 这个文件实现了队列功能,用于管理要发送或接收的ASDU。队列确保数据按顺序传输和处理。
  7. cs101_slave.c
    • 这个文件实现了从站的功能。从站是被动响应的设备,负责接收命令和发送数据。

这些文件实现了IEC60870-5-104协议中CS101部分的各种功能和特性,如应用服务数据单元(ASDU)处理、信息对象管理、主站和从站通信等。确保这些文件被正确导入和配置,可以保证协议功能在FreeRTOS环境中的正常运行。

CS104

在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你通常需要导入 src\iec60870\cs104 目录下的以下文件:

  • cs104_connection.c
  • cs104_frame.c
  • cs104_slave.c

这些文件实现了IEC60870-5-104协议的CS104部分的各种功能,包括连接管理、帧处理和从站功能。具体来说:

  • cs104_connection.c:处理CS104连接的建立、维护和关闭,确保通信连接的可靠性。
  • cs104_frame.c:处理CS104协议中的帧结构和数据传输,确保数据的正确打包和解包。
  • cs104_slave.c:实现从站功能,负责响应主站的请求并发送数据。

确保这些文件被正确导入和配置,可以保证协议功能在FreeRTOS环境中的正常运行。

link_layer

在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你通常需要导入 src\iec60870\link_layer 目录下的以下文件:

  1. buffer_frame.c
    • 这个文件处理缓冲区帧的相关逻辑,确保数据在传输过程中正确存储和管理。
  2. link_layer.c
    • 这个文件实现了链路层的功能,负责处理链路层协议的各个方面,包括帧的发送和接收。
  3. serial_transceiver_ft_1_2.c
    • 这个文件实现了序列传输器的功能,特别是处理IEC60870-5-104协议中的帧传输。

导入这些文件有助于确保IEC60870-5-104协议在FreeRTOS环境中的正常运行。正确配置和初始化这些文件中的功能是成功集成该协议库的关键。

inc

api

是的,在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你需要导入 src\inc\api 目录下的以下头文件:

  1. cs101_information_objects.h:定义和管理CS101协议中的信息对象。
  2. cs101_master.h:实现主站功能的接口定义。
  3. cs101_slave.h:实现从站功能的接口定义。
  4. cs104_connection.h:处理CS104连接的接口定义。
  5. cs104_slave.h:实现CS104从站功能的接口定义。
  6. iec60870_common.h:定义了IEC60870-5-104协议中的通用功能和数据结构。
  7. iec60870_master.h:实现主站功能的接口定义。
  8. iec60870_slave.h:实现从站功能的接口定义。
  9. link_layer_parameters.h:定义链路层参数和配置。

这些头文件包含了协议实现所需的接口和定义,确保在FreeRTOS环境中正确集成和使用IEC60870-5-104库。

导入这些文件后,确保正确配置和初始化相应的功能,以避免运行时错误。

internal

是的,在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你通常需要导入 src\inc\internal 目录下的以下头文件:

  1. apl_types_internal.h:定义应用层的内部数据类型。
  2. buffer_frame.h:处理缓冲区帧的相关逻辑。
  3. cs101_asdu_internal.h:定义和管理CS101协议中的ASDU(应用服务数据单元)。
  4. cs101_queue.h:实现CS101协议中的队列功能。
  5. cs104_frame.h:处理CS104协议中的帧结构和数据传输。
  6. frame.h:处理IEC60870-5-104协议中的帧。
  7. information_objects_internal.h:管理和处理信息对象。
  8. lib60870_internal.h:定义库的内部功能和工具。
  9. link_layer.h:处理链路层协议的各个方面。
  10. platform_endian.h:处理平台字节序问题。
  11. serial_transceiver_ft_1_2.h:实现序列传输器功能,特别是处理IEC60870-5-104协议中的帧传输。

这些头文件定义了协议实现所需的内部数据结构和功能接口,确保在FreeRTOS环境中正确集成和使用IEC60870-5-104库。

tests

在集成IEC60870-5-104库到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,通常不需要将 tests 目录中的文件(如 all_tests.c、证书文件和CMakeLists.txt)导入到你的生产代码中。这些文件通常用于测试库的功能、验证系统的正确性和进行单元测试。

具体来说:

  • all_tests.c:通常包含各种单元测试和集成测试。
  • 证书文件(如 client1.cerclient1-key.pemclient2.cerroot.cerserver.cerserver-key.pem:用于测试TLS/SSL连接。
  • CMakeLists.txt:用于构建测试项目的CMake配置文件。

这些文件主要用于开发和调试阶段,而不是生产环境中的集成。如果你需要进行测试或验证功能,可以将这些文件用于测试项目中,但在最终的生产代码中不需要包含这些文件。

certs

在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中的过程中,通常不需要将 tests/certs 目录下的文件导入到生产代码中。这些文件主要用于测试和开发阶段,用来验证TLS/SSL功能和证书管理。

具体来说:

  • FREQ_AUTO 等证书和密钥文件(如 client_CA1_1.pemclient_CA1_2.keyclient_CA1_2.pem 等)通常用于测试和验证TLS连接。
  • crl_number 和相关文件:用于证书吊销列表(CRL)的管理。
  • index.txt 和相关文件:用于管理证书数据库。
  • crl_openssl.conf:OpenSSL配置文件。
  • README.md:通常包含关于如何使用这些文件的说明。

这些文件在生产环境中不需要包含,除非你的项目需要特定的测试或验证功能。在最终的生产代码中,通常会使用生产环境中实际使用的证书和密钥,而不是这些测试文件。

unity

在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,tests/unity 目录下的文件主要用于单元测试。这些文件包括:

  • unity.c:Unity框架的实现文件。
  • unity.h:Unity框架的头文件。
  • unity_internals.h:Unity框架的内部头文件。

这些文件是Unity单元测试框架的一部分,用于编写和运行单元测试,以验证库功能和确保代码正确性。在生产代码中,通常不需要包含这些测试文件。然而,在开发和测试阶段,这些文件是非常有用的,用于确保库和项目的质量和稳定性。

如果你需要进行单元测试以验证集成的正确性,可以在测试阶段包含这些文件,并在测试通过后将其移除以简化生产代码。

源码结构

核心模块

1. 数据结构

核心数据结构定义在 iec60870_slave.h 和 iec60870_master.h 文件中,这些数据结构包括:

ASDU(Application Service Data Unit):应用服务数据单元,用于封装和传输数据。

Connection:表示与远程设备的连接,包含连接的状态和属性。

2. 连接管理

连接管理模块负责处理与远程设备的连接,包括建立、维护和关闭连接。主要文件有:

cs104_slave.c:实现了从站的连接管理逻辑。

cs104_master.c:实现了主站的连接管理逻辑。

3. 数据传输

数据传输模块负责发送和接收 ASDU。主要文件有:

iec60870_5_104.c:实现了 104 协议的数据传输逻辑,包括 TCP 连接的建立和维护。

cs104_frame.c:处理 104 协议的帧格式和数据编码解码。

4. 应用层

应用层模块实现了具体的业务逻辑。主要文件有:

iec60870_5_101.c:处理 101 协议的数据格式和应用层逻辑。

iec60870_5_104_slave.c:从站的应用层逻辑。

iec60870_5_104_master.c:主站的应用层逻辑。

示例代码

examples 目录中提供了一些示例代码,展示了如何使用 lib60870 库来实现基本的通信功能。例如:

simple_server.c:一个简单的从站服务器示例。

simple_client.c:一个简单的主站客户端示例。

这些示例代码非常适合初学者快速上手,了解库的基本使用方法。

测试

tests 目录中包含了一些测试代码,用于验证库的正确性和稳定性。通过运行这些测试,可以确保库在各种场景下的正确性。


总结

lib60870 的源码结构非常清晰,主要包括以下几个部分:

src:存放主要的源代码文件。
inc:存放头文件,定义了主要的数据结构和接口。
examples:一些示例代码,展示了如何使用该库。
tests:测试代码,确保库的正确性。
lib60870-2.3.2 是一个功能强大且结构清晰的 IEC60870-5-104 协议实现库。通过本文的架构分析,希望能帮助开发者更好地理解该库的内部实现,快速上手并应用于实际项目中。

我是将军我一直都在,。!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全面介绍软件安全测试分类,安全测试方法、安全防护技术、安全测试流程

一、软件系统设计开发运行安全 1、注重OpenSource组件安全检查和版本更新(black duck) 现在很多云、云服务器都是由开源的组件去搭成的,对于OpenSource组件应该去做一些安全检查和版本更新,尤其是版本管理,定期对在运…

Cent OS-7的Apache服务配置

WWW是什么? WWW(World Wide Web,万维网)是一个全球性的信息空间,其中的文档和其他资源通过URL标识,并通过HTTP或其他协议访问。万维网是互联网的一个重要组成部分,但它并不是互联网的全部。互联…

遗传算法与深度学习实战(23)——利用遗传算法优化深度学习模型

遗传算法与深度学习实战(23)——利用遗传算法优化深度学习模型 0. 前言1. 神经进化2. 使用遗传算法作为深度学习优化器小结系列链接 0. 前言 神经进化涵盖了所有用于改进深度学习的进化算法。更具体地说,神经进化用来定义应用于深度学习的特…

Kubernetes 核心组件调度器(Scheduler)

文章目录 一,调度约束1.Kubernetes的基本构建块和最小可调度单元pod创建过程(工作机制,重点)1.1list-watch 组件List-Watch 的优点List-Watch 的应用场景List-Watch 的挑战与优化 2.调度过程(重点)2.1调度过程:2.2Kube…

STM32WB55RG开发(3)----生成 BLE 程序连接手机APP

STM32WB55RG开发----3.生成 BLE 程序连接手机APP 概述硬件准备视频教学样品申请源码下载参考程序选择芯片型号配置时钟源配置时钟树RTC时钟配置RF wakeup时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙设置工程信息工程文件设置结果演示 概述 本项目旨…

[C++]内联函数和nullptr

> 🍃 本系列为初阶C的内容,如果感兴趣,欢迎订阅🚩 > 🎊个人主页:[小编的个人主页])小编的个人主页 > 🎀 🎉欢迎大家点赞👍收藏⭐文章 > ✌️ 🤞 &#x1…

微软OmniParser:一切皆文档,OCR驱动智能操作

前沿科技速递🚀 微软推出的OmniParser是一种创新的框架,旨在将手机和电脑屏幕视为文档,通过OCR技术与多模态大模型实现对用户界面的深度理解和操作。OmniParser能够高效识别和提取界面中的文本信息、位置和语义,助力自动化操作。 …

使用 Web Search 插件扩展 GitHub Copilot 问答

GitHub Copilot 是一个由 GitHub 和 OpenAI 合作开发的人工智能代码提示工具。它可以根据上下文提示代码,还可以回答各种技术相关的问题。但是 Copilot 本身不能回答非技术类型的问题。为了扩展 Copilot 的功能,微软发布了一个名为 Web Search 的插件&am…

Rust语言在系统编程中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…

vue+vite前端项目ci过程中遇到的问题

将项目进行ci流水线构建时,遇到了npm run build 构建完成后命令行不会终止的问题,导致了无法进行下一个步骤。如下图: 排查了好久找到事vite.config.js的配置出了问题,如图所示,将build下的watch改为false即可解决问…

Python 获取PDF的各种页面信息(页数、页面尺寸、旋转角度、页面方向等)

目录 安装所需库 Python获取PDF页数 Python获取PDF页面尺寸 Python获取PDF页面旋转角度 Python获取PDF页面方向 Python获取PDF页面标签 Python获取PDF页面边框信息 了解PDF页面信息对于有效处理、编辑和管理PDF文件至关重要。PDF文件通常包含多个页面,每个页…

企业级RAG(检索增强生成)系统构建研究

— 摘要 检索增强生成(Retrieval-Augmented Generation,RAG)技术已经成为企业在知识管理、信息检索和智能问答等应用中的重要手段。本文将从RAG系统的现状、方法论、实践案例、成本分析、实施挑战及应对策略等方面,探讨企业如何…

前端学习八股资料CSS(二)

更多详情:爱米的前端小笔记,更多前端内容,等你来看!这些都是利用下班时间整理的,整理不易,大家多多👍💛➕🤔哦!你们的支持才是我不断更新的动力!找…

SAP 创建物料主数据报错:估价范围3010还没有生产式的物料帐簿

通过接口创建物料主数据(模拟MM01),报错如图: 处理方案1:(我的不行,提示已经是生产的) 将评估范围的物料分类账设置为生产 事务码: CKMSTART - 物料分类帐的生产开始 处理方案2&a…

扫雷游戏代码分享(c基础)

hi , I am 36. 代码来之不易👍👍👍 创建两个.c 一个.h 1:test.c #include"game.h"void game() {//创建数组char mine[ROWS][COLS] { 0 };char show[ROWS][COLS] { 0 };char temp[ROWS][COLS] { 0 };//初始化数…

leetcode 148. 排序链表 中等

给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3: …

Elasticsearch中什么是倒排索引?

倒排索引(Inverted Index)是一种索引数据结构,它在信息检索系统中被广泛使用,特别是在全文搜索引擎中。倒排索引允许系统快速检索包含给定单词的文档列表。它是文档内容(如文本)与其存储位置之间的映射&…

excel-VLOOKUP函数使用/XVLOOKUP使用

多个窗口同时编辑表格,方便对照操作 使用开始-视图-新建窗口 将战区信息表的三列数据匹配到成交数据表上 可以使用VLOOKUP函数 有4个参数(必须要查找的值, 要查找的区域,要返回区域的第几列数据,一个可选参数查找匹…

netcore 静态文件目录浏览

环境:Net6 string dirPath "C:\\Users\\15298\\Pictures"; var fileProvider new PhysicalFileProvider(dirPath); app.UseStaticFiles(new StaticFileOptions {FileProvider fileProvider,RequestPath new PathString(("/files")) }); // …

1Panel修改PostgreSQL时区

需求 1Panel安装的PostgreSQL默认是UTC时区,需要将它修改为上海时间 步骤 进入PostgreSQL的安装目录 /opt/1panel/apps/postgresql/postgresql/data打开postgresql.conf文件 修改: log_timezone Asia/Shanghai timezone Asia/Shanghai保存后重启…