news 2026/5/31 14:04:28

基于树莓派与nRF52840搭建OpenThread边界路由器,实现低功耗物联网Mesh组网

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于树莓派与nRF52840搭建OpenThread边界路由器,实现低功耗物联网Mesh组网

1. 项目概述与核心价值

如果你正在寻找一种能彻底摆脱传统Wi-Fi或Zigbee在智能家居应用中遇到的覆盖、功耗和稳定性困扰的无线组网方案,那么基于Thread协议的物联网网络绝对值得你深入研究。我最近花了几周时间,成功搭建了一套完整的OpenThread边界路由器系统,核心是利用一块闲置的树莓派4B和一个成本不到百元的nRF52840 USB Dongle,实现了对开源Thread Sensor Tag的稳定连接与数据采集。整个过程下来,最深的体会是:Thread协议带来的“自愈”Mesh网络确实名不虚传,设备入网后几乎无需人工干预,网络拓扑变化时数据路径能自动、无缝地切换,传感器数据的丢包率极低。

这个项目的核心,是构建一个符合Thread标准的“边界路由器”。你可以把它理解为一个特殊的“网关”或“翻译官”。它一端通过Wi-Fi或以太网连接着你家的互联网主干,另一端则通过低功耗的Thread无线网状网络,管理着像温湿度传感器、门磁、开关这类电池供电的设备。nRF52840 Dongle在这里扮演了“无线电协处理器”的角色,专门负责处理复杂的Thread网络协议栈和射频通信,而树莓派则作为“大脑”,运行着OpenThread边界路由器的核心软件,负责网络配置、设备管理和数据转发。这种软硬件分离的设计,既保证了协议处理的专业性和低功耗,又充分利用了树莓派强大的计算能力和丰富的生态。

最终实现的效果是,将一枚纽扣电池供电的Thread Sensor Tag放入网络,它便能以30秒为间隔,持续、稳定地将光照、温湿度、气压和电池电压数据,通过Thread网络发送到边界路由器,再经由UDP广播出来。这些数据可以被Home Assistant、Node-RED等平台轻松捕获,进而实现自动化场景或历史数据存储。对于开发者、智能家居爱好者或物联网学习者而言,亲手搭建这样一套系统,不仅能透彻理解Thread协议和IPv6 over Low-Power Wireless Personal Area Networks的技术精髓,更能获得一个可扩展、高可靠的真实物联网数据感知层,为后续更复杂的应用开发打下坚实基础。

2. 硬件选型与底层原理剖析

2.1 核心硬件:为什么是Raspberry Pi + nRF52840?

在这个项目中,硬件选型直接决定了系统的稳定性、功耗和可扩展性。我选择Raspberry Pi 4B作为主控制器,主要基于以下几点考量:首先,它拥有充足的算力(四核Cortex-A72)来流畅运行OpenThread边界路由器软件及其Web管理界面;其次,它标配的千兆以太网和双频Wi-Fi为边界路由器提供了灵活的上行互联网接入方式;最后,其庞大的社区和丰富的Linux软件生态,使得安装依赖、调试和后期功能扩展都异常方便。虽然树莓派3B+也能胜任,但Pi 4在性能上的余量能让整个系统运行得更从容,尤其是在未来接入更多Thread设备或运行额外服务时。

nRF52840 USB Dongle的选择则是Thread网络得以成立的关键。Thread协议栈对时序和射频控制的要求极为苛刻,如果让树莓派直接通过其GPIO驱动一个简单的2.4GHz射频模块来实现,不仅开发难度巨大,且功耗和稳定性都无法保证。nRF52840是一款集成了ARM Cortex-M4内核和强大2.4GHz射频前端的SoC。在本项目中,我们将其刷写为“无线电协处理器”固件。这意味着,所有与Thread物理层、MAC层以及网络层路由等相关的复杂、实时性要求高的任务,全部由这颗M4内核独立完成。树莓派只需通过USB虚拟出的串口,以高级命令与RCP进行通信,发送如“组建网络”、“允许设备加入”等指令,并接收来自网络的数据包。这种架构实现了专业的人做专业的事:nRF52840确保无线通信的可靠与低功耗,树莓派则专注于网络管理、数据聚合和对外服务。

