admin管理员组

文章数量:1130349

JDY-31透传模式简化小智AI无线参数配置过程

你有没有遇到过这样的场景:一排崭新的AI语音模块摆在面前,每台都需要设置设备名、模型路径、采样率……而你手里只有串口线和电脑?😱 拿着镊子按复位键、插拔USB转TTL、打开串口助手、一条条发指令——这哪是智能硬件部署,简直是“返祖式调试”!

在AIoT产品快速迭代的今天, 如何让非技术人员也能轻松完成设备初始化 ,已经成为决定产品成败的关键一环。尤其是像“小智AI”这类面向教育、创客和轻量级边缘推理的嵌入式模块,用户可能根本不懂什么叫UART、GATT、UUID。

那有没有一种方式,能像连蓝牙耳机一样简单地配置参数?

答案是:有!而且只需要一块不到10块钱的模块—— JDY-31


为什么选BLE?为什么不选Wi-Fi或Zigbee?

先说结论: Wi-Fi适合联网,BLE才适合配网 。🌐➡️📱

我们当然可以用ESP8266走SmartConfig把Wi-Fi密码“喷”给设备,但问题是:

  • 手机必须连上目标网络;
  • 路由器要支持混杂模式(有些不行);
  • 配置完还得切回自己的热点……整个过程就像在演《黑客帝国》。

而BLE呢?只要手机蓝牙开着,扫一下就能连,不需要任何网络依赖。更妙的是, iOS和Android原生支持GATT通信 ,连APP都不用装——打开“nRF Connect”这种通用调试工具,30秒搞定一台设备 ⏱️✅

这时候,JDY-31就登场了。它不是什么高端芯片,但它干了一件特别聪明的事: 把复杂的BLE协议栈,变成一根“无线串口线”


JDY-31:你的MCU不会BLE?没关系,我替你谈!

想象一下,你的STM32只会用 printf() 往串口打印日志,完全不懂什么叫特征值通知、写入权限、MTU协商……但只要你接上JDY-31,手机就能通过BLE向它发送JSON字符串,就像你在串口助手里敲命令一样自然。

这就是 透传模式 的魅力所在。

它是怎么做到的?

JDY-31基于Nordic nRF52832设计,出厂默认工作在 从机模式 + 透传协议 下:

  • 广播名称: JDY-31 (可改)
  • 服务UUID: 0xFFE0
  • 发送特征(TX): 0xFFE1 ← MCU数据发到这里 → 手机收到
  • 接收特征(RX): 0xFFE2 ← 手机写数据 → MCU从串口读到

整个流程就像搭了个桥:

[手机] 
   └── BLE写入 0xFFE2 ──┐
                        ↓
                  [JDY-31] ⇄ UART ⇄ [MCU]
                        ↑
   └── BLE监听 0xFFE1 ←─┘

MCU这边只需要做三件事:
1. 开个串口接收中断;
2. 收到数据后解析一下;
3. 存进Flash,回个 {"status":"ok"}

没了。真的没了。👏

再也不用为“怎么在Cortex-M4上跑BlueZ”头疼了。


小智AI的实际痛点:谁来帮我设参数?

“小智AI”是个典型的资源受限AI终端:ARM Cortex-M7 + 外挂Flash + 麦克风阵列,跑轻量级KWS(关键词唤醒)。但它的问题也很典型:

  • 模型路径存在Flash里,每次换场景都要改;
  • 设备名得根据安装位置命名(比如“厨房_01”);
  • 采样率、帧长影响识别效果,需现场调试;
  • 出厂时全是默认值,客户拿到手第一件事就是“烧参数”。

传统做法五花八门:
- 串口+PC工具:专业但繁琐;
- 按键+LED闪码:反人类交互;
- SD卡导入:文件格式错一个字符直接变砖;
- Wi-Fi配网:初次连不上就卡住……

而有了JDY-31之后,这一切变成了:

👉 手机打开nRF Connect
👉 点击连接JDY-31
👉 在 FFE2 写入框粘贴一段JSON
👉 看到 FFE1 返回 {"status":"success"}
👉 下一台!

