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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TensorRT基础知识

github:https://github.com/NVIDIA/TensorRT 官网快速入门链接:Quick Start Guide :: NVIDIA Deep Learning TensorRT Documentation 引言: TensorRT 是 NVIDIA 推出的一个高性能深度学习推理库,专门用于优化和加速已经训练好的深度学习模型…

jenkins提交gitee后自动部署

jenkins中安装gitee插件 Gitee Plugin​​​​​​ 配置gitee WebHook 生成giteeHook密码 去gitee中配置webHook 输入jenkins中的url和生成的密码 当我们再提交后就可以自动部署 gitee官方配置

软件测试面试八股文(超详细整理)

请你说一说测试用例的边界 参考回答: 边界值分析法就是对输入或输出的边界值进行测试的一种黑盒测试方法。通常边界值分析法是作为对等价类划分法的补充,这种情况下,其测试用例来自等价类的边界。 常见的边界值 1)对16-bit 的整数而言 32…

【金融风控】特征评估与筛选详解

内容介绍 掌握单特征分析的衡量指标 知道 IV,PSI等指标含义 知道多特征筛选的常用方法 掌握Boruta,VIF,RFE,L1等特征筛选的使用方法 【理解】单特征分析 什么是好特征 从几个角度衡量:覆盖度,区分度,相关性,稳定…

链游系统定制化开发:引领游戏产业的新时代

在数字革命的浪潮中,链游(区块链游戏)作为一种新兴游戏形式,正重新定义游戏产业的发展方向。链游将区块链技术与传统游戏结合,使游戏体验更加公平透明,并赋予玩家真正的资产所有权。这一领域不仅为玩家带来…

2024 年 8 个最佳 API 设计工具图文介绍

8 个最佳 API 设计工具推荐,包括 Apifox、Postman、Swagger、Insomnia、Stoplight、Hoppscotch、RapidAPI和Paw。 详细介绍:2024 年 8 个最佳 API 设计工具推荐

知识库管理系统:企业数字化转型的加速器

在数字化转型的大潮中,知识库管理系统(KBMS)已成为企业提升效率和创新能力的关键工具。本文将探讨知识库管理系统的定义、企业建立知识库的必要性,以及如何快速搭建企业知识库。 知识库管理系统是什么? 知识库管理系统…

24/11/12 算法笔记<强化学习> Policy Gradient策略梯度

gradient的核心就是每次更新前要重新收集,每个阶段的actor是不一样的. 策略梯度算法的核心思想: 策略表示:首先,策略梯度方法需要一个策略,该策略能够根据当前的状态选择一个动作。这个策略通常由一个参数化的函数表示…

物理设备命名规则(Linux网络服务器 15)

Linux系统中的一切都是文件,硬件设备也不例外。既然都是文件,就必须有文件名称。系统内核中udev设备管理器会自动把硬件名称规范化起来,目的是让用户通过设备文件的名字可以大致了解设备属性以及分区信息。这对于陌生的设备来说特别方便。另外…

SciPy:Python 科学计算工具包的全面教程

SciPy:Python 科学计算工具包的全面教程 引言 在数据科学和科学计算的领域,Python 已经成为一种流行的编程语言。作为 Python 的核心库之一,SciPy 提供了高效的数值计算功能,是科学计算、工程和数学应用中不可或缺的工具。本文将…

SAP_MM_SD_PP_FICO_视频课程几乎免费送

朋友们,都已经是2024年了,SAP中国区都已经被合并到樱花国的亚太区了,SAP上海研发中心也陆续撤离中*,竟然还有朋友花上万RMB学习SAP,钱花了可以在挣,主要是那个视频课程一个模块下来就得上百个小时&#xff…

如何在Puppeteer中实现表单自动填写与提交:问卷调查

一、介绍 在现代市场研究中,问卷调查是一种重要的工具。企业通过在线问卷调查了解消费者对产品或服务的需求、偏好和满意度,从而为产品开发、市场营销和服务优化提供指导。然而,对于爬虫技术专家来说,批量自动化地填写和提交问卷…

深度学习——权重初始化、评估指标、梯度消失和梯度爆炸

文章目录 🌺深度学习面试八股汇总🌺权重初始化零初始化 (Zero Initialization)随机初始化 (Random Initialization)Xavier 初始化(Glorot 初始化)He 初始化正交初始化(Orthogonal Initialization)预训练模型…

实验一:自建Docker注册中心

基于容器安装运行Registry Docker Registry主要负责镜像仓库的管理 创建并启动一个运行Docker Registry: docker run -d -p 5000:5000 --restartalways --name myregistry -v /opt/data/registry:/var/lib/registry registry -v:将主机的本地/opt/data/registry目…

同三维T610UDP-4K60 4K60 DP或HDMI或手机信号采集卡

1路DP/HDMI/TYPE-C(手机/平板等)视频信号输入1路MIC1路LINE OUT,带1路HDMI环出,USB免驱,分辨率4K60,可采集3路信号中其中1路,按钮切换,可采集带TYPE-C接口的各品牌手机/平板/笔记本电脑等 同三维…

ReactPress技术揭秘

ReactPress Github项目地址:https://github.com/fecommunity/reactpress 欢迎Star。 一、引言 ReactPress是一个基于React构建的开源发布平台,它不仅可以帮助用户在支持React和MySQL数据库的服务器上快速搭建自己的博客或网站,还能作为一个…

Java 网络编程(一)—— UDP数据报套接字编程

概念 在网络编程中主要的对象有两个:客户端和服务器。客户端是提供请求的,归用户使用,发送的请求会被服务器接收,服务器根据请求做出响应,然后再将响应的数据包返回给客户端。 作为程序员,我们主要关心应…

【MySQL】数据库表连接简明解释

未经许可,不得转载。 文章目录 表连接表连接的类型内连接与外连接结合 WHERE 条件交叉连接(cross join)表连接 在关系型数据库中,建模是数据组织的核心难点。数据库建模需要将数据关系理清,构建出适合存储和查询的结构。 所谓“模型”包括实体(entity) 和关系(relati…

SpringBoot(八)使用AES库对字符串进行加密解密

博客的文章详情页面传递参数是使用AES加密过得,如下图所示: 这个AES加密是通用的加密方式,使用同一套算法,前端和后端都可以对加密之后的字符串进行加密解密操作。 目前线上正在使用的是前端javascript进行加密操作,将…

拦截器实现http请求访问本地图片

本文来记录下拦截器实现http请求访问本地图片 文章目录 概述代码实现本文小结 概述 如下图,本机(服务器)存储的图片想要在浏览器上通过Url地址访问: 浏览器直接访问 代码实现 烂机器实现文件真实地址和物理地址之间的映射 Slf4j Configuration public cl…