2.2 Thread协议与OpenThread:开源实现的优势

Thread协议的本质,是在IEEE 802.15.4的物理无线电标准之上,构建了一个完整的、基于IPv6的网络层。它的设计目标非常明确:为电池供电的设备创造一个稳定、安全、能自我修复的无线Mesh网络。其核心特性包括:

  1. Mesh网状拓扑:网络中的每个设备(称为Router或End Device)都可以中继数据,自动寻找最优路径,极大地扩展了覆盖范围,并消除了单点故障。
  2. 基于IPv6:每个Thread设备都拥有一个全球唯一的IPv6地址,这使得它能够无缝融入现有的互联网体系,数据可以直接用UDP、TCP等标准协议传输,降低了应用层开发难度。
  3. 自愈与自组织:当某个路由器节点失效或移动时,网络会在秒级时间内重新计算路由,恢复通信,无需人工干预。
  4. 高安全性:从设备加入网络开始,所有的通信都经过加密和认证,确保了网络的安全性。

OpenThread则是由谷歌发布并主导维护的Thread协议的一个开源实现。它完整实现了Thread 1.1.x和1.2.x版本的所有功能。选择OpenThread意味着你拥有了整个协议栈的源代码,可以移植到多种MCU平台(如nRF52系列、ESP32、Silicon Labs等),同时也获得了由谷歌和社区持续维护的边界路由器软件。这对于学习和定制化开发来说,价值是无可替代的。我们本次使用的ot-br-posix项目,正是OpenThread为基于POSIX接口的系统(如Linux)提供的边界路由器实现。

2.3 Thread Sensor Tag:一个理想的低功耗终端样本

为了验证网络,我选择了开源的Thread Sensor Tag作为终端设备。它是一个绝佳的教学和原型工具。板上集成了温湿度、气压、光照传感器以及一个RGB LED状态指示灯,由一颗CR2032纽扣电池供电。其固件基于OpenThread的End Device示例开发,完美展示了Thread终端设备的典型行为:绝大部分时间处于深度睡眠状态以节电,每30秒唤醒一次,采集传感器数据,并通过Thread网络发送一次UDP广播报文,然后再次休眠。这种极低占空比的工作模式,是其能实现超长电池寿命(理论可达数年)的根本。通过研究它的代码和电路设计,你能深刻理解如何为实际产品设计低功耗Thread节点。

3. 系统搭建详细步骤与实操要点

3.1 基础环境准备:树莓派系统与网络配置

第一步是让树莓派“活”起来。我强烈推荐使用官方的Raspberry Pi Imager工具来烧录系统。它不仅操作简单,更关键的是其“高级选项”功能能让你在烧录前就完成绝大部分基础配置,避免首次启动后还要接显示器键盘的麻烦。

在Imager中,选择你的树莓派型号(如Raspberry Pi 4),然后在操作系统选择界面,点击“选择OS”,滚动到下方,选择“Raspberry Pi OS (other)”,接着选择“Raspberry Pi OS (Legacy, 64-bit) Lite”。这里选择“Legacy”版本和“Lite”版本至关重要。Legacy版本使用稳定的、长期支持的Debian Bullseye内核和库,兼容性最好;Lite版本是无桌面环境的精简版,节省资源且更稳定,非常适合作为服务器运行。

注意:务必选择64位版本。因为后续安装的OpenThread边界路由器软件的一些依赖包在32位系统上可能存在兼容性问题,从源头使用64位系统能避免很多潜在的麻烦。

选中SD卡后,不要急着点击“烧录”,先按下键盘的Ctrl+Shift+X打开“高级选项”。在这里,你需要至少配置以下几项:

  • 启用SSH:勾选“启用SSH”,建议选择“使用密码认证”,并设置一个强密码。
  • 配置Wi-Fi:填写你的家庭Wi-Fi SSID和密码,并设置国家代码(如CN)。这样树莓派启动后就能自动连接网络。
  • 设置主机名:例如otbr-pi,方便在网络中识别。
  • 设置用户名和密码:这是你登录系统的凭证,务必牢记。