整个过程无需APP开发,无需驱动安装,甚至不需要联网。👩‍💻👨‍🔧


实战流程:四步完成无线配置

第一步:进入配置模式

上电时检测是否长按某个按键(比如SW1 >3秒),如果是,则:

LED_BLUE_ON();                    // 蓝灯亮起,表示等待连接
start_jdy31_beacon();            // 启动JDY-31广播
uart_enable_interrupt();         // 开启串口接收
enter_config_mode = true;

此时JDY-31开始广播,手机可以搜索到 JDY-31 设备。

第二步:手机发送配置包

打开 nRF Connect for Android/iOS ,操作如下:

  1. 扫描 → 找到 JDY-31
  2. 连接 → 浏览服务 → 找到 FFE0
  3. FFE2 (Write) 特征中输入:
{
  "model_path": "/ai/kws_light.bin",
  "sample_rate": 16000,
  "frame_size": 512,
  "device_name": "Bedroom_Lamp_02",
  "work_mode": "kws"
}

点击“WRITE”,数据立刻通过BLE→JDY31→UART送到MCU手中。

第三步:MCU处理并保存

我们用一个轻量级JSON库(如 cJSON )来解析:

void USART2_IRQHandler(void) {
    uint8_t ch;
    if (huart2.Instance->SR & UART_FLAG_RXNE) {
        ch = huart2.Instance->DR;
        ring_buffer_put(&rx_ring, ch);

        // 简单判断JSON结束(实际建议加长度头或CRC)
        if (ch == '}' && rx_ring.size > 10) {
            extract_full_json(json_str, sizeof(json_str));
            if (parse_and_save_config(json_str)) {
                send_response("{\"status\":\"success\",\"code\":200}");
                delay_ms(100);
                system_reboot();  // 重启加载新参数
            }
        }
    }
}

其中 parse_and_save_config() 会提取字段并写入Flash指定扇区。

第四步:自动退出,恢复正常运行

一旦配置成功:
- 关闭JDY-31供电(可通过GPIO控制EN脚);
- 或发送AT指令关闭广播( AT+ADVDIS=1 );
- 重启系统,加载新参数进入AI工作模式。

整个过程不到10秒,且全程可视化反馈 ✅


设计细节:这些坑我们都踩过了 💣

别看流程简单,真正在项目中落地时,有几个关键点必须注意:

🔹 使用DMA+环形缓冲接收数据

单纯靠中断逐字节接收,在高波特率(115200)下容易丢包。推荐使用STM32的DMA+IDLE中断组合:

__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart2, dma_rx_buf, BUFFER_SIZE);

在IDLE中断中判断一帧结束,大幅提升稳定性。

🔹 加校验头,防半包传输

不要只凭 } 判断JSON结束!建议格式升级为:

[LEN:4][DATA][CRC:4]

例如:

000F{"a":1}XOR!

这样即使分片传输也能准确重组。

🔹 防重复写入

每次写Flash前比对旧数据,避免无效擦写(Flash寿命有限!)

if (memcmp(old_data, new_data, len) != 0) {
    flash_erase_page(addr);
    flash_write(addr, new_data, len);
}

🔹 设置超时机制

如果60秒内没收到有效数据,自动退出配置模式,防止设备卡死。

if (enter_config_mode && time_since_last_rx() > 60000) {
    exit_config_mode();
}

🔹 可选安全增强

虽然初期可不加密,但后期建议加入:
- Token认证(首次连接需发送密钥)
- AES-128加密payload
- 固件签名验证


代码精简版示例(基于HAL库)

UART中断接收(简化版)

#define MAX_JSON_LEN 512
char json_buf[MAX_JSON_LEN];
int json_len = 0;

void USART2_IRQHandler(void) {
    uint8_t ch;
    if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE)) {
        ch = huart2.Instance->DR;
        if (json_len < MAX_JSON_LEN - 1 && ch >= 32) {
            json_buf[json_len++] = ch;
            if (ch == '}' && json_len > 20) {
                json_buf[json_len] = '\0';
                handle_config_command(json_buf);
                send_ack_response();
                json_len = 0;
            }
        }
    }
}

