ESP32双核架构实现物联网测量
基于ESP32开发板的双核应用实现物联网模块的测量与数据处理
ˇ彼得·福尔蒂´内克,马雷克·巴比乌赫和帕维尔·苏拉´内克
摘要
本文描述了一种采用ESP32微控制器的物联网设备在双核架构下实现数据处理与无线通信的应用。我们测试了首个核心思想,即通过低端硬件结合软件优化来构建软件架构,以最大化利用该硬件性能,并降低对更昂贵硬件解决方案的需求。我们的架构设计目标已达成:建立了通用框架的基础,定义了其使用场景,并通过组件实现了这些场景。本文阐述了我们嵌入式振动测量测试系统的逐步开发过程,在该系统上测试了框架中的各个软件组件。我们基于ESP32处理器核心为这些组件开发了应用,合理划分了各核心在框架组件中的职责。
关键词 物联网,ESP32,开发板,测量,双核
收稿日期:2019年4月16日;接受日期:2019年5月20日
引言
在本研究中,我们将专注于开发市场上现有设备的应用。我们采用乐鑫生产的ESP32(ESP‐WROOM‐32)芯片以及一款低成本的MCU9250加速度计。我们使用市场上常见的传统且易于获取的低端模块,因为我们的目标并非追求技术前沿,而是旨在充分利用现代技术来处理和分发来自物联网(IoT)模块的测量数据。主要目标是为ESP32芯片设计一个能够最大限度利用其功能的应用。
同时,我们开发一种通用的软件概念,该概念可应用于任何基于ESP32芯片的物联网设备。我们提出的场景如下:
- 启用设备配置;
- 远程访问;
- 设备的控制与诊断;
- 最大限度利用设备的硬件能力;
- 支持多个设备同时同步;
- 多平台支持使用。
这些场景是在由Brüel & Kjær振动校准器产生的振动测量示例中实现的。对于该振动校准器,我们使用三维(3D)打印附件安装了一个三轴加速度计、一个陀螺仪和一个磁力计,这些传感器集成在单个MCU9250芯片上。有关所用组件、架构和解决方案的详细描述见后续章节。
在分析了我们的设计场景后,我们尝试构建一种通用的嵌入式系统架构,以便能够重复使用来部署其他嵌入式系统。前一段中定义的场景展示了表征嵌入式系统行为的组件实现。组件名称唯一地表征了所实现的场景,并提供网络连接(Wi‐Fi)、与上级控制系统的通信(消息队列遥测传输(MQTT))、通过连接的传感器和物联网模块进行数据测量、系统监控(内部Web服务器)以及远程系统报告。
我们的目标是创建语言独立且可重用的嵌入式系统架构设计模式和方法,定义代码的可持续性,并在逻辑上帮助我们实现任何嵌入式系统。在寻找和创建这些模式时,我们受到软件开发领域的启发,在该领域中,这些架构设计模式已被使用,并作为软件架构师之间的通用语言。在本文最后,我们总结了从嵌入式系统实现中获得的架构优势和知识。
相关工作
如今,物联网设备通常是我们多年来一直在使用的设备,但我们之前并未意识到,微型化、数字化和无线通信技术将使我们能够将其转变为物联网设备。它们通常应用于智慧城市设备、智能家居自动化设备、智能健康组件、可穿戴设备、嵌入式工业解决方案以及军事环境中的应用程序。物联网技术本身可以与其他概念相结合而得到扩展,例如机器人事物互联网,如今几乎涵盖了万物互联。
因此,物联网设备的本质是一种具备无线通信能力的电子芯片,无论其采用的是Wi‐Fi、蓝牙低功耗(BLE)、LoRa、ZigBee还是其他标准。目前,这些通信标准已直接集成到开发板的芯片中,无需再连接任何其他通信模块或扩展板。一些先前的研究致力于上述物联网环境中的无线技术,例如LoRa和ZigBee;这些标准本身的使用在Yao等人以及Lee和Huang的研究中已有详细描述,早于物联网设备的大规模普及之前。
在确定我们的目标时,我们受到一些发表文献的启发,这些文献定义了物联网应用程序的发展方向和选择,并通过分析ESP32系列芯片的实际应用情况获得了参考。本文描述了ESP32及其与前代ESP8266以及其他芯片的差异,创建了一个测试ESP32芯片性能能力的应用,并针对物联网部署提出了建议,重点突出了双核和FreeRTOS。我们力求跟进并详细描述该应用,尤其是采用双核架构的部分。
在设计我们的嵌入式系统的组件和架构解决方案时,我们查阅了与我们所面临问题相关的文献。
例如在ESP32设备上实现Web服务器,或通过Wi‐Fi网络进行实时通信和系统管理。这些主题在涉及物联网应用、协议和物联网架构的发表文献中均有涵盖。本文从通信协议和标准的能力与使用角度描述了物联网架构,并重点讨论了CTP(Communication Things Protocol)和物联网网关。
文章中关于受物联网交互模型启发的研究促使我们为应用程序创建场景和需求,并推广到嵌入式系统中。
利用低成本微控制器进行振动监测的内容由Atmel处理器相关文章描述,另一篇文章总结了与物联网模块配合使用的网络中的无线通信。相关文章通常涉及网络架构、协议和框架,并描述了传统网络架构的局限性,但我们的研究目标是开发软件架构。
为了合理设计该架构,有必要研究一些实际项目的实施案例。这些文章主题相似,非常有趣,并提供了使用物联网设备(包括ESP32芯片)的实际解决方案。这两项工作均使用了ESP32芯片并实现了Web服务器,但所述应用仅需单核即可满足需求。我们还指出,在我们的应用中,Web服务器的实现具有响应性。有关创建我们自己的抽象软件解决方案(框架)的经验也可在相关发表文献中找到。
物联网嵌入式系统能力的另一种应用和扩展是云计算以及与当今工业4.0概念相关的大数据视角。
在工业领域应用物联网嵌入式系统时,随着测量数据量的增加,有必要采用机器学习和大数据分析等数据分析技术,以快速分析设备行为的变化。此前的发表主要关注大数据和本地云主题。我们实现了MQTT通信标准,该标准也用于Masek等人所描述的物联网应用中。
所使用的物联网模块
系统的核心是乐鑫科技公司生产的ESP32芯片。
ESP32可作为完整的独立系统运行,也可作为主机MCU的从设备,从而降低主应用处理器的通信协议栈开销。该芯片集成了Wi‐Fi、蓝牙以及其他通信接口,如SPI和I2C/UART。我们所利用的一个显著优势是其具备两个处理器核心。市场上有多种厂商提供的型号,包括乐鑫ESP32S、ESP32‐Wroom、LoRa ESP32、WeMos LOLIN32及其克隆版本。我们已在多块开发板上实现了该解决方案。