配置完成后,点击“烧录”。完成后,将SD卡插入树莓派,上电启动。等待一两分钟后,你可以在路由器的管理界面中找到名为otbr-pi(或你设置的主机名)的设备,并记下其IP地址。随后,即可使用SSH客户端(如PuTTY或终端下的ssh命令)登录树莓派。

3.2 nRF52840 Dongle固件刷写:从零到RCP

拿到nRF52840 USB Dongle后,它只是一块空白的开发板。我们需要为其刷写专门的“Radio Co-Processor”固件,让它变成一个纯粹的Thread协议无线收发器。

首先,在你的个人电脑(Windows/macOS/Linux均可)上,需要安装Nordic Semiconductor的烧录工具链。最核心的是nrfutil工具。可以通过Python的pip包管理器安装:

pip install nrfutil

安装后,在命令行输入nrfutil --version验证是否成功。

接下来是固件。对于初学者,我建议直接使用预编译好的稳定版本,避免自己编译可能遇到的复杂环境问题。你可以从OpenThread的官方GitHub仓库发布页面找到最新的ot-rcp固件.zip文件。下载到本地。

刷写步骤:

  1. 进入DFU模式:用USB线将nRF52840 Dongle连接到电脑。找到板载的小复位按钮(通常需要镊子点按),快速按一下。此时,Dongle上的LED可能会快速闪烁或变化,并且在你的电脑上,它会作为一个USB串行设备出现(如/dev/ttyACM0在Linux/macOS,或COMx在Windows)。
  2. 执行烧录命令:打开终端,切换到存放下载的ot-rcp.zip文件的目录。执行命令(请根据你的系统替换端口号):
    # Linux/macOS 示例 nrfutil dfu usb-serial -pkg ot-rcp.zip -p /dev/ttyACM0 # Windows 示例,需要在设备管理器中查看COM端口号 nrfutil dfu usb-serial -pkg ot-rcp.zip -p COM3
  3. 等待完成:命令行会显示进度条。烧录成功后,Dongle会自动复位。此时,它就已经是一个功能完整的OpenThread RCP设备了。将其从电脑上拔下,稍后连接到树莓派。

实操心得:如果烧录失败,最常见的原因是端口号不对或设备未正确进入DFU模式。可以尝试重新插拔并按复位键,使用ls /dev/ttyACM*ls /dev/ttyUSB*(Linux/macOS)查看新的端口出现。在Windows上,设备管理器中的端口号可能在每次插拔后变化。

3.3 OpenThread边界路由器软件安装与配置

现在,我们回到树莓派的SSH会话中,开始安装核心软件。

  1. 克隆仓库与引导安装

    git clone https://github.com/openthread/ot-br-posix.git cd ot-br-posix

    使用git clone获取最新的源代码。接下来运行引导脚本。这里有一个关键参数WEB_GUI=1,它指示脚本安装并启用基于Web的管理界面,这对于图形化操作网络至关重要。

    WEB_GUI=1 ./script/bootstrap

    这个脚本会运行较长时间,因为它要更新系统包列表,安装所有必要的依赖,如wpantundavahi-daemon(用于mDNS服务发现)等。请保持网络畅通,耐心等待。

  2. 运行设置脚本:引导完成后,运行设置脚本。这里需要指定一个重要的参数INFRA_IF_NAME,它代表树莓派连接互联网的“基础设施接口”名称。

    • 如果你的树莓派通过网线连接路由器,接口名通常是eth0
    • 如果你的树莓派通过Wi-Fi连接,接口名通常是wlan0。 我使用的是Wi-Fi连接,所以命令如下:
    INFRA_IF_NAME=wlan0 WEB_GUI=1 ./script/setup

    这个脚本会配置系统服务,设置网络转发规则,并启动OpenThread边界路由器的守护进程。

  3. 重启与验证:安装完成后,强烈建议重启树莓派以使所有配置生效。

    sudo reboot

    等待树莓派重新启动并 SSH 重新连接后,你可以通过以下命令检查关键服务是否运行正常:

    sudo service otbr-agent status

    如果状态为active (running),说明核心服务已就绪。此时,在电脑浏览器中输入树莓派的IP地址,例如http://192.168.1.100,你应该能看到OpenThread Border Router的Web管理登录界面。默认用户名是admin,密码是admin。首次登录后会要求修改密码。