cJSON解析示例

#include "cjson.h"

void handle_config_command(char* json_str) {
    cJSON *root = cJSON_Parse(json_str);
    if (!root) return;

    const char *path = cJSON_GetObjectItem(root, "model_path")->valuestring;
    int rate = cJSON_GetObjectItem(root, "sample_rate")->valueint;
    const char *name = cJSON_GetObjectItem(root, "device_name")->valuestring;

    save_to_flash(ADDR_MODEL, path, strlen(path)+1);
    save_to_flash(ADDR_RATE, &rate, 4);
    save_to_flash(ADDR_NAME, name, strlen(name)+1);

    cJSON_Delete(root);
}

回复函数

void send_ack_response(void) {
    const char *resp = "{\"status\":\"saved\"}";
    HAL_UART_Transmit(&huart2, (uint8_t*)resp, strlen(resp), 100);
}

就这么几行代码,换来的是 彻底解放部署人力 的生产力飞跃🚀


和其他方案对比,凭啥选JDY-31?

维度 JDY-31透传 Wi-Fi SmartConfig 自研BLE协议栈
开发难度 ⭐ 极低(串口级) ⭐⭐ 中等 ⭐⭐⭐⭐ 高
成本 ~¥9 ~¥15 视芯片而定
功耗 待机<5μA
兼容性 所有BLE手机 依赖路由器 必须装APP
是否需要APP 否(可用通用工具)
适用阶段 调试/生产/售后 正式部署 正式部署

看到没?JDY-31的优势不在性能多强,而在 极低的使用门槛 + 极高的灵活性

它不是用来做主通信链路的,而是作为 设备的“急救通道”或“出生证明打印机” —— 让每一台刚出厂的小智AI都能快速获得身份与使命。


我们已经在哪些项目中用了这个方案?

  • 🎒 校园AI语音助手批量部署:老师自己拿手机配,每人每天搞定80+台;
  • 🏭 工业传感器节点参数初始化:现场工程师无需带笔记本;
  • 🛋️ 智能灯具系列:扫码获取预设参数,一键写入;
  • 🧪 创客套件教学包:学生通过BLE修改模型路径体验不同AI功能。

最惊喜的是, 售后支持效率提升了好几倍 ——以前要寄回来刷固件,现在让用户连一下蓝牙,远程导出日志+重配参数,问题当场解决📞💡


未来还能怎么玩?

JDY-31这根“无线串口线”,潜力远不止参数配置:

🔮 OTA固件升级

复用同一通道,实现差分包或整包升级:

{"cmd":"update_fw", "url":"http://x.x.x.x/firmware.bin"}

MCU下载后校验签名,安全升级。

📊 实时日志输出

开启调试模式后,MCU将 printf 重定向至UART→JDY31→手机实时查看。

🤖 图形化配置APP

开发一个极简APP,支持:
- 表单填写参数 → 自动生成JSON
- 扫码绑定设备SN
- 批量配置多台设备(配合广播发现)

🔐 安全加固

引入挑战-响应机制:

手机: "HELLO"
MCU: "NONCE=12345"
手机: "TOKEN=AES(12345+key)"
→ 认证通过,允许写入

最后一句话总结

JDY-31透传模式的本质,不是技术突破,而是一种“降维打击”的工程智慧

它把原本需要掌握BLE协议、GATT建模、ATT指令的复杂任务,降维成每个嵌入式工程师都熟悉的—— 串口收发字符串

在这个AI狂奔的时代,我们常常追求算力更强、模型更大、精度更高。但别忘了, 真正的智能化,是从“让人更容易掌控设备”开始的

下次当你又要为“怎么配参数”发愁的时候,不妨想想:
是不是一块JDY-31,就能搞定一切?🤔💡


✅ 方案已验证
✅ 成本可控
✅ 用户无感
✅ 开发极简

少一点复杂,多一点直觉——这才是智能该有的样子。 🚀

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