由于电路板的具体类型并不重要,主要是采用双核ESP32芯片。
在我们的应用中,我们使用了MPU‐9250 9轴自由度(nine‐degree‐of‐freedom)传感器模块。该模块包含一个三轴陀螺仪、加速度计以及通过I²C实现的独立芯片上的磁场传感器。对于所有这三个测量变量,均可切换量程,其他特性可在规格说明中查看。
在进行振动测量测试时,我们选择了Bru¨ el & Kjær 4294加速度计校准器,该设备可在10 m s22(0–70 g负载)的标准加速度水平下对测量仪器进行精确调整。此外,可使用参考信号进行速度和位移校准,分别为10 mm s21和 10 mm。
外壳采用3D打印机设计并制造,用于容纳最终的嵌入式系统,该系统包括一块开发板、一个0.96英寸彩色有机发光二极管(OLED)128×64像素显示屏、一张SD卡以及最小尺寸的连接器。嵌入式系统的盒装版本将包含移动电源供电连接器的开孔、通风网格和内置校准器接口。我们还制作了3D打印支架,以便在三个轴向上调整传感器的位置,用于测量测试。该嵌入式系统将被远程可从上位系统进行配置,该上位系统可以是笔记本电脑或树莓派(RPI)。
技术
为确保满足我们定义的应用场景,我们决定采用以下技术并将其应用于ESP32芯片控制器。针对ESP32芯片微控制器的开发,我们选择了Arduino平台。
Arduino平台是一个开源电子平台,通过提供的开发环境支持在微控制器上的开发。由于Arduino平台本身并不原生支持ESP32微控制器,乐鑫开发了对该平台的支持,称为ESP32 Wi‐Fi芯片的Arduino核心。安装该扩展后,即可对基于ESP32芯片的微控制器进行开发。使用Arduino平台的优势在于简化了微控制器软件开发的原型设计。由于Arduino IDE不支持一些开发环境的标准功能,例如IntelliSense和源代码管理,因此我们选择使用微软的Visual Studio Code作为开发环境,并安装了Visual Studio Code的Arduino可选扩展。图1显示了Visual Studio Code环境。
到目前为止,我们一直在描述在ESP32微控制器上进行应用开发的环境定义。现在,让我们来看看通过安装ESP32 Wi‐Fi芯片的Arduino核心可以获得哪些组件和库。其中最重要的扩展库是FreeRTOS内核支持。FreeRTOS内核是一种面向微控制器的实时操作系统实现,其所有规范均在https://freertos.org/ 上详细说明。从我们的角度来看,为ESP32微控制器实现FreeRTOS支持非常重要,因为它提供了对控制器多任务处理的支持。我们将利用此支持来实现我们的应用场景,以最大化设备的硬件潜力。我们使用的其他有趣组件包括扩展的Wi‐Fi支持、SD卡支持、通过SPI或I2C标准通信接口进行通信的支持等。得益于该框架的扩展,我们可以使用Arduino平台上常用的第三方库安装系统。我们采用的另一种有趣的技术是支持M2M(机器对机器)通信。这种通信方式被物联网设备广泛使用。我们选择了主要由IBM开发和推广的MQTT通信协议。MQTT是一种简单的TCP/IP(传输控制协议/互联网协议)通信协议,允许基于发布/订阅模式传输短消息(见图2)。
MQTT基于通过中央代理服务器在客户端之间进行消息传输。它通过接收来自提供者(发布者)的消息,然后将其传递给一个或多个感兴趣的读者(称为订阅者)来读取,从而中介通信。一个代理(记者)可以有多个不同的发布者和多个读者(订阅者),在这种情况下,每个读者只会收到其订阅的消息。
传输的消息通过所谓的主题进行标识,消息值即存储在该主题下。消息内容本身并未定义,其表示形式可以是文本或二进制数据系统。最常用的格式是JSON(对象表示法)和BSON(二进制JSON),但由于我们的内部内存有限,因此我们选择了一种简单的文本格式,以避免多余的格式化字符,从而始终保证消息的可读性。该协议的配置较为复杂,所有选项均可在MQTT中找到。
应用架构的设计
为了满足我们定义的场景,有必要确定将在给定设备上实现的组件。图3展示了各个子系统(组件)的布局及其职责。各组件的具体实现详见“ESP32上的实现”一节。本节描述了组件的主要属性及其职责。
以下组件将在ESP32设备上可用。
配置
该组件负责配置ESP32微控制器所需的行为。此组件实现了设备的配置场景。配置通过*.json配置文件实现,这些文件以所需的结构存储在SD卡上。在本例中,通过WPA2安全配置了对Wi‐Fi网络的访问,并为MQTT通信设置了代理。