注意事项:在运行./script/setup时,如果遇到关于Docker或网络配置的错误,可以忽略Docker相关部分,因为我们使用的是本地原生安装。确保你的树莓派能正常访问互联网(可以ping 8.8.8.8测试),并且INFRA_IF_NAME参数设置正确。

4. Thread网络组建与设备入网实战

4.1 通过Web GUI创建Thread网络

登录OTBR的Web管理界面后,左侧菜单栏的“Form”选项就是用来创建新Thread网络的。点击进入后,你会看到几个关键参数:

  • Network Name:你的Thread网络名称,可以自定义,如MyHomeThread
  • PAN ID:个人区域网络ID,一个16位十六进制数。可以保留默认,但为了与周边可能存在的其他Thread网络区分,建议修改为一个随机值,如0x1234
  • Network Key:网络密钥,用于加密整个Thread网络的所有通信。务必使用强随机密钥,不要使用默认值。可以点击生成按钮创建一个。
  • Channel:无线信道(11-26)。建议先使用频谱仪工具扫描一下你所在环境的2.4GHz Wi-Fi信道占用情况,选择一个相对空闲的信道以减少干扰。如果无工具,可以选择15、20、25这些通常比较空闲的信道。
  • On-Mesh Prefix:这是Thread网络内部分配IPv6地址的前缀。可以保留默认的fd11:22::/64

配置完成后,点击“Form”按钮。几秒钟后,界面会刷新,顶部状态会显示“Leader”,这意味着你的树莓派(通过nRF52840 Dongle)已经成功组建了一个Thread网络,并自身作为“Leader”路由器运行。此时,左侧菜单的“State”页面会显示网络的详细拓扑和状态信息。

4.2 调试Thread Sensor Tag并加入网络

现在,让我们的终端设备——Thread Sensor Tag上线。

  1. 设备上电与状态确认:为Sensor Tag装入CR2032电池。上电后,板载的RGB LED会执行一段“开机自检”闪烁序列:红 -> 绿 -> 蓝,然后快速闪烁两次蓝色。这个“蓝蓝”闪烁模式表明设备已启动,但尚未加入任何Thread网络,正处于“未关联”状态。
  2. 获取加入凭证:Thread设备加入网络需要凭证。对于Thread Sensor Tag这个开源项目,其出厂默认的“Joiner PSKd”是ABCDE4。PSKd是一个临时密钥,用于在加入过程中进行安全认证。
  3. 在OTBR中启动 commissioning:在OTBR Web界面的左侧菜单,点击“Commission”。在“Joiner PSKd”输入框中填入ABCDE4,然后点击“Start Commission”。界面会提示“Commissioner started”。
  4. 触发设备加入:在Sensor Tag上,短按一下用户按钮(通常标记为SW1或BUTTON)。设备LED会开始快速闪烁绿色,这表示它正在尝试发现并加入网络。这个过程通常很快(几秒内)。
  5. 加入成功确认:如果一切顺利,OTBR Web界面的“Commission”页面会弹出一个成功对话框,显示新加入设备的扩展地址(EUI-64)。同时,Sensor Tag的LED会变为每30秒稳定地闪烁一次绿色。这个“心跳”式的闪烁,正是它正常工作、周期性发送传感器数据的标志!

实操心得:加入过程失败最常见的原因是PSKd错误,或者设备与边界路由器距离太远、信号太差。确保设备在边界路由器的有效覆盖范围内(初期测试建议在1-2米内无遮挡)。如果多次失败,可以尝试对Sensor Tag进行“恢复出厂设置”:在设备上电完成红绿蓝自检后、第二次蓝灯闪烁前,快速同时按下两个用户按钮并保持,直到看到蓝色LED连续闪烁三次,即表示重置成功,可以再次尝试加入。

4.3 数据抓取与解析:验证数据流

设备成功加入后,它就会开始每30秒发送一次UDP数据包。这些数据被发送到边界路由器上一个特定的IPv6多播地址和端口。为了验证数据流,我们可以在树莓派上使用一个强大的网络工具socat来监听。