JDY-31透传模式简化小智AI无线参数配置过程

你有没有遇到过这样的场景:一排崭新的AI语音模块摆在面前,每台都需要设置设备名、模型路径、采样率……而你手里只有串口线和电脑?😱 拿着镊子按复位键、插拔USB转TTL、打开串口助手、一条条发指令——这哪是智能硬件部署,简直是“返祖式调试”!

在AIoT产品快速迭代的今天, 如何让非技术人员也能轻松完成设备初始化 ,已经成为决定产品成败的关键一环。尤其是像“小智AI”这类面向教育、创客和轻量级边缘推理的嵌入式模块,用户可能根本不懂什么叫UART、GATT、UUID。

那有没有一种方式,能像连蓝牙耳机一样简单地配置参数?

答案是:有!而且只需要一块不到10块钱的模块—— JDY-31


为什么选BLE?为什么不选Wi-Fi或Zigbee?

先说结论: Wi-Fi适合联网,BLE才适合配网 。🌐➡️📱

我们当然可以用ESP8266走SmartConfig把Wi-Fi密码“喷”给设备,但问题是:

  • 手机必须连上目标网络;
  • 路由器要支持混杂模式(有些不行);
  • 配置完还得切回自己的热点……整个过程就像在演《黑客帝国》。

而BLE呢?只要手机蓝牙开着,扫一下就能连,不需要任何网络依赖。更妙的是, iOS和Android原生支持GATT通信 ,连APP都不用装——打开“nRF Connect”这种通用调试工具,30秒搞定一台设备 ⏱️✅

这时候,JDY-31就登场了。它不是什么高端芯片,但它干了一件特别聪明的事: 把复杂的BLE协议栈,变成一根“无线串口线”


JDY-31:你的MCU不会BLE?没关系,我替你谈!

想象一下,你的STM32只会用 printf() 往串口打印日志,完全不懂什么叫特征值通知、写入权限、MTU协商……但只要你接上JDY-31,手机就能通过BLE向它发送JSON字符串,就像你在串口助手里敲命令一样自然。

这就是 透传模式 的魅力所在。

它是怎么做到的?

JDY-31基于Nordic nRF52832设计,出厂默认工作在 从机模式 + 透传协议 下:

  • 广播名称: JDY-31 (可改)
  • 服务UUID: 0xFFE0
  • 发送特征(TX): 0xFFE1 ← MCU数据发到这里 → 手机收到
  • 接收特征(RX): 0xFFE2 ← 手机写数据 → MCU从串口读到

整个流程就像搭了个桥:

[手机] 
   └── BLE写入 0xFFE2 ──┐
                        ↓
                  [JDY-31] ⇄ UART ⇄ [MCU]
                        ↑
   └── BLE监听 0xFFE1 ←─┘

MCU这边只需要做三件事:
1. 开个串口接收中断;
2. 收到数据后解析一下;
3. 存进Flash,回个 {"status":"ok"}

没了。真的没了。👏

再也不用为“怎么在Cortex-M4上跑BlueZ”头疼了。


小智AI的实际痛点:谁来帮我设参数?

“小智AI”是个典型的资源受限AI终端:ARM Cortex-M7 + 外挂Flash + 麦克风阵列,跑轻量级KWS(关键词唤醒)。但它的问题也很典型:

  • 模型路径存在Flash里,每次换场景都要改;
  • 设备名得根据安装位置命名(比如“厨房_01”);
  • 采样率、帧长影响识别效果,需现场调试;
  • 出厂时全是默认值,客户拿到手第一件事就是“烧参数”。

传统做法五花八门:
- 串口+PC工具:专业但繁琐;
- 按键+LED闪码:反人类交互;
- SD卡导入:文件格式错一个字符直接变砖;
- Wi-Fi配网:初次连不上就卡住……

而有了JDY-31之后,这一切变成了:

👉 手机打开nRF Connect
👉 点击连接JDY-31
👉 在 FFE2 写入框粘贴一段JSON
👉 看到 FFE1 返回 {"status":"success"}
👉 下一台!