Wi‐Fi配置文件(wifi.conf)的配置文件示例如下:
{"ssid":"wifiSSID", "password":"wifiPassword"}
MQTT配置文件(mqtt.conf)的示例如下:
{"server":"MQTT IP地址", "port":1883}
通信
该组件负责ESP32开发板与管理设备之间的通信。该组件实现的场景包括设备的控制与诊断、多个设备同时同步的可能性,以及使用时的多平台支持。通信采用MQTT技术;参见上一章节。同步场景通过MQTT代理实现,该代理负责将消息发送给所有设备;参见下图。下图展示了我们可以通过一个管理设备控制多个微控制器的事实。这一功能通过实现控制与设备诊断场景来保证。场景的实现是通过微控制器对特定消息的订阅完成的,这些消息用于触发或诊断设备。
如果使用多个ESP32微控制器,每个微控制器必须具有一个唯一标识符。客户端名称被用作该标识符。这意味着每个ESP32设备的客户端名称必须是唯一的。
多平台应用支持场景是由原生平台无关的MQTT技术提供安全保障。
ESP32设备发布的通信消息列表如下:
- “esp/info”——此消息提供有关ESP32微控制器行为的信息日志;
- “esp/mpu9250”——此消息提供来自特定ESP32微控制器的实时测量值。
ESP32设备接收的消息列表如下:
- ‘‘esp/setting’’—消息的可能值:s start 在第二个ESP32 CPU核心上启动对连接传感器的测量;s restart 重启ESP32微控制器;s info 在微控制器显示屏上显示当前配置的信息。相同的信息将通过MQ发送。
- ‘‘esp/setting/real‐time’’— 设置在测量期间是否发送MQ消息s on—在测量期间从微控制器发送实时数据;s off—不发送实时数据。
- ‘‘esp/setting/frequency’’— CPU中断的中断计数次数,默认值为5;
- ‘‘esp/setting/count’’—一次测量的采样数量,默认值为5000。
远程访问
该组件负责访问ESP32设备,并使测量数据能够存储在SD卡上。这是我们实现远程访问的方式通过运行在ESP32设备上的Web服务器接口解决数据访问问题。对我们而言,远程访问场景主要用于在测量过程中因通信出现实时故障时,访问已测量并存储在SD卡上的备份数据。图4显示了ESP32上的Web服务器预览界面。该Web服务器还提供显示配置信息,并给出CPU温度等实时值。Web服务器采用响应式设计创建。