首先安装socat

sudo apt update sudo apt install socat -y

然后运行监听命令:

socat UDP6-RECV:4141 STDOUT

这个命令会阻塞终端,并打印出所有发送到UDP端口4141的数据。等待大约30秒,你应该能看到类似如下的JSON格式数据行出现:

thread_tags/a1b2c3d4{"alive": 2893, "voltage": 3.012, "light": 45.67, "temperature": 23.45, "humidity": 55.30, "pressure": 1012.34}

恭喜!这证明整个数据链路已经完全打通。数据解读如下:

  • thread_tags/a1b2c3d4:主题前缀和设备唯一ID。
  • alive:设备自启动后的“心跳”计数,乘以30秒即得运行总秒数。
  • voltage:电池电压(伏特),是判断电池电量的直接依据。CR2032电池标称电压3V,当电压持续低于2.6V左右时,就应考虑更换。
  • light:环境光照强度(流明)。
  • temperature:温度(摄氏度)。
  • humidity:相对湿度(百分比)。
  • pressure:大气压强(百帕斯卡)。

5. 高级配置、问题排查与生态集成

5.1 网络优化与安全加固

基础网络搭建成功后,为了长期稳定运行,还需要进行一些优化和加固。

  1. 修改默认密码:Web GUI和系统SSH的默认密码必须修改,这是最基本的安全措施。
  2. 固定树莓派IP地址:在你的家庭路由器DHCP设置中,为树莓派的MAC地址分配一个固定的内网IP地址(如192.168.1.100),避免IP变化导致无法访问Web GUI。
  3. Thread网络密钥管理:记录下你创建Thread网络时生成的Network Key,并妥善保存。如果未来需要重置网络或添加新的边界路由器,这个密钥是必需的。
  4. 考虑有线连接:对于长期稳定运行的边界路由器,如果条件允许,建议使用网线(eth0)连接路由器,而不是Wi-Fi。有线连接在延迟和稳定性上远胜无线,能提供更可靠的上行链路。

5.2 常见问题排查速查表

在搭建和运行过程中,你可能会遇到以下问题。这里提供一个快速排查指南:

问题现象可能原因排查步骤与解决方案
无法通过浏览器访问OTBR Web界面1. 树莓派IP地址错误或已变。
2.otbr-agent服务未运行。
3. 防火墙阻止了80端口。
1. 登录路由器后台确认树莓派IP,或用hostname -I命令查询。
2. 运行sudo service otbr-agent status检查服务状态,尝试sudo service otbr-agent restart
3. 检查树莓派防火墙规则sudo ufw status
nRF52840 Dongle无法被识别1. USB接触不良或供电不足。
2. 缺少USB串口驱动。
1. 更换USB口或USB线,最好连接到树莓派蓝色的USB 3.0口。
2. 运行ls /dev/ttyACM*,查看是否有类似ttyACM0的设备。如果没有,尝试sudo apt install brcmusb-mods后重启。
Thread Sensor Tag无法加入网络1. Joiner PSKd错误。
2. 设备距离太远或信号受阻。
3. OTBR的Commissioner未成功启动。
4. 网络信道干扰严重。
1. 确认使用正确的PSKd(默认ABCDE4)。
2. 将设备移至边界路由器旁重试。
3. 在OTBR Web GUI “Commission”页面确认状态,重启该功能。
4. 在OTBR “Form”页面尝试更换一个Thread信道。
socat命令收不到数据1. Sensor Tag未成功入网。
2.socat监听命令参数错误。
3. 数据被防火墙拦截。
1. 确认Sensor Tag LED为每30秒单次绿色闪烁。
2. 确保命令为socat UDP6-RECV:4141 STDOUT
3. 临时关闭防火墙测试sudo ufw disable(测试后记得开启)。
Web GUI中网络状态不稳定1. 无线干扰。
2. nRF52840 Dongle供电不稳。
3. 树莓派CPU负载过高。
1. 更换Thread信道,远离微波炉、蓝牙设备等。
2. 确保使用高质量的USB线和电源为树莓派供电。
3. 使用htop命令查看资源占用,关闭不必要的进程。

5.3 数据集成:连接Home Assistant与Node-RED

