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.mzph.cn/diannao/60463.shtml

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

相关文章

turbo c 2.0 画螺栓

代码; #include<graphics.h> void bolt(x0,y0,d,l) int x0,y0,d,l; {int x1,x2,x3,x4,x5,x6,x7,x8;int y1,y2,y3,y4,y5,r1,r2,b,c;if(l>2*d) b2*d;else b1;r11.5*d;r20.38*d;c0.1*d;x1x0-0.7*d;x2x0-0.61*d;x3x0-0.32*d;x4x00.8*d;x5x0l-b;x6x0l-c;x7x0l-0.05*d;x8x0…

网络服务综合项目-博客

一、运行环境&#xff1a; 主机主机名系统服务192.168.31.128Server-WebLinuxWeb192.168.31.129Server-NFS-DNSLinuxNFS 二、基础配置&#xff1a; 配置主机名开启防火墙并配置部分开启selinux并配置服务器之间使用ntp.aliyun.com进行时间同步服务器之间实现ssh免密登录 三…

leetcode86:分隔链表

给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x 3 输出&am…

Android Mobile Network Settings | APN 菜单加载异常

问题 从log看是有创建APN对应的Controller&#xff08;功能逻辑是ok的&#xff09;&#xff0c;但是Mobile Network Settings无法显示&#xff08;UI异常&#xff09;。 日志分析 看似APN 菜单已经创建了&#xff0c;实际上并没有显示。 11-12 07:01:28.150 8773 8773 D Pr…

上海市计算机学会竞赛平台2020年4月月赛丙组永恒的生命游戏

题目背景 2020年4月11日&#xff0c;英国数学家 约翰霍顿康威&#xff08;John Horton Conway&#xff09;因为新型冠状病毒肺炎不幸逝世。他在群论、数论、代数、几何拓扑、理论物理、组合博弈论和几何等领域&#xff0c;都做出了重大贡献。他的离去是人类文明的损失。他最著…

FS8x 功能安全

fail-safe是电独立的和物理隔离的。fail-safe由自己的参考电压和电流提供,有自己的振荡器,有重复的模拟路径以最小化常见的故障,并有LBIST/ABIST来覆盖潜在故障。fail-safe根据设备部件号提供ASIL B或ASIL D遵从性。除非另有规定,fail-safe定时来自故障安全振荡器,其精度为…

项目模块十七:HttpServer模块

一、项目模块设计思路 目的&#xff1a;实现HTTP服务器搭建 思想&#xff1a;设计请求路由表&#xff0c;记录请求方法与对应业务的处理函数映射关系。用户实现请求方法和处理函数添加到路由表&#xff0c;服务器只接受请求并调用用户的处理函数即可。 处理流程&#xff1a; …

内网域环境、工作组、局域网等探针方案

1. 信息收集 1.1 网络收集 了解当前服务器的计算机基本信息&#xff0c;为后续判断服务器角色&#xff0c;网络环境做准备 systeminfo 详细信息 net start 启动服务 tasklist 进程列表 schtasks 计划任务&#xff08;受权限影响&#xff09; 了解当前服务器的网络接口信息…

什么是量化交易

课程大纲 内容初级初识量化&#xff0c;理解量化 初识量化 传统量化和AI量化的区别 量化思想挖掘 量化思想的挖掘及积累技巧 量化代码基础&#xff1a; python、pandas、SQL基础语法 金融数据分析 常用金融分析方式 常用因子分析方式 数据分析实战练习 回测及交易引擎 交易引擎…

OpenHarmony-1.启动流程

OpenHarmony启动流程 1.kernel的启动 流程图如下所示&#xff1a;   OpenHarmony(简称OH)的标准系统的底层系统是linux&#xff0c;所以调用如下代码&#xff1a; linux-5.10/init/main.c: noinline void __ref rest_init(void) {struct task_struct *tsk;int pid;rcu_sch…