对于管理设备,以下组件是必要的。
测量循环
该组件负责在ESP32开发板上实现测量循环函数的源代码。该组件实现了设备硬件使用的最大化场景。
ESP32微控制器开发板具有两个核心,因此一个核心专用于测量循环,而另一个核心专用于通信。得益于ESP32开发板对FreeRTOS接口的支持,实现了多任务处理,并能够将任务原生运行在特定核心上,从而实现此功能。
通信
此组件负责主管理设备与特定的ESP32设备之间的通信(参见‘‘通信’’组件)。图5显示了一个管理设备与‘‘n’’个ESP32开发板的通信。
测量评估
该组件旨在在控制设备环境(如个人计算机或其他操作员的上级设备)中更高效、便捷地使用ESP32模块(图6)。为此支持,我们开发了一款基于Windows的平台软件,用于快速评估测量值以及控制ESP32设备(见图7)。未来在管理设备侧组件的开发意图是创建一个与平台无关的工具;因此,我们将不同环境中实现部署灵活性的优势。
ESP32上的实现
使用Arduino平台创建了所述场景与已定义组件的实现。为了简化实现并提高可重用性,我们创建了以下程序组件:
- 配置组件——一个用于获取存储在SD卡上的配置的类。在本例中,我们获取了Wi‐Fi连接和MQTT连接的配置。
- 数据写入器组件——一个将测量数据写入SD卡的任务集成在一起的类。该类封装了Arduino核心接口为ESP32 Wi‐Fi芯片提供的API。
- 自定义显示组件——一组用于操作OLED显示屏的辅助函数。
- Esp32传感器组件——一个封装了对ESP32开发板上集成传感器访问功能的类。
- MPU9250组件——一个通过SPI接口封装对MPU9250模块访问的类。该类封装了对陀螺仪、加速度计、磁力计和温度传感器的访问。
得益于这些创建的组件,可以划分各个程序活动的职责,并确保源代码更易于调试。基于此Arduino平台的微控制器程序按照惯例包含两个基本函数,即Setup()和Loop()。在程序启动时(通过开启微控制器电源),设置函数中执行变量和传感器的初始化,而应用逻辑则在循环函数中执行。
在我们的程序中,设置函数最重要的功能是MQTT客户端的初始化。该部分注册了回调函数“callback_mqtt”,负责处理预付费的MQTT消息。另一个有趣的初始化功能是针对Web服务器的。此函数定义了Web服务器的路由。一个重要事实是,设置函数在ESP32微控制器启动时仅在ESP32芯片核心1号上执行一次。图8的左侧显示了设置函数的活动图。

循环函数也在ESP32芯片的1号核心上执行。此功能提供用于处理来自MQTT代理消息的接收算法。如果与MQTT代理的连接丢失,系统将自动恢复连接这个循环。代码的这一部分还接收Web服务器组件的标准HTTP通信消息。循环函数在微控制器运行期间会持续不断地重复执行。ESP32微控制器上的源代码中最关键的部分是回调函数,它用于处理来自MQTT代理的传入消息。图9展示了通过回调函数的过程。该函数仅处理传入的MQTT消息。
之前的活动图显示了调用测量功能的活动。该活动在第二个核心上运行,此核心专门用于该活动。图10展示了此过程。在下一章中,我们将对已实现的微控制器进行实际测试。 