原始的UDP数据需要被转化为更有价值的信息流。这里介绍两种最流行的集成方式。

方案一:通过Node-RED进行数据转换与转发Node-RED是一个极佳的低代码流编排工具,非常适合做物联网数据的中转和处理。

  1. 在树莓派上安装Node-RED:bash -c "$(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)"
  2. 启动并访问Node-RED Web界面(通常为http://树莓派IP:1880)。
  3. 安装node-red-contrib-socat节点(或在管理面板中搜索安装)。
  4. 搭建一个简单的流:使用socat in节点监听UDP 4141端口 -> 使用function节点解析JSON字符串 -> 使用mqtt out节点将处理后的数据发布到MQTT服务器(如Mosquitto)。
  5. 这样,格式规整的传感器数据就通过MQTT协议发布出去了,可以被Home Assistant等任何支持MQTT的平台订阅。

方案二:Home Assistant直接集成Home Assistant(HA)可以通过其强大的集成生态直接接入。

  1. 确保HA和树莓派在同一个局域网。
  2. 在HA的“配置”->“集成”中,点击右下角“添加集成”,搜索“Thread”。(注意:此集成可能仍在测试阶段,或需要通过HACS安装)。
  3. 按照指引,输入OTBR的IP地址和管理员凭证。
  4. 成功添加后,HA会自动发现Thread网络中的设备(如Sensor Tag),并将其传感器实体创建出来,你可以直接在HA的仪表盘上看到实时数据,并用于自动化触发。

我个人更倾向于Node-RED + MQTT的方案。因为它提供了极高的灵活性,你可以在数据流入HA之前,轻松地添加过滤、计算(如求平均值)、单位转换或与其他数据源融合的逻辑。例如,你可以写一个简单的函数节点,当电池电压低于2.7V时,向MQTT发布一个“低电量”警告主题,HA订阅这个主题后就可以发送手机通知提醒你更换电池。

搭建这套系统的过程,让我对低功耗物联网网络的“端-边-云”协同有了更立体的认识。Thread协议负责解决最后一段无线连接的可靠与节能问题,边界路由器作为智能边缘网关进行协议转换和设备管理,而像Home Assistant这样的平台则专注于应用逻辑和用户体验。这种分层解耦的设计,正是现代物联网系统的精髓。当你看到Sensor Tag上那每隔30秒一次的微弱绿色闪光,并通过自己搭建的系统,在手机APP上实时看到家里的温湿度变化时,那种从无到有、打通全链路的成就感,是任何现成产品都无法给予的。这套系统就像一个乐高底座,你已经拥有了最核心的网络层,接下来无论是添加更多的Thread开关、门锁,还是将数据接入更复杂的分析平台,道路都已铺平。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/29 14:16:30

DIY扬声器制作指南:从电磁原理到动手实践

1. 项目概述与核心原理拆解如果你对音响设备里那个能发出声音的“喇叭”感到好奇,或者想亲手体验一下电信号如何变成我们听到的音乐,那么自己动手做一个扬声器绝对是一次迷人的旅程。这不仅仅是把几个零件粘在一起,更是对电磁学基础原理的一次…

作者头像 李华
网站建设 2026/5/29 14:15:28

如何3步解锁中兴光猫工厂模式:专业级zteOnu工具实战指南

如何3步解锁中兴光猫工厂模式:专业级zteOnu工具实战指南 【免费下载链接】zteOnu A tool that can open ZTE onu device factory mode 项目地址: https://gitcode.com/gh_mirrors/zt/zteOnu 中兴光猫设备通常隐藏了工厂模式权限,限制了网络管理员…

作者头像 李华
网站建设 2026/5/29 14:13:58

XXMI Launcher:终极多游戏模组管理器完整指南

XXMI Launcher:终极多游戏模组管理器完整指南 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 还在为管理多个游戏的模组而烦恼吗?XXMI Launcher是你一直在…

作者头像 李华
网站建设 2026/5/29 14:10:57

FanControl实战指南:3个高级技巧彻底解决Windows风扇噪音问题

FanControl实战指南:3个高级技巧彻底解决Windows风扇噪音问题 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tren…

作者头像 李华