mkyx-001/cellular_modem

1.0.1

Latest
uploaded 1 hour ago
USB RNDIS cellular modem driver (AT control + RNDIS data plane)

Readme

# cellular_modem

USB RNDIS 蜂窝模组驱动组件(ESP-IDF / ESP32-P4)。

该组件提供:
- RNDIS 数据面接入(`esp_netif`)
- CDC AT 控制面(自动拨号、APN 识别、状态监控)
- 连接看门狗与自动恢复逻辑
- 可选数据面诊断(DNS/ICMP/TCP)

> 当前默认参数针对常见 USB 蜂窝模组场景,USB VID/PID 可通过配置注入,便于跨项目复用。

## 目录结构

```text
cellular_modem/
├── CMakeLists.txt
├── Kconfig
├── idf_component.yml
├── cellular_modem.c
└── include/
    └── cellular_modem.h
```

## 依赖

- ESP-IDF `>= 5.0`
- `espressif/usb`
- `espressif/iot_usbh_rndis`

`idf_component.yml` 已声明依赖,使用组件管理器时会自动拉取。

## 快速开始

### 1) 在项目中添加依赖

如果你从 ESP Component Registry 引用:

```yaml
dependencies:
  mkyx-001/cellular_modem: "^1.0.0"
```

### 2) 初始化与拨号

```c
#include "cellular_modem.h"

void app_main(void)
{
    cell_modem_hw_config_t hw = {
        .rst_gpio = GPIO_NUM_22,
        .usb_peripheral_map = BIT1,   // ESP32-P4 FS PHY 常见配置
        .usb_vid = 0,                 // 0 = 使用组件默认值
        .usb_pid_rndis = 0,           // 0 = 使用组件默认值
        .usb_pid_composite = 0,       // 0 = 使用组件默认值
    };

    cell_modem_config_t cfg = {
        .at_interface_num = 2,
        .auto_configure_rndis = false,
        .auto_activate_pdp = true,
        .apn = NULL,                  // NULL = 自动识别运营商 APN
        .enable_diag = true,
        .diag_tcp_host = NULL,        // 可选,如 "example.com"
        .diag_tcp_port = 443,
    };

    // 可选:提前硬复位,加快上电收敛
    cell_modem_early_hardware_reset(hw.rst_gpio);

    ESP_ERROR_CHECK(cell_modem_init(&hw, &cfg));

    // 阻塞等待蜂窝数据就绪
    if (cell_modem_wait_for_pdp_ready(120000)) {
        // Ready
    } else {
        // Timeout
    }
}
```

## 例程

仓库内提供最小可运行例程:
- `examples/basic`

运行方式:

```bash
cd examples/basic
idf.py set-target esp32p4
idf.py build flash monitor
```

如你的复位引脚不是 GPIO22,可在 `examples/basic/main/main.c` 中修改
`CELL_MODEM_RST_GPIO`。

## 主要 API

- `cell_modem_init()`: 初始化组件并启动后台监控
- `cell_modem_deinit()`: 反初始化并释放资源
- `cell_modem_get_state()`: 查询当前状态
- `cell_modem_get_net_info()`: 获取 RNDIS IP/网关等信息
- `cell_modem_is_connected()`: 是否已获得本地 IP
- `cell_modem_is_pdp_ready()`: 是否蜂窝数据面就绪
- `cell_modem_wait_for_pdp_ready()`: 阻塞等待就绪
- `cell_modem_register_status_callback()`: 注册状态回调
- `cell_modem_get_signal_strength()`: 获取 CSQ 信号值

详细类型与注释见 `include/cellular_modem.h`。

## Kconfig

菜单路径:
- `Cellular Modem (USB RNDIS)`

参数:
- `CELL_MODEM_DEFAULT_APN`
  - 当 IMSI/COPS 无法识别运营商时的默认 APN(默认 `3gnet`)

## 常见问题

- 启动后长时间未就绪:
  - 检查 USB 供电与数据线
  - 检查 `rst_gpio` 和模组复位时序
  - 检查 SIM 卡状态和天线
  - 按需显式设置 `cfg.apn`
- RNDIS 有 IP 但业务不通:
  - 打开 `enable_diag`
  - 配置 `diag_tcp_host` 验证业务目标连通性

## 版本发布建议

- 使用 SemVer 版本号(`major.minor.patch`)
- 每次发布前更新 `idf_component.yml` 中的 `version`
- 上传命令:

```bash
compote component upload --namespace mkyx-001 --name cellular_modem
```

## License

Apache-2.0,见 `LICENSE`。

Links

Supports all targets

To add this component to your project, run:

idf.py add-dependency "mkyx-001/cellular_modem^1.0.1"

download archive

Stats

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

Badge

mkyx-001/cellular_modem version: 1.0.1
|