* fix(blufi): GET_WIFI_LIST triggers real-time scan with guaranteed response Previously, ESP_BLUFI_EVENT_GET_WIFI_LIST waited for any in-progress scan to finish and then returned the cached result. When the cache was empty (e.g. after a config-mode transition that stopped the Wi-Fi driver), _send_wifi_list() returned silently with no response frame, leaving the App waiting until timeout. Changes: - GET_WIFI_LIST now clears the cache and starts a fresh scan immediately. - _wifi_scan_event_handler calls _send_wifi_list() after every scan triggered by a GET_WIFI_LIST request. - start_wifi_scan() calls esp_wifi_start() before esp_wifi_scan_start() to handle the case where the driver was stopped during a mode transition (ESP_ERR_WIFI_STATE is treated as already-started). - _send_wifi_list() sends ESP_BLUFI_WIFI_SCAN_FAIL when no APs are found, so the App always receives a terminal response. - Redundant static_cast in _wifi_scan_event_handler replaced with the existing local `self` pointer. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix(blufi): preserve cache fast-path, fall back to live scan only when needed Address review feedback on always-rescan latency regression. The GET_WIFI_LIST handler now distinguishes three cases: 1. Scan in flight: defer the response via m_send_list_after_scan; the scan-done handler dispatches when it fires. Removes the previous blocking `while (m_scan_in_progress) vTaskDelay(500)` which would stall the BluFi event task indefinitely if the scan never completed. 2. Cache populated: respond from cache immediately (~50 ms, no latency change vs original behavior). _send_wifi_list() still kicks off an async refresh scan as before to keep the cache fresh. 3. Cache empty and no scan running: trigger a live scan and dispatch from the scan-done handler. If start_wifi_scan() fails, send ESP_BLUFI_WIFI_SCAN_FAIL so the App exits its wait state. State variables are also disentangled: - m_scan_should_save_ssid keeps its original meaning (write scan results into m_ap_records). Cleared during connect-to-AP so the connect-time scan does not pollute the cache. - m_send_list_after_scan is new and tracks "the next scan-done event should respond to a pending GET_WIFI_LIST request". The previous PR conflated these two responsibilities onto m_scan_should_save_ssid, which would have caused init-time scans to spuriously emit a wifi list to the App. start_wifi_scan() now returns bool so the caller can distinguish "scan started or already running" from "could not start a scan". Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Yixin Shi <shiyixin@qiniu.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
An MCP-based Chatbot
Introduction
👉 Handcraft your AI girlfriend, beginner's guide【bilibili】
As a voice interaction entry, the XiaoZhi AI chatbot leverages the AI capabilities of large models like Qwen / DeepSeek, and achieves multi-terminal control via the MCP protocol.
Version Notes
The current v2 version is incompatible with the v1 partition table, so it is not possible to upgrade from v1 to v2 via OTA. For partition table details, see partitions/v2/README.md.
All hardware running v1 can be upgraded to v2 by manually flashing the firmware.
The stable version of v1 is 1.9.2. You can switch to v1 by running git checkout v1. The v1 branch will be maintained until February 2026.
Features Implemented
- Wi-Fi / ML307 Cat.1 4G
- Offline voice wake-up ESP-SR
- Supports two communication protocols (Websocket or MQTT+UDP)
- Uses OPUS audio codec
- Voice interaction based on streaming ASR + LLM + TTS architecture
- Speaker recognition, identifies the current speaker 3D Speaker
- OLED / LCD display, supports emoji display
- Battery display and power management
- Multi-language support (Chinese, English, Japanese)
- Supports ESP32-C3, ESP32-S3, ESP32-P4 chip platforms
- Device-side MCP for device control (Speaker, LED, Servo, GPIO, etc.)
- Cloud-side MCP to extend large model capabilities (smart home control, PC desktop operation, knowledge search, email, etc.)
- Customizable wake words, fonts, emojis, and chat backgrounds with online web-based editing (Custom Assets Generator)
Hardware
Breadboard DIY Practice
See the Feishu document tutorial:
👉 "XiaoZhi AI Chatbot Encyclopedia"
Breadboard demo:
Supports 70+ Open Source Hardware (Partial List)
- LiChuang ESP32-S3 Development Board
- Espressif ESP32-S3-BOX3
- M5Stack CoreS3
- M5Stack AtomS3R + Echo Base
- Magic Button 2.4
- Waveshare ESP32-S3-Touch-AMOLED-1.8
- LILYGO T-Circle-S3
- XiaGe Mini C3
- CuiCan AI Pendant
- WMnologo-Xingzhi-1.54TFT
- SenseCAP Watcher
- ESP-HI Low Cost Robot Dog
Software
Firmware Flashing
For beginners, it is recommended to use the firmware that can be flashed without setting up a development environment.
The firmware connects to the official xiaozhi.me server by default. Personal users can register an account to use the Qwen real-time model for free.
👉 Beginner's Firmware Flashing Guide
Development Environment
- Cursor or VSCode
- Install ESP-IDF plugin, select SDK version 5.4 or above
- Linux is better than Windows for faster compilation and fewer driver issues
- This project uses Google C++ code style, please ensure compliance when submitting code
Developer Documentation
- Custom Board Guide - Learn how to create custom boards for XiaoZhi AI
- MCP Protocol IoT Control Usage - Learn how to control IoT devices via MCP protocol
- MCP Protocol Interaction Flow - Device-side MCP protocol implementation
- MQTT + UDP Hybrid Communication Protocol Document
- A detailed WebSocket communication protocol document
Large Model Configuration
If you already have a XiaoZhi AI chatbot device and have connected to the official server, you can log in to the xiaozhi.me console for configuration.
👉 Backend Operation Video Tutorial (Old Interface)
Related Open Source Projects
For server deployment on personal computers, refer to the following open-source projects:
- xinnan-tech/xiaozhi-esp32-server Python server
- joey-zhou/xiaozhi-esp32-server-java Java server
- AnimeAIChat/xiaozhi-server-go Golang server
- hackers365/xiaozhi-esp32-server-golang Golang server
Other client projects using the XiaoZhi communication protocol:
- huangjunsen0406/py-xiaozhi Python client
- TOM88812/xiaozhi-android-client Android client
- 100askTeam/xiaozhi-linux Linux client by 100ask
- 78/xiaozhi-sf32 Bluetooth chip firmware by Sichuan
- QuecPython/solution-xiaozhiAI QuecPython firmware by Quectel
Custom Assets Tools:
- 78/xiaozhi-assets-generator Custom Assets Generator (Wake words, fonts, emojis, backgrounds)
About the Project
This is an open-source ESP32 project, released under the MIT license, allowing anyone to use it for free, including for commercial purposes.
We hope this project helps everyone understand AI hardware development and apply rapidly evolving large language models to real hardware devices.
If you have any ideas or suggestions, please feel free to raise Issues or join our Discord or QQ group: 994694848