【LeetCode】【算法】64. 最小路径和

LeetCode 64. 最小路径和 题目描述 给定一个包含非负整数的 m x n 网格 grid &#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。 说明&#xff1a;每次只能向下或者向右移动一步。 思路 思路&#xff1a;这种题太典了&#xff0c;典…

1.7 JS性能优化

从输入url到页面加载完成都做了些什么 输入 URL - 资源定位符 http://www.zhaowa.com - http 协议 追问&#xff1a;http 与 TCP 1. http - 应用层 < > TCP - 传输层 2. 关联 - http基于TCP实现连接 < > UDP > 握手 & 挥手 &#xff08;传输速率上较…

Spring Task详细讲解

✨Spring Task简介 Spring Task 是 Spring 提供的轻量级定时任务工具&#xff0c;也就意味着不需要再添加第三方依赖了&#xff0c;相比其他第三方类库更加方便易用。可以按照约定的时间自动执行某个代码逻辑。 使用场景&#xff1a; 信用卡每月还款提醒银行贷款每月还款提醒…

Qt/C++ 海康SDK开发示例Demo

*** 工业相机在机器视觉中起到关键作用&#xff0c;本文基于海康 SDK 详细解读了设备连接与控制的各个步骤。内容涵盖设备枚举、句柄创建、图像采集回调以及设备异常处理&#xff0c;帮助开发者快速理解如何通过代码控制相机&#xff0c;实时采集并处理图像数据。*** 1. 搜索并…

HDLBIts习题(5):移位寄存器

&#xff08;1&#xff09;易错习题1&#xff1a;109题&#xff08;shift18&#xff09; 对算数左移和算数右移概念不清&#xff0c;不知道该如何计算。 逻辑左移和算术左移之间没有区别。&#xff08;无论是有符号位数据还是无符号位数据&#xff0c;右侧补0&#xff09; 逻辑…

想要成为独立游戏作者 :通关!游戏设计之道 2-2 关卡设计

本文通过ai辅助总结加个人微调,不喜勿喷 前篇如下&#xff1a; 想要成为独立游戏作者 &#xff1a;通关&#xff01;游戏设计之道 2-1 HUD-CSDN博客 1.关卡的多重定义 在电子游戏行业里 “关卡” 有多种含义&#xff0c;如游戏行为发生的环境、分割的游戏体验单元、量…

【深圳大学】数据结构A+攻略(计软版)

1. 考试 1.1 形式 分为平时&#xff0c;笔试&#xff0c;机试三部分。其中&#xff1a; 平时占30%&#xff0c;包含平时OJ测验和课堂练习&#xff0c;注意这个可能会因老师的不同和课题组的新策略而改变。笔试占60%&#xff0c;是分值占比的主要部分。机试占10%。 1.2 题型…

Springboot 启动端口占用如何解决

Springboot 启动端口占用如何解决 1、报错信息如下 *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 9010 was already in use.Action:Identify and stop the process thats listening o…

H.264/H.265播放器EasyPlayer.js RTSP播放器关于webcodecs硬解码H265的问题

EasyPlayer.js H5播放器&#xff0c;是一款能够同时支持HTTP、HTTP-FLV、HLS&#xff08;m3u8&#xff09;、WS视频直播与视频点播等多种协议&#xff0c;支持H.264、H.265、AAC、G711A、Mp3等多种音视频编码格式&#xff0c;支持MSE、WASM、WebCodec等多种解码方式&#xff0c…

集合类源码浅析のJDK1.8ConcurrentHashMap(上篇)

文章目录 前言一、概述二、CHM的属性1、属性 三、新增方法1、put2、initTable 四、分段计数1、addCount2、fullAddCount3、sumCount 总结 前言 本篇是JDK1.8的ConcurrentHashMap源码个人学习笔记&#xff0c;ConcurrentHashMap&#xff08;笔记中简称CHM&#xff09;是一种线程…