ESP32实现的测试
在上一章中,我们专注于嵌入式系统的设计与创建,而本章将描述该系统在实验室条件下的测试。图11展示了我们的嵌入式系统原型。如图所示,连接的显示屏作为状态指示器,根据所需的环境配置显示系统的就绪状态。对于完整的系统就绪后,需要将系统连接到Wi‐Fi网络和MQTT代理。
从图12的左侧可以看出,系统已加入Wi‐Fi网络并被分配了IP地址(黄色文本标识),似乎正在尝试连接MQTT代理。如果系统成功连接到代理,则状态栏的右上角会显示一个MQ字符(黄色文本,如图11所示)。如果连接超时,则需要重新配置MQTT代理设置。在成功连接后(主要取决于系统配置),系统即可通过MQTT消息进行管理。图12右侧显示了特定的测量配置,这些值是通过MQTT消息设置的。随后,测量会触发MQTT消息。图13展示了在嵌入式系统原型上的振动测量。一旦测量完成,系统会向MQTT代理发送一条消息,其中包含存储的测量数据。通过MQTT发送的相同信息也会显示在板载显示屏上。在成功测试未封装的原型后,我们可以将整个系统设计成封装版本,最终形成盒装版本。



图13展示了我们嵌入式系统的盒装变体,其中在树莓派上安装了MQTT代理的场景实现。电源采用移动电源设计。图14展示了创建的软件本身,以清晰的表格显示来自所有传感器的测量数据;在我们的示例中,我们展示了9轴传感器+温度的5000个值,因此在当前MQTT设置下共50000个值。我们可以如上所述通过通用配置更改此设置。图15展示了用于x、y和z轴三个测试维度的支架。这些支架由3D打印机制造,用于使用9轴传感器对所有轴的振动测量结果进行精确比较(图15)。


