zhoushoujianwork/esp32-rf-module

0.1.4

Latest
uploaded 1 hour ago
ESP32 RF Module Library for 315MHz and 433MHz signal transmission and reception. Designed for xiaozhi-esp32 project with MCP tools integration for AI voice control.

readme

# ESP32 RF Module Library

ESP32 RF 收发模块库,支持 315MHz 和 433MHz 双频段 RF 信号收发。

本库专为 [xiaozhi-esp32](https://github.com/78/xiaozhi-esp32) 项目设计,集成了 MCP(Model Context Protocol)工具功能,支持通过 AI 对话控制 RF 信号收发。

## 功能特性

- ✅ 支持 315MHz 和 433MHz 双频段收发
- ✅ 信号发送和接收(中断方式)
- ✅ 信号捕获和重放
- ✅ 信号持久化存储(NVS Flash,最多10个信号)
- ✅ 信号列表和按索引发送
- ✅ 信号清理功能
- ✅ 协议配置(协议编号、脉冲长度、重复次数)
- ✅ MCP 工具集成(可选,需要 MCP Server)

## 硬件要求

### 外部拓展模块接口

外部拓展模块采用 6P 引脚接口:

| 引脚编号 | 名称 | 说明 | 对应功能 |
|---------|------|------|---------|
| 1 | G | 地线 | 公共地 |
| 2 | 3T | 315MHz 发送 | 315MHz 发射引脚 |
| 3 | 3R | 315MHz 接收 | 315MHz 接收引脚 |
| 4 | 4R | 433MHz 接收 | 433MHz 接收引脚 |
| 5 | 4T | 433MHz 发送 | 433MHz 发射引脚 |
| 6 | V | 电源 | 3.3V 供电 |

### 引脚配置

需要配置以下 4 个 GPIO 引脚:

- `RF_TX_315_PIN`: 315MHz 发送引脚
- `RF_RX_315_PIN`: 315MHz 接收引脚
- `RF_TX_433_PIN`: 433MHz 发送引脚
- `RF_RX_433_PIN`: 433MHz 接收引脚

## 安装

### 作为 ESP-IDF 组件

1. 在你的项目 `idf_component.yml` 中添加:

```yaml
dependencies:
  zhoushoujianwork/esp32-rf-module:
    git: https://github.com/zhoushoujianwork/esp32-rf-module.git
    version: ^1.0.0
```

2. 或者使用 Component Manager(需要先发布到组件注册表):

```yaml
dependencies:
  zhoushoujianwork/esp32-rf-module: "^1.0.0"
```

## 配置

本库支持通过主项目的 Kconfig 系统进行功能配置。配置方式如下:

### 在主项目中配置

**快速开始**:可以参考本库提供的示例文件:
- `Kconfig.projbuild.example` - Kconfig 配置示例
- `CMakeLists.example.txt` - CMakeLists.txt 配置示例

在主项目的 `Kconfig.projbuild` 文件中添加以下配置:

```kconfig
menu "ESP32 RF Module Configuration"

    config RF_MODULE_ENABLE_FLASH_STORAGE
        bool "Enable Flash Storage (NVS)"
        default y
        help
            Enable NVS flash storage for signal persistence.
            When enabled, received signals are automatically saved to flash.
            Requires nvs_flash component.

    config RF_MODULE_MAX_FLASH_SIGNALS
        int "Maximum Flash Storage Signals"
        range 1 20
        default 10
        depends on RF_MODULE_ENABLE_FLASH_STORAGE
        help
            Maximum number of signals to store in flash storage.
            Uses circular buffer, oldest signals are overwritten when full.

    config RF_MODULE_ENABLE_433MHZ
        bool "Enable 433MHz Frequency Support"
        default y
        help
            Enable support for 433MHz RF signals.
            Requires RCSwitch component.

    config RF_MODULE_ENABLE_315MHZ
        bool "Enable 315MHz Frequency Support"
        default y
        help
            Enable support for 315MHz RF signals.
            Requires TCSwitch component.

    config RF_MODULE_ENABLE_MCP_TOOLS
        bool "Enable MCP Tools"
        default y
        depends on RF_MODULE_ENABLE_FLASH_STORAGE
        help
            Enable MCP (Model Context Protocol) tools integration.
            Provides self.rf.* tools for AI-driven device control.
            Requires mcp_server component from the main project.

    config RF_MODULE_LOG_LEVEL
        int "Log Level"
        range 0 5
        default 3
        help
            Set the log level for RF module:
            0 = None
            1 = Error
            2 = Warning
            3 = Info
            4 = Debug
            5 = Verbose

endmenu
```

然后在主项目的 `CMakeLists.txt` 中添加配置转换逻辑:

```cmake
# RF Module Configuration (from Kconfig to CMake)
if(CONFIG_RF_MODULE_ENABLE_FLASH_STORAGE)
    set(RF_MODULE_ENABLE_FLASH_STORAGE ON)
else()
    set(RF_MODULE_ENABLE_FLASH_STORAGE OFF)
endif()

if(CONFIG_RF_MODULE_ENABLE_433MHZ)
    set(RF_MODULE_ENABLE_433MHZ ON)
else()
    set(RF_MODULE_ENABLE_433MHZ OFF)
endif()

if(CONFIG_RF_MODULE_ENABLE_315MHZ)
    set(RF_MODULE_ENABLE_315MHZ ON)
else()
    set(RF_MODULE_ENABLE_315MHZ OFF)
endif()

if(CONFIG_RF_MODULE_ENABLE_MCP_TOOLS)
    set(RF_MODULE_ENABLE_MCP_TOOLS ON)
else()
    set(RF_MODULE_ENABLE_MCP_TOOLS OFF)
endif()

if(DEFINED CONFIG_RF_MODULE_MAX_FLASH_SIGNALS)
    set(RF_MODULE_MAX_FLASH_SIGNALS ${CONFIG_RF_MODULE_MAX_FLASH_SIGNALS})
endif()

if(DEFINED CONFIG_RF_MODULE_LOG_LEVEL)
    set(RF_MODULE_LOG_LEVEL ${CONFIG_RF_MODULE_LOG_LEVEL})
endif()
```

### 配置选项说明

- **Enable Flash Storage (NVS)** (`RF_MODULE_ENABLE_FLASH_STORAGE`)
  - 默认:启用
  - 启用 NVS 闪存存储功能,用于信号持久化

- **Maximum Flash Storage Signals** (`RF_MODULE_MAX_FLASH_SIGNALS`)
  - 默认:10
  - 范围:1-20
  - 闪存中最多保存的信号数量(循环缓冲区)

- **Enable 433MHz Frequency Support** (`RF_MODULE_ENABLE_433MHZ`)
  - 默认:启用
  - 启用 433MHz 频率支持

- **Enable 315MHz Frequency Support** (`RF_MODULE_ENABLE_315MHZ`)
  - 默认:启用
  - 启用 315MHz 频率支持

- **Enable MCP Tools** (`RF_MODULE_ENABLE_MCP_TOOLS`)
  - 默认:启用
  - 启用 MCP 工具集成(需要 Flash Storage 支持)
  - 如果禁用,`rf_mcp_tools.h` 将无法编译

- **Log Level** (`RF_MODULE_LOG_LEVEL`)
  - 默认:3 (Info)
  - 范围:0-5
  - 设置日志级别(0=None, 1=Error, 2=Warning, 3=Info, 4=Debug, 5=Verbose)

### 配置示例

运行 `idf.py menuconfig`,进入主项目的配置菜单,找到 `ESP32 RF Module Configuration` 进行配置。

如果只需要 433MHz 支持,可以禁用 315MHz:

```
ESP32 RF Module Configuration
  [*] Enable Flash Storage (NVS)
  [*] Enable 433MHz Frequency Support
  [ ] Enable 315MHz Frequency Support
  [*] Enable MCP Tools
```

如果不需要 MCP 工具,可以禁用:

```
ESP32 RF Module Configuration
  [*] Enable Flash Storage (NVS)
  [ ] Enable MCP Tools
```

**注意**:
- 禁用功能后,相关代码会被条件编译排除,减少代码体积
- 所有配置项都有默认值,保持向后兼容性
- 如果主项目未配置 Kconfig,组件将使用默认配置(所有功能启用)

## 使用方法

### 基本使用

```cpp
#include "rf_module.h"

// 初始化 RF 模块
RFModule rf_module(
    RF_TX_433_PIN, RF_RX_433_PIN,  // 433MHz 引脚
    RF_TX_315_PIN, RF_RX_315_PIN   // 315MHz 引脚
);

rf_module.Begin();

// 发送信号
rf_module.Send("A1B2C3", "01", RF_433MHZ);

// 接收信号
if (rf_module.ReceiveAvailable()) {
    RFSignal signal;
    if (rf_module.Receive(signal)) {
        // 处理接收到的信号
        ESP_LOGI("RF", "Received: %s%s (%sMHz)", 
                 signal.address.c_str(), signal.key.c_str(),
                 signal.frequency == RF_315MHZ ? "315" : "433");
    }
}

rf_module.End();
```

### MCP 工具集成(可选)

本库专为 [xiaozhi-esp32](https://github.com/78/xiaozhi-esp32) 项目设计,集成了完整的 MCP(Model Context Protocol)工具功能。

xiaozhi-esp32 是一个基于 MCP 协议的 AI 聊天机器人项目,支持通过语音对话控制各种 IoT 设备。本库的 MCP 工具集成使得用户可以通过自然语言与 AI 对话来控制 RF 信号收发。

#### 在 xiaozhi-esp32 项目中使用

如果你的项目基于 xiaozhi-esp32,可以使用 `rf_mcp_tools.h` 注册 MCP 工具:

```cpp
#include "rf_mcp_tools.h"
#include "mcp_server.h"  // xiaozhi-esp32 项目提供

// 在板子初始化时注册 MCP 工具
void RegisterMcpTools() {
    if (rf_module_) {
        RegisterRFMcpTools(rf_module_);
    }
}
```

注册后,AI 可以通过自然语言控制 RF 模块,例如:
- "帮我发送一个433MHz信号,地址A1B2C3,按键01"
- "复制一下这个遥控器的信号"
- "列出所有保存的信号"
- "发送第3个信号"

#### MCP 工具列表

本库提供以下 MCP 工具(通过 `RegisterRFMcpTools()` 注册):

1. **self.rf.send** - 发送 RF 信号
2. **self.rf.receive** - 接收 RF 信号(阻塞等待)
3. **self.rf.replay** - 重播最后接收的信号
4. **self.rf.capture** - 捕捉模式
5. **self.rf.list_signals** - 列出所有保存的信号
6. **self.rf.send_by_index** - 按索引发送信号
7. **self.rf.clear_signals** - 清理保存的信号
8. **self.rf.get_status** - 获取模块状态
9. **self.rf.set_config** - 配置模块参数

**注意**:`rf_mcp_tools.h` 依赖 xiaozhi-esp32 项目中的 MCP Server 实现。如果你的项目不使用 MCP 协议,可以只使用核心功能(`rf_module.h`),忽略 MCP 工具文件。

## API 文档

### RFModule 类

#### 初始化

```cpp
RFModule(gpio_num_t tx433_pin, gpio_num_t rx433_pin,
         gpio_num_t tx315_pin, gpio_num_t rx315_pin);
void Begin();
void End();
```

#### 发送信号

```cpp
void Send(const std::string& address, const std::string& key, RFFrequency freq = RF_433MHZ);
void Send(const RFSignal& signal);
```

#### 接收信号

```cpp
bool ReceiveAvailable();
bool Receive(RFSignal& signal);
```

#### 配置

```cpp
void SetRepeatCount(uint8_t count, RFFrequency freq = RF_433MHZ);
void SetProtocol(uint8_t protocol, RFFrequency freq = RF_433MHZ);
void SetPulseLength(uint16_t pulse_length, RFFrequency freq = RF_433MHZ);
```

#### 信号存储

```cpp
void EnableFlashStorage(const char* namespace_name = "rf_replay");
bool SaveToFlash();
bool LoadFromFlash();
void ClearFlash();
uint8_t GetFlashSignalCount() const;
bool GetFlashSignal(uint8_t index, RFSignal& signal) const;
```

### RFSignal 结构体

```cpp
struct RFSignal {
    std::string address;      // 6位十六进制地址码
    std::string key;          // 2位十六进制按键值
    RFFrequency frequency;    // 频率类型(315MHz 或 433MHz)
    uint8_t protocol;        // 协议编号
    uint16_t pulse_length;    // 脉冲长度(微秒)
};
```

## 信号格式

RF 信号采用 24 位编码格式:
- 前 6 位十六进制:地址码(address)
- 后 2 位十六进制:按键值(key)

例如:`address="A1B2C3"`, `key="01"` 表示地址码为 A1B2C3,按键值为 01。

## 协议支持

- **RCSwitch**:433MHz 协议处理(移植自 Arduino RCSwitch 库)
- **TCSwitch**:315MHz 协议处理(移植自 Arduino TCSwitch 库)

## 依赖

- ESP-IDF >= 5.4.0
- nvs_flash(用于信号持久化存储)

## 目录结构

```
esp32-rf-module/
├── CMakeLists.txt              # ESP-IDF 组件构建配置
├── idf_component.yml           # Component Manager 清单文件
├── README.md                   # 库文档
├── LICENSE                     # MIT 许可证
├── Kconfig.projbuild.example   # 主项目 Kconfig 配置示例
├── CMakeLists.example.txt      # 主项目 CMakeLists.txt 配置示例
├── include/                    # 公共头文件目录
│   ├── rf_module_config.h      # 配置头文件(默认值)
│   ├── rf_module.h            # RF 模块核心类
│   ├── rcswitch.h             # 433MHz 协议处理
│   ├── tcswitch.h             # 315MHz 协议处理
│   └── rf_mcp_tools.h         # MCP 工具注册函数(可选)
└── src/                       # 源文件目录
    ├── rf_module.cc
    ├── rcswitch.cc
    └── tcswitch.cc
```

## 文件说明

- **核心功能**(必需):
  - `include/rf_module.h` + `src/rf_module.cc`: RF 模块核心类
  - `include/rcswitch.h` + `src/rcswitch.cc`: 433MHz 协议处理
  - `include/tcswitch.h` + `src/tcswitch.cc`: 315MHz 协议处理

- **MCP 工具集成**(可选,需要 MCP Server):
  - `include/rf_mcp_tools.h`: MCP 工具注册函数,用于小智 AI 对话集成

## 相关项目

本库专为 [xiaozhi-esp32](https://github.com/78/xiaozhi-esp32) 项目设计。

xiaozhi-esp32 是一个基于 MCP(Model Context Protocol)协议的 AI 聊天机器人项目,支持:
- 离线语音唤醒(ESP-SR)
- 流式 ASR + LLM + TTS 语音交互
- 设备端 MCP 协议控制(扬声器、LED、舵机、GPIO、RF 等)
- 云端 MCP 扩展大模型能力(智能家居控制、PC 桌面操作、知识搜索等)

通过本库的 MCP 工具集成,xiaozhi-esp32 用户可以:
- 通过自然语言与 AI 对话控制 RF 信号收发
- 复制/克隆遥控器信号
- 管理保存的 RF 信号
- 通过语音指令发送 RF 信号

## 许可证

MIT License

Copyright (c) 2025 Shenzhen Xinzhi Future Technology Co., Ltd.
Copyright (c) 2025 Project Contributors

## 贡献

欢迎提交 Issue 和 Pull Request!

## 更新日志

### v0.1.4
- **重大变更**:移除组件内部的 Kconfig 配置,改为通过主项目的 Kconfig.projbuild 配置
- 解决组件库 Kconfig 导致的构建问题
- 添加 `rf_module_config.h` 配置头文件,提供默认值
- 添加配置示例文件(`Kconfig.projbuild.example` 和 `CMakeLists.example.txt`)
- 保持向后兼容性,所有功能默认启用

### v0.1.3
- 初始版本
- 支持 315MHz 和 433MHz 双频段收发
- 支持信号捕获和重放
- 支持信号持久化存储
- 支持 MCP 工具集成(可选)

Links

Supports all targets

License: MIT

To add this component to your project, run:

idf.py add-dependency "zhoushoujianwork/esp32-rf-module^0.1.4"

download archive

Stats

  • Archive size
    Archive size ~ 30.21 KB
  • Downloaded in total
    Downloaded in total 0 times
  • Downloaded this version
    This version: 0 times

Badge

zhoushoujianwork/esp32-rf-module version: 0.1.4
|