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

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 协议实现库。通过本文的架构分析,希望能帮助开发者更好地理解该库的内部实现,快速上手并应用于实际项目中。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习在网络安全中的应用

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 机器学习在网络安全中的应用 机器学习在网络安全中的应用 机器学习在网络安全中的应用 引言 机器学习概述 定义与原理 发展历程 …

JUC基础类-AbstractQueuedSynchronizer

AbstractQueuedSynchronizer 1、AbstractQueuedSynchronizer概述2、AbstractQueuedSynchronizer源码分析2.1 AQS源码2.2 Node类 如有侵权,请联系~ 如有问题,也欢迎批评指正~ 1、AbstractQueuedSynchronizer概述 AbstractQueuedSy…

文献阅读 | Nature Methods:使用 STAMP 对空间转录组进行可解释的空间感知降维

文献介绍 文献题目: 使用 STAMP 对空间转录组进行可解释的空间感知降维 研究团队: 陈金妙(新加坡科学技术研究局) 发表时间: 2024-10-15 发表期刊: Nature Methods 影响因子: 36.1&#xff0…

Redis系列之底层数据结构ZipList

Redis系列之底层数据结构ZipList 实验环境 Redis 6.0 什么是Ziplist? Ziplist,压缩列表,这种数据结构会根据存入数据的类型和大小,分配大小不同的空间,所以是为了节省内存而采用的。因为这种数据结构是一种完整连续…

界面控件DevExpress WPF中文教程:TreeList视图及创建分配视图

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

数据结构中数据有序性/ 单调性 ——二分查找

以下记录的都是闭区间写法 例题&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 1.关系转换 寻找目标值有四种情况&#xff1a;≥、>、≤、< 比如目标值x&#xff0c; 可以转化为 ≥x、≥ x1、≤x、≤ x1 比如数组大小为6&#xff0c;目标值为…

探索Python的HTTP利器:Requests库的神秘面纱

文章目录 **探索Python的HTTP利器&#xff1a;Requests库的神秘面纱**一、背景&#xff1a;为何选择Requests库&#xff1f;二、Requests库是什么&#xff1f;三、如何安装Requests库&#xff1f;四、Requests库的五个简单函数使用方法1. GET请求2. POST请求3. PUT请求4. DELET…

《Linux从小白到高手》综合应用篇:深入详解Linux swap及其调整优化

1. 引言&#xff1a; Swap是存储设备上的一块空间&#xff08;分区&#xff09;&#xff0c;操作系统可以在这里暂存一些内存里放不下的东西。这从某种程度上相当于增加了服务器的可用内存。虽然从swap读写比内存慢&#xff0c;但总比没有好&#xff0c;算是内存不足时一种比较…

SpringMVC学习笔记(一)

一、SpringMVC的基本概念 &#xff08;一&#xff09;三层架构和MVC 1、三层架构概述 我们的开发架构一般都是基于两种形式&#xff0c;一种是 C/S 架构&#xff0c;也就是客户端/服务器&#xff0c;另一种是 B/S 架构&#xff0c;也就是浏览器服务器。在 JavaEE 开发中&…

小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程

一、概述 【软件资源文件下载在文章最后】 小面馆叫号取餐流程 佳易王面馆米线店点餐叫号管理系统操作教程 点餐软件以其实用的功能和简便的操作&#xff0c;为小型餐饮店提供了高效的点餐管理解决方案&#xff0c;提高了工作效率和服务质量 ‌点餐管理‌&#xff1a;支持电…

【.NET 8 实战--孢子记账--从单体到微服务】--简易权限--角色可访问接口管理

咱们继续来编写孢子记账的简易权限&#xff0c;这篇文章中我们将编写角色可访问接口的管理API&#xff0c;同样我不会把完整的代码全都列出来&#xff0c;只会列出部分代码&#xff0c;其余代码我希望大家能自己手动编写&#xff0c;然后对比项目代码。废话不多说&#xff0c;开…

Linux上Python使用MySQLdb包连接MySQL5.7和MySQL8的问题

在一台安装有MySQL8的Linux上用MySQLdb包连接MySQL5.7&#xff0c;连接参数中加上ssl_mode‘DISABLED’,能正常连接&#xff1b;不加ssl_mode参数&#xff0c;会报 而在连接MySQL8时加不加ssl_mode都能正常连接&#xff0c;但在使用过程&#xff0c;加了ssl_mode参数&#xff…

列表(list)

一、前言 本次博客主要讲解 list 容器的基本操作、常用接口做一个系统的整理&#xff0c;结合具体案例熟悉自定义内部排序方法的使用。如有任何错误&#xff0c;欢迎在评论区指出&#xff0c;我会积极改正。 二、什么是list list是C的一个序列容器&#xff0c;插入和删除元素…

spring使用xml文件整合事务+druid+mybatis

1.事务 事务&#xff08;Transaction&#xff09;是数据库管理系统中的一个重要概念&#xff0c;它表示一组不可分割的操作序列&#xff0c;这些操作要么全部执行成功&#xff0c;要么全部不执行&#xff0c;以确保数据库从一个一致性状态转换到另一个一致性状态。事务具有以下…

大语言模型LLM综述

一、LM主要发展阶段 1.1、统计语言模型SLM 基于统计学习方法&#xff0c;基本思想是基于马尔可夫假设HMM建立词概率预测模型。如n-gram语言模型 1.2、神经语言模型NLM 基于神经网络来做词的分布式表示。如word2vec模型 1.3、 预训练语言模型PLM 预训练一个网络模型来做词表…

【Jenkins实战】Windows安装服务启动失败

写此篇短文&#xff0c;望告诫后人。 如果你之前装过Jenkins&#xff0c;出于换域账号/本地帐号的原因想重新安装&#xff0c;你大概率会遇上一次Jenkins服务启动失败提示&#xff1a; Jenkins failed to start - Verify that you have sufficient privileges to start system…

Linux kernel 堆溢出利用方法(二)

前言 本文我们通过我们的老朋友heap_bof来讲解Linux kernel中off-by-null的利用手法。在通过讲解另一道相对来说比较困难的kernel off-by-null docker escape来深入了解这种漏洞的利用手法。&#xff08;没了解过docker逃逸的朋友也可以看懂&#xff0c;毕竟有了root权限后&a…

微服务(一)

目录 1.认识微服务 1.1.单体架构 1.2.微服务 1.3.SpringCloud SpringCloud版本 SpringBoot版本 2.服务注册和发现 2.1.注册中心原理 2.2.Nacos注册中心 2.3.服务注册 2.3.1.添加依赖 2.3.2.配置Nacos 2.4.服务发现 2.4.1.引入依赖 2.4.2.配置Nacos地址 2.4.3.发…

ubontu--cuDNN安装

1. 下载 cuDNN https://developer.nvidia.com/cudnn 2. 拷贝到服务器/home/<username>文件夹下 解压缩到当前文件夹&#xff1a; tar -xvf cudnn-linux-x86_64-9.5.1.17_cuda11-archive.tar.xz复制头文件和库文件到cuda安装目录/usr/local/cuda/ sudo cp /home/usern…

Vue 批量注册组件实现动态组件技巧

介绍 Vue 动态组件的应用场景很多,可应用于动态页签,动态路由等场景,其核心原理是批量注册。在Vue2和Vue3中实现原理相同,只是语法略有差异。 Vue2 实现 基于 webpack require.context() 是webpack提供的一个自动导入的API 参数1&#xff1a;加载的文件目录 参数2&#xff…