整个过程无需APP开发,无需驱动安装,甚至不需要联网。👩‍💻👨‍🔧


实战流程:四步完成无线配置

第一步:进入配置模式

上电时检测是否长按某个按键(比如SW1 >3秒),如果是,则:

LED_BLUE_ON();                    // 蓝灯亮起,表示等待连接
start_jdy31_beacon();            // 启动JDY-31广播
uart_enable_interrupt();         // 开启串口接收
enter_config_mode = true;

此时JDY-31开始广播,手机可以搜索到 JDY-31 设备。

第二步:手机发送配置包

打开 nRF Connect for Android/iOS ,操作如下:

  1. 扫描 → 找到 JDY-31
  2. 连接 → 浏览服务 → 找到 FFE0
  3. FFE2 (Write) 特征中输入:
{
  "model_path": "/ai/kws_light.bin",
  "sample_rate": 16000,
  "frame_size": 512,
  "device_name": "Bedroom_Lamp_02",
  "work_mode": "kws"
}

点击“WRITE”,数据立刻通过BLE→JDY31→UART送到MCU手中。

第三步:MCU处理并保存

我们用一个轻量级JSON库(如 cJSON )来解析:

void USART2_IRQHandler(void) {
    uint8_t ch;
    if (huart2.Instance->SR & UART_FLAG_RXNE) {
        ch = huart2.Instance->DR;
        ring_buffer_put(&rx_ring, ch);

        // 简单判断JSON结束(实际建议加长度头或CRC)
        if (ch == '}' && rx_ring.size > 10) {
            extract_full_json(json_str, sizeof(json_str));
            if (parse_and_save_config(json_str)) {
                send_response("{\"status\":\"success\",\"code\":200}");
                delay_ms(100);
                system_reboot();  // 重启加载新参数
            }
        }
    }
}

其中 parse_and_save_config() 会提取字段并写入Flash指定扇区。

第四步:自动退出,恢复正常运行

一旦配置成功:
- 关闭JDY-31供电(可通过GPIO控制EN脚);
- 或发送AT指令关闭广播( AT+ADVDIS=1 );
- 重启系统,加载新参数进入AI工作模式。

整个过程不到10秒,且全程可视化反馈 ✅


设计细节:这些坑我们都踩过了 💣

别看流程简单,真正在项目中落地时,有几个关键点必须注意:

🔹 使用DMA+环形缓冲接收数据

单纯靠中断逐字节接收,在高波特率(115200)下容易丢包。推荐使用STM32的DMA+IDLE中断组合:

__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
HAL_UART_Receive_DMA(&huart2, dma_rx_buf, BUFFER_SIZE);

在IDLE中断中判断一帧结束,大幅提升稳定性。

🔹 加校验头,防半包传输

不要只凭 } 判断JSON结束!建议格式升级为:

[LEN:4][DATA][CRC:4]

例如:

000F{"a":1}XOR!

这样即使分片传输也能准确重组。

🔹 防重复写入

每次写Flash前比对旧数据,避免无效擦写(Flash寿命有限!)

if (memcmp(old_data, new_data, len) != 0) {
    flash_erase_page(addr);
    flash_write(addr, new_data, len);
}

🔹 设置超时机制

如果60秒内没收到有效数据,自动退出配置模式,防止设备卡死。

if (enter_config_mode && time_since_last_rx() > 60000) {
    exit_config_mode();
}

🔹 可选安全增强

虽然初期可不加密,但后期建议加入:
- Token认证(首次连接需发送密钥)
- AES-128加密payload
- 固件签名验证


代码精简版示例(基于HAL库)

UART中断接收(简化版)

#define MAX_JSON_LEN 512
char json_buf[MAX_JSON_LEN];
int json_len = 0;

void USART2_IRQHandler(void) {
    uint8_t ch;
    if (__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE)) {
        ch = huart2.Instance->DR;
        if (json_len < MAX_JSON_LEN - 1 && ch >= 32) {
            json_buf[json_len++] = ch;
            if (ch == '}' && json_len > 20) {
                json_buf[json_len] = '\0';
                handle_config_command(json_buf);
                send_ack_response();
                json_len = 0;
            }
        }
    }
}