结论
我们的目标是探索低端物联网设备的可能性,并将其与工业实践中使用的最新技术和设备相结合。作为这类低端设备的代表,我们选择了ESP32微控制器,它内置Wi‐Fi连接功能,支持WFA(Wi‐Fi联盟)、WPA(Wi‐Fi保护访问)/WPA2以及无线局域网认证与保密基础结构(WAPI)等标准安全协议。此外,ESP32微控制器支持两个计算核心,因此在应用设计中可实现完全的并行处理,而其他微控制器(例如ATMEL微控制器)仅有一个计算核心,只能实现伪并行任务。我们还在ESP32芯片上实现了通用软件架构的概念验证。
通过该架构,我们展示了由我们定义的场景,并在振动测量的实际示例中测试了这一概念验证。在架构设计中,我们重点关注了从源代码的可持续性、可测试性和可重用性角度出发的开发可能性。我们通过使用具有明确定义用途的各个组件实现了这些架构特性。职责。我们选择了Arduino平台作为开发环境,并在其 中安装了ESP32开发支持。在我们完成本文时,ESP32支持的首次发布已正式在Arduino平台上发布。
我们分别设计了每个场景,然后测试各组件的功能。在调试完成后,我们将这些场景整合到一个架构设计中。
各个组件。最大的问题在于双核性能布局的实现以及与SD卡的协同工作能力。在ESP32芯片上完成整个架构解决方案后,我们在实验室环境中对整个嵌入式系统进行了测试。测试过程中重点关注了以下功能:
- 在不同RTOS中断配置下,对SD卡进行大量数据写入(1000至100,000个样本)的测试。采样频率限制为1kHz,该频率并非振动传感器的极限范围,而是ESP32芯片上运行的RTOS系统的中断频率范围。数据存储设计用于通信故障时的数据备份。
- 通过不同的测量值设置(采样频率、预期采样数量)对ESP32芯片进行远程配置测试。
- 在通过网络传输测量值的同时进行实时测量测试。我们利用了ESP32芯片内存中对测量值的缓冲功能解决方案并优化了通过网络传输的数据量。我们使用树莓派作为物联网中心进行实时数据采集。选择树莓派是因为其降低了整体嵌入式系统和控制设备解决方案的成本。在嵌入式系统的开发过程中,我们验证了部分组件的可重用性,例如通信、持久化和系统可配置性。
为了全面验证ESP32芯片上架构设计的通用性,需要对多种新型ESP32开发板进行测试。我们将在未来重点关注这一方面。我们已测试的第一块开发板是TTGO TS v1.4,该板集成了与我们的样例解决方案相同的传感器组。得益于该板的尺寸和一体化设计,此开发板既适用于测试,也适用于工业环境。我们希望在不久的将来,利用树莓派上的前沿计算实现复杂的诊断功能,并在ESP32芯片上进行评估。
我们获得并同时验证了有关总体架构设计的知识实际示例的实现,可以从多个角度进行评估:
- 我们已经验证了部署相对较新的ESP32微控制器的整个开发周期,该微控制器在物联网应用领域正获得越来越高的普及度和应用。
- ESP32微控制器具有两个独立核心,这一特点被认为是一个巨大优势,因此我们的架构设计能够天然地支持并行处理的概念。从架构设计的角度来看,ESP32微控制器所使用的芯片可以与个人计算机中使用的处理器相比较。
- 设计应用。这使用了FreeRTOS系统接口,使我们能够在任务中工作。FreeRTOS可被视为嵌入式开发系统的轻量级版本。另一方面,ESP8266芯片采用单个内核,在实现FreeRTOS任务时发生伪并行处理。因此,ESP32在实时处理方面为我们提供了巨大优势。
- 这种处理所依赖的FreeRTOS接口行为也在其他芯片(如ATMEL)上得到验证,其中单内核无法提供原生的实时行为。各个任务的触发由其优先级控制。我们必须注意到,应将最高优先级分配给程序执行任务,以避免功能阻塞,因此测量任务具有较低优先级,可能意外被阻塞。这种情况在双核芯片中不会发生,因为我们 可以将一个测量任务分配到一个内核,而将程序执行分配到另一个内核,这正是我们在架构设计解决方案中所采用的方式。
我们创建了一种可重用架构,可用于开发其他嵌入式系统。我们可以利用该架构在测量和处理来自不同类型传感器的数据时部署ESP32芯片。在我们的示例应用中,我们选择了一个九轴加速度计和温度传感器,以同时展示十个测量变量的数据处理。我们可以将该嵌入式系统集成其他类型的传感器,用于测量物理变量;我们的可重用性架构不会改变,只有被测量的变量类型会不同。
架构设计基于组件的简洁性和职责,每个组件仅处理自身的功能。面向桌面和Web应用程序的设计模式开发以相同的方式工作。我们受到这些模式的启发,尝试将这种架构设计转化为使用物联网技术的嵌入式系统。我们解决的最大问题之一是:嵌入式系统的开发通常基于过程式编程,而设计模式则采用面向对象方法。这一问题需要进一步阐述,并适应可能的过程式解决方案。同时,我们试图从SOLID原则的角度引入一些原则,例如以下内容:
- 单一职责原则 :换句话说,每个组件应仅负责一件事情,且其名称应能清晰地说明该职责。
- 开闭原则 :组件应对扩展开放,但对修改关闭。扩展组件的功能应仅通过添加新代码实现,而无需修改现有代码。
- 接口隔离原则 :多个特定的接口优于一个通用的接口。组件应仅依赖于其使用的接口。如果我们仅定义一个大型接口,我们会失去对其各个部分使用情况的概览。在更改组件接口时,必须始终检查并根据需要修改其所有使用之处。
SOLID 架构的其他原则在嵌入式世界中难以实现,将在后续研究中加以处理。
- 架构是通用且独立的。我们独立于编程语言和开发平台。我们可以以多种方式开发最终的应用程序,通常取决于技术进步、调试开发工具以及在源代码编译级别实现特定的头函数。如果在某些新兴的开发平台上,库函数的性能被优化用于解决依赖关系,我们可以在不重构整个应用理念的情况下迁移到不同的开发平台。我们可以选择在Windows或Linux下进行开发,系统之间的切换不会带来痛苦;相反,我们可以将应用程序适配到周围的生态系统中。我们可以在个人计算机、笔记本电脑、工业PC、树莓派类计算机或其他设备之间更换主系统,而无需更改架构。
- 应用架构本质上不应过于复杂,其主要目标是创建一个可测试、长期可持续且能够在不丧失现有行为的情况下实现新功能的应用。因此,我们在架构设计中定义了各个组件(子系统),每个组件都有明确的职责(远程访问、通信和配置)。这意味着它们具有良好的可测试性和可维护性。扩展如此设计的应用程序并不困难,且该应用程序能够适应未来的变更,同时保持其可持续性和可测试性。
更多推荐

所有评论(0)