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)或者其他项目中时,通常并不需要导入像 CHANGELOG
、COPYING
、sonar-project
以及 user_guide.adoc
这样的文件。
二、目录层级二
在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中的过程中,通常不需要将 CMakeLists.txt
、Doxyfile
和 Makefile
文件导入到你的生产代码中。这些文件主要用于项目构建和文档生成。
具体来说:
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.txt
、Makefile
和 master_example.c
文件并不是必需的,但它们可以为你提供有用的参考和指导。让将军逐一看看它们的用途:
- CMakeLists.txt 和 Makefile:这些文件是构建系统文件,分别用于 CMake 和 Make 工具。如果你使用这些工具来构建项目,这些文件可以为你提供如何集成库的示例配置。如果你的项目使用不同的构建系统,它们可以作为参考,帮助你创建等效的配置。
- master_example.c:这是一个示例代码文件,展示了如何使用 IEC 60870-5-104 协议库进行通信。它可以为你提供如何初始化和使用库的实际代码示例,非常有助于理解库的用法。
cs104_client_async
在将 IEC 60870-5-104 库集成到 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目中时,通常不需要直接导入 examples/cs104_client_async
文件夹中的 CMakeLists.txt
、Makefile
和 cs104_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.txt
、Makefile
和 multi_client_server.c
文件。然而,这些文件可以为你提供非常有用的参考,特别是在配置和使用库的过程中。
- CMakeLists.txt 和 Makefile:这些文件展示了如何使用 CMake 或 Make 工具构建示例项目。如果你也使用这些工具来管理项目构建,它们可以作为模板帮助你配置项目。如果你使用的是不同的构建系统或IDE,可以参考其中的配置来设置你的项目。
- multi_client_server.c:这个文件包含了多客户端和服务器示例代码,展示了如何使用库来实现 IEC 60870-5-104 协议。这可以为你提供如何初始化和调用库功能的实际代码示例,对你开发自己的应用程序非常有帮助。
tls_client
导入 examples/tls_client
文件夹中的文件(如 client1.cer
、client1-key.pem
、CMakeLists.txt
、Makefile
、root.cer
、server.cer
、tls_client.c
)并不是必需的,这些文件通常用于示例项目,展示如何在带有 TLS(传输层安全)的环境中使用 IEC 60870-5-104 库。
这些文件包含了以下内容:
- 证书文件(
client1.cer
、client1-key.pem
、root.cer
、server.cer
):这些文件用于 TLS 通信,确保数据传输的安全性。 - 构建文件(
CMakeLists.txt
、Makefile
):用于构建示例项目,展示如何配置项目以使用库。 - 示例代码(
tls_client.c
):包含了如何在带有 TLS 的环境中实现 IEC 60870-5-104 客户端的示例代码。
你可以根据需要参考这些文件。如果你计划在你的项目中实现 TLS 安全通信,那么这些示例文件将非常有用,可以帮助你理解和实现相应的功能。
但是,如果你的项目不需要 TLS 安全通信,或者你使用的是不同的构建系统,你可以选择不导入这些文件,而是根据需要创建和配置你自己的项目文件。
tls_server
examples/tls_server
文件夹中的文件(如 client1.cer
、client2.cer
、CMakeLists.txt
、Makefile
、root.cer
、server.cer
、server-key.pem
、tls_server.c
)并不是必需的,这些文件主要用于示例项目,展示如何在带有 TLS(传输层安全)的环境中使用 IEC 60870-5-104 库。
这些文件包含以下内容:
- 证书文件(
client1.cer
、client2.cer
、root.cer
、server.cer
、server-key.pem
):这些文件用于 TLS 通信,确保数据传输的安全性。 - 构建文件(
CMakeLists.txt
、Makefile
):用于构建示例项目,展示如何配置项目以使用库。如果你使用 CMake 或 Make 作为构建工具,它们可以作为模板来配置你的项目。 - 示例代码(
tls_server.c
):包含了如何在带有 TLS 的环境中实现 IEC 60870-5-104 服务器的示例代码。
如果你计划在你的项目中实现 TLS 安全通信,那么这些示例文件将非常有用,可以帮助你理解和实现相应的功能。
如果你的项目不需要 TLS 安全通信,或者你使用的是不同的构建系统,你可以选择不导入这些文件,而是根据需要创建和配置你自己的项目文件。
说明
examples其余文件夹中的文件同上。
总之,虽然这些文件不必直接集成到你的项目中,但它们可以为你提供宝贵的参考和示例代码,帮助你更好地完成集成工作。
make
在将 IEC 60870-5-104 库集成到 嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他 项目中时,是否需要导入 make
文件夹中的 common_targets.mk
、stack_includes.mk
和 target_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.txt
、lib60870.pc.in
和 version.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)数据结构,并包含了一些基本的操作函数。这些操作函数用于在嵌入式系统中管理链表数据。具体来说,这段代码的作用包括:
- 创建和销毁链表:
LinkedList_create
函数创建一个新的链表节点。LinkedList_destroy
、LinkedList_destroyDeep
和LinkedList_destroyStatic
函数用于销毁链表并释放内存,LinkedList_destroyDeep
还会释放每个节点中的数据。
- 添加和移除元素:
LinkedList_add
函数用于在链表的末尾添加一个新的节点。LinkedList_remove
函数用于从链表中移除包含指定数据的节点。
- 获取和遍历元素:
LinkedList_getLastElement
函数返回链表的最后一个节点。LinkedList_getNext
函数返回链表的下一个节点。LinkedList_get
函数根据索引获取链表中的节点。LinkedList_getData
函数返回链表节点的数据。
- 插入元素:
LinkedList_insertAfter
函数在链表的指定位置后插入一个新的节点。
- 其他操作:
LinkedList_size
函数返回链表的大小(节点数量)。
这些操作函数提供了对链表数据结构的基本管理功能,适用于IEC60870-5-104协议中的数据处理和存储需求。链表是一种常用的数据结构,用于存储动态数据集合,并支持快速插入和删除操作。
file-service
是否需要导入 src/file-service
文件夹中的 cs101_file_service.h
和 file_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.h
和 tls_mbedtls.c
文件是必要的。这两个文件包含了mbedTLS配置和实现的相关代码,确保TLS通信功能在FreeRTOS环境中正常运行。
mbedtls_config.h
:用于配置mbedTLS库的头文件。tls_mbedtls.c
:mbedTLS库的TLS实现文件。
确保这些文件被正确导入和配置,有助于实现安全可靠的TLS通信。
iec60870
在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你需要导入 src\iec60870
目录中的 frame.c
和 lib60870_common.c
这两个文件。这些文件包含了IEC60870-5-104协议的核心实现,确保库在你的FreeRTOS环境中能够正常工作。
具体来说:
frame.c
:处理IEC60870-5-104帧的相关逻辑。
代码实现了帧处理的基本功能,包括销毁、重置、设置字节、附加字节、获取消息大小、获取缓冲区和获取剩余空间。每个功能都通过虚函数表(virtualFunctionTable
)中的相应函数实现。这种设计模式允许在不修改接口的情况下,灵活地实现不同的帧处理逻辑。
lib60870_common.c
:实现协议中的通用功能和工具。
代码实现了LIB60870库的调试输出功能和版本信息获取功能。主要功能包括:
- 调试输出功能:
- 使用
lib60870_debug_print
函数打印调试信息。 - 通过
Lib60870_enableDebugOutput
函数启用或禁用调试输出。
- 使用
- 版本信息获取:
- 使用
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
),获取和设置毫秒、秒、分钟数(getMillisecond
、getSecond
、getMinute
),以及设置和获取无效标志和替代数据标志。
isInvalid
和 isSubstituted
用于判断数据是否有效或是否为替代数据,setInvalid
和 setSubstituted
用于设置这些标志。
通常情况下,导入这些文件是为了确保所有必需的协议功能能够正常运行。因此,如果这个文件是库的一部分,并且实现了你项目所需的功能,导入它是合理的。
确保在你的项目中正确集成和配置这些文件,以避免运行时错误。
cs101
在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,通常需要导入 src\iec60870\cs101
目录下的以下文件:
将军来逐一说明这些文件在IEC60870-5-104库中的功能:
- cs101_asdu.c:
- 这个文件实现了应用服务数据单元(ASDU)的处理。ASDU是IEC60870-5-104协议中传输数据的基本单位,它包含了数据的实际内容和相关的元数据。
- cs101_bcr.c:
- 这个文件实现了计数量(BCR,Binary Counter Reading)的处理。BCR用于传输计数器值,是一种特定类型的信息对象。
- cs101_information_objects.c:
- 这个文件负责管理和处理信息对象。信息对象是ASDU的一部分,用于表示不同类型的测量值和状态信息。
- cs101_master.c:
- 这个文件实现了主站的功能。主站是主动发起通信的设备,负责发送命令和请求数据。
- cs101_master_connection.c:
- 这个文件管理主站的连接,处理连接的建立、维护和终止。它确保主站与从站之间的通信顺畅。
- cs101_queue.c:
- 这个文件实现了队列功能,用于管理要发送或接收的ASDU。队列确保数据按顺序传输和处理。
- 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
目录下的以下文件:
buffer_frame.c
:- 这个文件处理缓冲区帧的相关逻辑,确保数据在传输过程中正确存储和管理。
link_layer.c
:- 这个文件实现了链路层的功能,负责处理链路层协议的各个方面,包括帧的发送和接收。
serial_transceiver_ft_1_2.c
:- 这个文件实现了序列传输器的功能,特别是处理IEC60870-5-104协议中的帧传输。
导入这些文件有助于确保IEC60870-5-104协议在FreeRTOS环境中的正常运行。正确配置和初始化这些文件中的功能是成功集成该协议库的关键。
inc
api
是的,在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你需要导入 src\inc\api
目录下的以下头文件:
cs101_information_objects.h
:定义和管理CS101协议中的信息对象。cs101_master.h
:实现主站功能的接口定义。cs101_slave.h
:实现从站功能的接口定义。cs104_connection.h
:处理CS104连接的接口定义。cs104_slave.h
:实现CS104从站功能的接口定义。iec60870_common.h
:定义了IEC60870-5-104协议中的通用功能和数据结构。iec60870_master.h
:实现主站功能的接口定义。iec60870_slave.h
:实现从站功能的接口定义。link_layer_parameters.h
:定义链路层参数和配置。
这些头文件包含了协议实现所需的接口和定义,确保在FreeRTOS环境中正确集成和使用IEC60870-5-104库。
导入这些文件后,确保正确配置和初始化相应的功能,以避免运行时错误。
internal
是的,在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中时,你通常需要导入 src\inc\internal
目录下的以下头文件:
apl_types_internal.h
:定义应用层的内部数据类型。buffer_frame.h
:处理缓冲区帧的相关逻辑。cs101_asdu_internal.h
:定义和管理CS101协议中的ASDU(应用服务数据单元)。cs101_queue.h
:实现CS101协议中的队列功能。cs104_frame.h
:处理CS104协议中的帧结构和数据传输。frame.h
:处理IEC60870-5-104协议中的帧。information_objects_internal.h
:管理和处理信息对象。lib60870_internal.h
:定义库的内部功能和工具。link_layer.h
:处理链路层协议的各个方面。platform_endian.h
:处理平台字节序问题。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.cer
、client1-key.pem
、client2.cer
、root.cer
、server.cer
、server-key.pem
):用于测试TLS/SSL连接。 CMakeLists.txt
:用于构建测试项目的CMake配置文件。
这些文件主要用于开发和调试阶段,而不是生产环境中的集成。如果你需要进行测试或验证功能,可以将这些文件用于测试项目中,但在最终的生产代码中不需要包含这些文件。
certs
在将IEC60870-5-104库集成到嵌入式鲜项目(例如:FreeRTOS + LWIP)或者其他项目中的过程中,通常不需要将 tests/certs
目录下的文件导入到生产代码中。这些文件主要用于测试和开发阶段,用来验证TLS/SSL功能和证书管理。
具体来说:
FREQ_AUTO
等证书和密钥文件(如client_CA1_1.pem
、client_CA1_2.key
、client_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 协议实现库。通过本文的架构分析,希望能帮助开发者更好地理解该库的内部实现,快速上手并应用于实际项目中。