From a6bc910b0f9daef50e3b752fee7e7a150f82e647 Mon Sep 17 00:00:00 2001 From: hrz <1710360675@qq.com> Date: Tue, 3 Jun 2025 10:27:13 +0800 Subject: [PATCH] =?UTF-8?q?udpate:=E6=9B=B4=E6=96=B0=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- README_en.md | 180 +++++++++++++++--------------------- docs/dev-ops-integration.md | 163 ++++++++++++++++++++++++++++++++ 3 files changed, 242 insertions(+), 104 deletions(-) create mode 100644 docs/dev-ops-integration.md diff --git a/README.md b/README.md index 2f99f957..43a8acd4 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ | 部署方式 | 特点 | 适用场景 | 部署文档 | 配置要求 | 视频教程 | |---------|------|---------|---------|---------|---------| | **最简化安装** | 智能对话、IOT功能,数据存储在配置文件 | 低配置环境,无需数据库 | [Docker版](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E5%8F%AA%E8%BF%90%E8%A1%8Cserver) / [源码部署](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)| 如果使用`FunASR`要2核4G,如果全API,要2核2G | - | -| **全模块安装** | 智能对话、IOT、OTA、智控台,数据存储在数据库 | 完整功能体验 |[Docker版](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [源码部署](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) | 如果使用`FunASR`要4核8G,如果全API,要2核4G| [本地源码视频教程](https://www.bilibili.com/video/BV1wBJhz4Ewe) | +| **全模块安装** | 智能对话、IOT、OTA、智控台,数据存储在数据库 | 完整功能体验 |[Docker版](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) / [源码部署](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) | 如果使用`FunASR`要4核8G,如果全API,要2核4G| [本地源码启动视频教程](https://www.bilibili.com/video/BV1wBJhz4Ewe) / [本地源码自动更新教程](./docs/dev-ops-integration.md) | > 💡 提示:以下是按最新代码部署后的测试平台,有需要可烧录测试,并发为6个,每天会清空数据 @@ -195,6 +195,7 @@ Websocket接口地址: wss://2662r3426b.vicp.fun/xiaozhi/v1/ |---------|---------|------| | ASR(语音识别) | FunASR(本地) | ✅DoubaoASR(火山流式语音识别) | | LLM(大模型) | ChatGLMLLM(智谱glm-4-flash) | ✅DoubaoLLM(火山doubao-1-5-pro-32k-250115) | +| VLLM(视觉大模型) | ChatGLMVLLM(智谱glm-4v-flash) | ✅ChatGLMVLLM(智谱glm-4v-flash) | | TTS(语音合成) | EdgeTTS(微软语音) | ✅HuoshanDoubleStreamTTS(火山双流式语音合成) | | Intent(意图识别) | function_call(函数调用) | ✅function_call(函数调用) | | Memory(记忆功能) | mem_local_short(本地短期记忆) | ✅mem_local_short(本地短期记忆) | diff --git a/README_en.md b/README_en.md index 9b4ed8ce..6b4d2c1f 100644 --- a/README_en.md +++ b/README_en.md @@ -6,14 +6,14 @@ This project provides backend services for the open-source smart hardware project xiaozhi-esp32
Implemented using Python, Java, and Vue according to the Xiaozhi Communication Protocol
-Helping you quickly set up your Xiaozhi server +Helps you quickly set up your Xiaozhi server

中文 · FAQ · Report IssuesDeployment GuideDeployment Guide · Release Notes

@@ -50,7 +50,7 @@ Want to see it in action? Check out these videos 🎥 - Xiaozhi esp32 connecting to custom backend model + Xiaozhi esp32 connecting to own backend model @@ -64,14 +64,14 @@ Want to see it in action? Check out these videos 🎥 - Cantonese communication + Using Cantonese - Home appliance control + Control home appliances @@ -94,7 +94,7 @@ Want to see it in action? Check out these videos 🎥 - Music playback + Play music @@ -108,7 +108,7 @@ Want to see it in action? Check out these videos 🎥 - IOT device control + IOT command control @@ -120,6 +120,33 @@ Want to see it in action? Check out these videos 🎥 + + + + + Real-time interruption + + + + + + + Photo recognition + + + + + + + Multi-command tasks + + + + + + + + --- @@ -137,137 +164,84 @@ It is recommended that users prioritize service providers with relevant business ![Banners](docs/images/banner2.png) -This project offers two deployment methods. Please choose based on your specific needs: +This project provides two deployment methods. Please choose according to your specific needs: #### 🚀 Deployment Method Selection +| Deployment Method | Features | Suitable Scenarios | Deployment Guide | Requirements | Video Tutorial | +|---------|------|---------|---------|---------|---------| +| **Simplified Installation** | Smart dialogue, IOT functionality, data stored in configuration files | Low-configuration environment, no database needed | [Docker Version](./docs/Deployment.md#method-1-docker-server-only) / [Source Code Deployment](./docs/Deployment.md#method-2-local-source-code-server-only) | 2 cores 4G if using `FunASR`, 2 cores 2G if using all APIs | - | +| **Full Module Installation** | Smart dialogue, IOT, OTA, Control Panel, data stored in database | Complete functionality experience | [Docker Version](./docs/Deployment_all.md#method-1-docker-full-modules) / [Source Code Deployment](./docs/Deployment_all.md#method-2-local-source-code-full-modules) | 4 cores 8G if using `FunASR`, 2 cores 4G if using all APIs | [Local Source Code Startup Video Tutorial](https://www.bilibili.com/video/BV1wBJhz4Ewe) / [Local Source Code Auto-Update Tutorial](./docs/dev-ops-integration.md) | -| Deployment Method | Features | Use Case | Docker Deployment Guide | Source Code Deployment Guide | -|---------|------|---------|---------|---------| -| **Simplified Installation** | Smart dialogue, IOT functionality, data stored in configuration files | Low-configuration environment, no database required | [Docker Server Only](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E5%8F%AA%E8%BF%90%E8%A1%8Cserver) | [Local Source Code Server Only](./docs/Deployment.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E5%8F%AA%E8%BF%90%E8%A1%8Cserver)| -| **Full Module Installation** | Smart dialogue, IOT, OTA, Control Panel, data stored in database | Complete functionality experience |[Docker Full Module](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%B8%80docker%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) | [Local Source Code Full Module](./docs/Deployment_all.md#%E6%96%B9%E5%BC%8F%E4%BA%8C%E6%9C%AC%E5%9C%B0%E6%BA%90%E7%A0%81%E8%BF%90%E8%A1%8C%E5%85%A8%E6%A8%A1%E5%9D%97) | - -> 💡 Note: Below is the test platform deployed with the latest code. You can flash and test if needed. Concurrent users: 6, data cleared daily +> 💡 Note: Below are the test platforms deployed with the latest code. You can flash and test if needed. Concurrent users: 6, data will be cleared daily ``` -Control Panel: https://2662r3426b.vicp.fun +Control Panel Address: https://2662r3426b.vicp.fun Service Test Tool: https://2662r3426b.vicp.fun/test/ -OTA Interface: https://2662r3426b.vicp.fun/xiaozhi/ota/ -Websocket Interface: wss://2662r3426b.vicp.fun/xiaozhi/v1/ +OTA Interface Address: https://2662r3426b.vicp.fun/xiaozhi/ota/ +Websocket Interface Address: wss://2662r3426b.vicp.fun/xiaozhi/v1/ ``` +#### 🚩 Configuration Description and Recommendations +> [!Note] +> The default configuration of this project is `Entry Level Free` settings. For better results, we recommend using `Full Streaming Configuration`. +> +> Since version `0.5.2`, this project supports full streaming throughout the entire lifecycle. Compared to versions before `0.5`, response speed has improved by approximately `2.5 seconds` + +| Module Name | Entry Level Free Settings | Full Streaming Configuration | +|---------|---------|------| +| ASR(Speech Recognition) | FunASR(Local) | ✅DoubaoASR(Volcano Streaming Speech Recognition) | +| LLM(Large Language Model) | ChatGLMLLM(Zhipu glm-4-flash) | ✅DoubaoLLM(Volcano doubao-1-5-pro-32k-250115) | +| VLLM(Vision Large Model) | ChatGLMVLLM(Zhipu glm-4v-flash) | ✅ChatGLMVLLM(Zhipu glm-4v-flash) | +| TTS(Speech Synthesis) | EdgeTTS(Microsoft Speech) | ✅HuoshanDoubleStreamTTS(Volcano Double Streaming Speech Synthesis) | +| Intent(Intent Recognition) | function_call(Function Call) | ✅function_call(Function Call) | +| Memory(Memory Function) | mem_local_short(Local Short-term Memory) | ✅mem_local_short(Local Short-term Memory) | + --- ## Feature List ✨ - ### Implemented ✅ | Feature Module | Description | |---------|------| | Communication Protocol | Based on `xiaozhi-esp32` protocol, implements data interaction through WebSocket | -| Dialogue Interaction | Supports wake-up dialogue, manual dialogue, and real-time interruption. Auto-sleep after long periods of inactivity | +| Dialogue Interaction | Supports wake-up dialogue, manual dialogue, and real-time interruption. Auto-sleep after long periods of no dialogue | | Intent Recognition | Supports LLM intent recognition, function call, reducing hard-coded intent judgment | | Multi-language Recognition | Supports Mandarin, Cantonese, English, Japanese, Korean (default using FunASR) | -| LLM Module | Supports flexible LLM module switching, default using ChatGLMLLM, also supports Ali Bailing, DeepSeek, Ollama, etc. | -| TTS Module | Supports EdgeTTS (default), Volcano Engine Doubao TTS, and other TTS interfaces for speech synthesis | -| Memory Function | Supports ultra-long memory, local summary memory, and no memory modes for different scenarios | -| IOT Function | Supports managing registered device IOT functionality, intelligent IoT control based on dialogue context | -| Control Panel | Provides web management interface, supports agent management, user management, system configuration, etc. | +| LLM Module | Supports flexible LLM module switching, default using ChatGLMLLM, can also use Ali Bailian, DeepSeek, Ollama, etc. | +| TTS Module | Supports EdgeTTS (default), Volcano Engine Doubao TTS, and other TTS interfaces | +| Memory Function | Supports ultra-long memory, local summary memory, and no memory modes | +| IOT Function | Supports managing registered device IOT functionality, supports smart IoT control based on dialogue context | +| Control Panel | Provides Web management interface, supports agent management, user management, system configuration, etc. | ### In Development 🚧 To learn about specific development progress, [click here](https://github.com/users/xinnan-tech/projects/3) -If you're a software developer, here's an [Open Letter to Developers](docs/contributor_open_letter.md). Welcome to join! +If you are a software developer, here is an [Open Letter to Developers](docs/contributor_open_letter.md). Welcome to join! --- ## Product Ecosystem 👬 -Xiaozhi is an ecosystem. When using this product, you might want to check out other excellent projects in this ecosystem: +Xiaozhi is an ecosystem. When using this product, you might also want to check out other excellent projects in this ecosystem -| Project Name | Project Link | Description | +| Project Name | Project Address | Project Description | |:---------------------|:--------|:--------| -| Xiaozhi Android Client | [xiaozhi-android-client](https://github.com/TOM88812/xiaozhi-android-client) | A Flutter-based Android and iOS voice dialogue application supporting real-time voice interaction and text dialogue | -| Xiaozhi PC Client | [py-xiaozhi](https://github.com/Huang-junsen/py-xiaozhi) | A Python-based AI client that allows you to experience Xiaozhi AI functionality through code without physical hardware | -| Xiaozhi Java Server | [xiaozhi-esp32-server-java](https://github.com/joey-zhou/xiaozhi-esp32-server-java) | A Java-based open-source project providing complete backend service solutions | +| Xiaozhi Android Client | [xiaozhi-android-client](https://github.com/TOM88812/xiaozhi-android-client) | A Flutter-based Android and iOS voice dialogue application supporting real-time voice interaction and text dialogue. | +| Xiaozhi PC Client | [py-xiaozhi](https://github.com/Huang-junsen/py-xiaozhi) | This project provides a Python-based Xiaozhi AI client, allowing you to experience Xiaozhi AI's functionality through code even without physical hardware. | +| Xiaozhi Java Server | [xiaozhi-esp32-server-java](https://github.com/joey-zhou/xiaozhi-esp32-server-java) | The Java version of Xiaozhi open-source backend service is a Java-based open-source project.
It includes both frontend and backend services, aiming to provide users with a complete backend service solution. | --- -## Supported Platforms/Components 📋 +## Supported Platforms/Components List 📋 ### LLM Language Models | Usage Method | Supported Platforms | Free Platforms | |:---:|:---:|:---:| -| openai API | Ali Bailing, Volcano Engine Doubao, DeepSeek, ChatGLM, Gemini | ChatGLM, Gemini | -| ollama API | Ollama | - | -| dify API | Dify | - | -| fastgpt API | Fastgpt | - | -| coze API | Coze | - | +| openai interface call | Ali Bailian, Volcano Engine Doubao, DeepSeek, Zhipu ChatGLM, Gemini | Zhipu ChatGLM, Gemini | +| ollama interface call | Ollama | - | +| dify interface call | Dify | - | +| fastgpt interface call | Fastgpt | - | +| coze interface call | Coze | - | -Actually, any LLM supporting openai API calls can be integrated. - ---- - -### TTS Speech Synthesis - -| Usage Method | Supported Platforms | Free Platforms | -|:---:|:---:|:---:| -| API Calls | EdgeTTS, Volcano Engine Doubao TTS, Tencent Cloud, Aliyun TTS, CosyVoiceSiliconflow, TTS302AI, CozeCnTTS, GizwitsTTS, ACGNTTS, OpenAITTS | EdgeTTS, CosyVoiceSiliconflow(partial) | -| Local Service | FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3, MinimaxTTS | FishSpeech, GPT_SOVITS_V2, GPT_SOVITS_V3, MinimaxTTS | - ---- - -### VAD Voice Activity Detection - -| Type | Platform Name | Usage Method | Pricing | Notes | -|:---:|:---------:|:----:|:----:|:--:| -| VAD | SileroVAD | Local Use | Free | | - ---- - -### ASR Speech Recognition - -| Usage Method | Supported Platforms | Free Platforms | -|:---:|:---:|:---:| -| Local Use | FunASR, SherpaASR | FunASR, SherpaASR | -| API Calls | DoubaoASR, FunASRServer, TencentASR, AliyunASR | FunASRServer | - ---- - -### Memory Storage - -| Type | Platform Name | Usage Method | Pricing | Notes | -|:------:|:---------------:|:----:|:---------:|:--:| -| Memory | mem0ai | API Calls | 1000 calls/month quota | | -| Memory | mem_local_short | Local Summary | Free | | - ---- - -### Intent Recognition - -| Type | Platform Name | Usage Method | Pricing | Notes | -|:------:|:-------------:|:----:|:-------:|:---------------------:| -| Intent | intent_llm | API Calls | Based on LLM pricing | Uses large model for intent recognition, highly versatile | -| Intent | function_call | API Calls | Based on LLM pricing | Uses large model function calls for intent, fast and effective | - ---- - -## Acknowledgments 🙏 - -| Logo | Project/Company | Description | -|:---:|:---:|:---| -| | [Bailing Voice Dialogue Robot](https://github.com/wwbin2017/bailing) | This project was inspired by [Bailing Voice Dialogue Robot](https://github.com/wwbin2017/bailing) and implemented based on it | -| | [Tenclass](https://www.tenclass.com/) | Thanks to [Tenclass](https://www.tenclass.com/) for developing standard communication protocols, multi-device compatibility solutions, and high-concurrency scenario practices for the Xiaozhi ecosystem; providing comprehensive technical documentation support for this project | -| | [Xuanfeng Technology](https://github.com/Eric0308) | Thanks to [Xuanfeng Technology](https://github.com/Eric0308) for contributing function call framework, MCP communication protocol, and plugin call mechanism implementation code, significantly improving front-end device (IoT) interaction efficiency and functional extensibility through standardized instruction scheduling system and dynamic expansion capabilities | -| | [Huiyuan Design](http://ui.kwd988.net/) | Thanks to [Huiyuan Design](http://ui.kwd988.net/) for providing professional visual solutions for this project, empowering product user experience with their design experience serving over a thousand enterprises | -| | [Xi'an Qinren Information Technology](https://www.029app.com/) | Thanks to [Xi'an Qinren Information Technology](https://www.029app.com/) for deepening this project's visual system, ensuring consistency and extensibility of overall design style in multi-scenario applications | - - - - - - - - Star History Chart - - \ No newline at end of file +In fact, any LLM that supports openai interface calls can be integrated and used. diff --git a/docs/dev-ops-integration.md b/docs/dev-ops-integration.md new file mode 100644 index 00000000..bb9640b1 --- /dev/null +++ b/docs/dev-ops-integration.md @@ -0,0 +1,163 @@ +# 全模块源码部署自动升级方法 + +本教程是方便全模块源码部署的爱好者,如何通过自动命令,自动拉取源码,自动编译,自动启动端口运行。实现最高效率的升级系统。 + +本项目的测试平台`https://2662r3426b.vicp.fun`,从开放以来就使用了该方法,效果良好。 + +# 开始条件 +- 你的电脑/服务器是linux操作系统 +- 你已经跑通了整个流程 +- 你喜欢跟进最新功能,但是觉得每次手动部署有点麻烦,期待有一个自动更新的方法 + +第二个条件必须满足,因为本教程所涉及的某些文件,JDK、Node.js环境、Conda环境等,是需要你跑通整个流程才有的,如果你没有跑通,当我讲到某个文件的时候,你可能就不知道什么意思。 + +# 教程效果 +- 解决国内不能拉取最新项目源码问题 +- 自动拉取代码编译前端文件 +- 自动拉取代码编译java文件,自动杀掉8002端口,自动启动8002端口 +- 自动拉取python代码,自动杀掉8000端口,自动启动8000端口 + +# 第一步 选好你的项目目录 + +例如,我规划了我的项目目录是,这是一个新建的空白的目录,如果你不想出错,可以和我一样 +``` +/home/system/xiaozhi +``` + +# 第二步 克隆本项目 +此刻,先要执行第一句话,拉取源码,这句命令适用于国内网络的服务器和电脑,无需翻墙 + +``` +cd /home/system/xiaozhi +git clone https://ghproxy.net/https://github.com/xinnan-tech/xiaozhi-esp32-server.git +``` + +执行完后,你的项目目录会多了一个文件夹`xiaozhi-esp32-server`,这个就是项目的源码 + +# 第三步 复制基础的文件 + +如果你之前已经跑通了整个流程,对funasr的模型文件`xiaozhi-server/models/SenseVoiceSmall/model.pt`和你的私有配置文件`xiaozhi-server/data/.config.yaml`这两个文件不会陌生。 + +此刻你需要把`model.pt`文件复制到新的目录去,你可以这样 +``` +cp 你原来的.config.yaml完整路径 /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/data/.config.yaml +cp 你原来的model.pt完整路径 /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/models/SenseVoiceSmall/model.pt +``` + +# 第四步 建立三个自动编译文件 + +## 4.1 自动编译mananger-web模块 +在`/home/system/xiaozhi/`目录下,创建名字为`update_8001.sh`的文件,内容如下 + +``` +cd /home/system/xiaozhi/xiaozhi-esp32-server +git fetch --all +git reset --hard +git pull origin main + + +cd /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-web +npm install +npm run build +rm -rf /home/system/xiaozhi/manager-web +mv /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-web/dist /home/system/xiaozhi/manager-web +``` + +保存好后执行赋权命令 +``` +chmod 777 update_8001.sh +``` +执行完后,继续往下 + +## 4.2 自动编译运行manager-api模块 +在`/home/system/xiaozhi/`目录下,创建名字为`update_8002.sh`的文件,内容如下 + +``` +cd /home/system/xiaozhi/xiaozhi-esp32-server +git pull origin main + + +cd /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-api +rm -rf target +mvn clean package -Dmaven.test.skip=true +cd /home/system/xiaozhi/ + +# 查找占用8002端口的进程号 +PID=$(sudo netstat -tulnp | grep 8002 | awk '{print $7}' | cut -d'/' -f1) + +rm -rf /home/system/xiaozhi/xiaozhi-esp32-api.jar +mv /home/system/xiaozhi/xiaozhi-esp32-server/main/manager-api/target/xiaozhi-esp32-api.jar /home/system/xiaozhi/xiaozhi-esp32-api.jar + +# 检查是否找到进程号 +if [ -z "$PID" ]; then + echo "没有找到占用8002端口的进程" +else + echo "找到占用8002端口的进程,进程号为: $PID" + # 杀掉进程 + kill -9 $PID + kill -9 $PID + echo "已杀掉进程 $PID" +fi + +nohup java -jar xiaozhi-esp32-api.jar --spring.profiles.active=dev & +``` + +保存好后执行赋权命令 +``` +chmod 777 update_8002.sh +``` +执行完后,继续往下 + +## 4.3 自动编译运行Python项目 +在`/home/system/xiaozhi/`目录下,创建名字为`update_8000.sh`的文件,内容如下 + +``` +cd /home/system/xiaozhi/xiaozhi-esp32-server +git pull origin main + +# 查找占用8000端口的进程号 +PID=$(sudo netstat -tulnp | grep 8000 | awk '{print $7}' | cut -d'/' -f1) + +# 检查是否找到进程号 +if [ -z "$PID" ]; then + echo "没有找到占用8000端口的进程" +else + echo "找到占用8000端口的进程,进程号为: $PID" + # 杀掉进程 + kill -9 $PID + kill -9 $PID + echo "已杀掉进程 $PID" +fi +cd main/xiaozhi-server +pip install -r requirements.txt +nohup python app.py >/dev/null & +``` + +保存好后执行赋权命令 +``` +chmod 777 update_8000.sh +``` +执行完后,继续往下 + +# 日常更新 + +以上的脚本都建立好后,日常更新,我们只要依次执行以下命令就可以做到自动更新和启动 + +``` +# 进入pyhton环境 +conda activate xiaozhi-esp32-server +cd /home/system/xiaozhi +# 更新并启动Java程序 +./update_8001.sh +# 更新web程序 +./update_8002.sh +# 更新并启动python程序 +./update_8000.sh +# 查看Java日志 +tail -f nohup.out +# 查看Python日志 +tail -f /home/system/xiaozhi/xiaozhi-esp32-server/main/xiaozhi-server/tmp/server.log +``` + +# 注意事项 +测试平台`https://2662r3426b.vicp.fun`,是使用nginx做了反向代理。nginx.conf详细配置可以[参考这里](https://github.com/xinnan-tech/xiaozhi-esp32-server/issues/791)