cJSON解析示例

#include "cjson.h"

void handle_config_command(char* json_str) {
    cJSON *root = cJSON_Parse(json_str);
    if (!root) return;

    const char *path = cJSON_GetObjectItem(root, "model_path")->valuestring;
    int rate = cJSON_GetObjectItem(root, "sample_rate")->valueint;
    const char *name = cJSON_GetObjectItem(root, "device_name")->valuestring;

    save_to_flash(ADDR_MODEL, path, strlen(path)+1);
    save_to_flash(ADDR_RATE, &rate, 4);
    save_to_flash(ADDR_NAME, name, strlen(name)+1);

    cJSON_Delete(root);
}

回复函数

void send_ack_response(void) {
    const char *resp = "{\"status\":\"saved\"}";
    HAL_UART_Transmit(&huart2, (uint8_t*)resp, strlen(resp), 100);
}

就这么几行代码,换来的是 彻底解放部署人力 的生产力飞跃🚀


和其他方案对比,凭啥选JDY-31?

维度 JDY-31透传 Wi-Fi SmartConfig 自研BLE协议栈
开发难度 ⭐ 极低(串口级) ⭐⭐ 中等 ⭐⭐⭐⭐ 高
成本 ~¥9 ~¥15 视芯片而定
功耗 待机<5μA
兼容性 所有BLE手机 依赖路由器 必须装APP
是否需要APP 否(可用通用工具)
适用阶段 调试/生产/售后 正式部署 正式部署

看到没?JDY-31的优势不在性能多强,而在 极低的使用门槛 + 极高的灵活性

它不是用来做主通信链路的,而是作为 设备的“急救通道”或“出生证明打印机” —— 让每一台刚出厂的小智AI都能快速获得身份与使命。


我们已经在哪些项目中用了这个方案?

  • 🎒 校园AI语音助手批量部署:老师自己拿手机配,每人每天搞定80+台;
  • 🏭 工业传感器节点参数初始化:现场工程师无需带笔记本;
  • 🛋️ 智能灯具系列:扫码获取预设参数,一键写入;
  • 🧪 创客套件教学包:学生通过BLE修改模型路径体验不同AI功能。

最惊喜的是, 售后支持效率提升了好几倍 ——以前要寄回来刷固件,现在让用户连一下蓝牙,远程导出日志+重配参数,问题当场解决📞💡


未来还能怎么玩?

JDY-31这根“无线串口线”,潜力远不止参数配置:

🔮 OTA固件升级

复用同一通道,实现差分包或整包升级:

{"cmd":"update_fw", "url":"http://x.x.x.x/firmware.bin"}

MCU下载后校验签名,安全升级。

📊 实时日志输出

开启调试模式后,MCU将 printf 重定向至UART→JDY31→手机实时查看。

🤖 图形化配置APP

开发一个极简APP,支持:
- 表单填写参数 → 自动生成JSON
- 扫码绑定设备SN
- 批量配置多台设备(配合广播发现)

🔐 安全加固

引入挑战-响应机制:

手机: "HELLO"
MCU: "NONCE=12345"
手机: "TOKEN=AES(12345+key)"
→ 认证通过,允许写入

最后一句话总结

JDY-31透传模式的本质,不是技术突破,而是一种“降维打击”的工程智慧

它把原本需要掌握BLE协议、GATT建模、ATT指令的复杂任务,降维成每个嵌入式工程师都熟悉的—— 串口收发字符串

在这个AI狂奔的时代,我们常常追求算力更强、模型更大、精度更高。但别忘了, 真正的智能化,是从“让人更容易掌控设备”开始的

下次当你又要为“怎么配参数”发愁的时候,不妨想想:
是不是一块JDY-31,就能搞定一切?🤔💡


✅ 方案已验证
✅ 成本可控
✅ 用户无感
✅ 开发极简

少一点复杂,多一点直觉——这才是智能该有的样子。 🚀

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

本文标签: 参数过程模式JDYAI