ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ZMK 蓝牙配置完全指南:Kconfig 选项、连接稳定性与配对安全

ZMK 蓝牙配置完全指南:Kconfig 选项、连接稳定性与配对安全 固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载ZMK 键盘固件通过 Bluetooth Low EnergyBLE实现键盘与主机之间的无线连接也用于分体split键盘两半的无线互联。本文围绕 ZMK 仓库中 蓝牙配置文档 展开系统讲解影响连接稳定性、配对安全、GATT 订阅与设备外观的全部 Kconfig 选项并深入到 app/Kconfig 与 app/src/ble.c 的源码实现帮助你准确理解每个开关背后的行为写出可直接编译验证的.conf配置。配置入口在哪里修改这些选项ZMK 的所有蓝牙选项都属于 Kconfig 编译期配置修改后必须重新编译并刷写固件才能生效参见 Configuration Overview 中的说明。Kconfig 设置写在.conf文件中每行一条CONFIG_XXX值赋值语句。布尔值bool用y或n数值int直接写整数。查找顺序是用户配置目录zmk-config/config/name.conf其中name是 shield 名使用 shield 时或 board 名板载控制器时分体键盘可省略_left/_right后缀一个文件同时作用于两侧board 目录zmk-config/boards/vendor/board/board.confshield 目录zmk-config/boards/shields/shield/shield.conf。.conf文件会覆盖 board/shield 内置的_defconfig默认值。仓库中可以看到这类写法的真实范例例如 glove80_lh_defconfig 中的CONFIG_BT_GATT_ENFORCE_SUBSCRIPTIONn以及 zmk_uno.conf 中的CONFIG_ZMK_BLE_PASSKEY_ENTRYn。全部蓝牙 Kconfig 选项一览下表完整列出蓝牙配置页给出的全部选项及其含义、默认值选项类型说明默认值CONFIG_ZMK_BLE_EXPERIMENTAL_CONNbool启用一组计划在未来版本中成为默认的连接稳定性设置。当前仅表现为禁用 2M PHY 支持nCONFIG_ZMK_BLE_EXPERIMENTAL_SECbool启用一组计划在未来正式支持的组合安全设置包括开启 BT Secure Connection 的 passkey entry口令输入并允许覆盖此前已配对主机的密钥nCONFIG_ZMK_BLE_EXPERIMENTAL_FEATURESbool聚合开关同时启用上述CONFIG_ZMK_BLE_EXPERIMENTAL_CONN与CONFIG_ZMK_BLE_EXPERIMENTAL_SECnCONFIG_ZMK_BLE_PASSKEY_ENTRYbool配对时要求在此键盘上输入 passkey以增强安全性。注意启用后所有此前已配对的主机都需要重新配对nCONFIG_BT_GATT_ENFORCE_SUBSCRIPTIONboolGATT 订阅的低层设置。设为n可绕过 Windows 下电池通知的恼人 BugyCONFIG_BT_DEVICE_APPEARANCEint蓝牙设备外观值appearance value需从十六进制转换为十进制填入961选项间的依赖关系源码视角这些选项并非彼此孤立从 app/Kconfig 的源码可以看清它们的联动关系CONFIG_ZMK_BLE_EXPERIMENTAL_FEATURES通过select ZMK_BLE_EXPERIMENTAL_CONN和select ZMK_BLE_EXPERIMENTAL_SEC强制开启两个子开关是聚合入口CONFIG_ZMK_BLE_EXPERIMENTAL_CONN生效后BT_CTLR_PHY_2M默认被置为n见 app/Kconfig即关闭 2M PHY 高速物理层。1M PHY 在链路质量不佳时更稳定这正是实验性连接设置当前唯一的行为差异CONFIG_ZMK_BLE_EXPERIMENTAL_SEC通过imply BT_SMP_ALLOW_UNAUTH_OVERWRITE打开允许未认证设备覆盖已有配对信息的能力反向的BT_SMP_ALLOW_UNAUTH_OVERWRITE又imply ZMK_BLE_PASSKEY_ENTRY意味着安全相关的实验开关与 passkey 输入之间存在相互牵引改动时需要通盘考虑。同时注意CONFIG_ZMK_BLE本身会select BT_SMP_SC_PAIR_ONLY与BT_SMP_APP_PAIRING_ACCEPT见 app/Kconfig这决定了 ZMK 强制使用 BLE Secure Connections要求主机蓝牙 4.2 及以上并拒绝传统的 Legacy 配对从协议层面规避已知安全漏洞。深入 PASSKEY 输入键盘上的配对口令CONFIG_ZMK_BLE_PASSKEY_ENTRY不是简单的显示口令开关它要求你在键盘上手动输入主机端显示的 6 位数字口令来完成配对。启用后需要重新配对所有旧主机因此建议在信任环境之外或对安全有较高要求时使用。源码实现位于 app/src/ble.c配对时通过回调auth_passkey_entryble.c#L596-L604记录待输入口令的连接并清空内部 6 位环形缓冲区passkey_entriesRING_BUF_DECLARE(passkey_entries, PASSKEY_DIGITS)见 ble.c#L43-L46键盘按键通过ZMK_LISTENER(zmk_ble, ...)订阅按键事件zmk_ble_handle_key_userble.c#L762-L816将数字区与主键盘区的 0–9 按键转换为口令数字压入缓冲区按下Enter后把收集到的数字组装为 passkey 提交bt_conn_auth_passkey_entry按下Esc则取消本次配对bt_conn_auth_cancel缓冲区满时新数字会挤掉最旧的一位避免输入超长串导致错误。配套的安全逻辑在pairing_allowed_for_current_profileble.c#L625-L629只有当前 profile 处于开放状态、或CONFIG_BT_SMP_ALLOW_UNAUTH_OVERWRITE打开且连接方恰好是当前 profile 中已存地址时才接受配对请求否则返回BT_SECURITY_ERR_PAIR_NOT_ALLOWED拒绝。连接稳定性2M PHY 与实验性连接设置CONFIG_ZMK_BLE_EXPERIMENTAL_CONN目前只做一件事通过BT_CTLR_PHY_2M默认置n禁用 2M PHY。BLE 5.x 引入了 2Mbps 高速物理层但部分主机的 2M PHY 实现存在兼容性问题表现为频繁掉线、连接不稳定回退到 1M PHY 往往能显著改善。该选项被设计为未来版本的默认行为先行预览因此如果你正被连接抖动困扰可以在.conf中显式开启# zmk-config/config/name.conf CONFIG_ZMK_BLE_EXPERIMENTAL_CONNy设备外观值BLE 广播中的外观字段CONFIG_BT_DEVICE_APPEARANCEint默认961控制键盘在 BLE 广播/扫描响应数据中携带的 GAP Appearance 字段主机可据此识别设备类型并显示相应图标。该值需按蓝牙 SIG 的 assigned numbers 规范从十六进制换算为十进制。默认值961在 app/Kconfig.defaults 中定义并最终通过 app/src/ble.c#L72-L78 中的BT_DATA_BYTES(BT_DATA_GAP_APPEARANCE, BT_BYTES_LIST_LE16(CONFIG_BT_DEVICE_APPEARANCE))写入广播数据包。例如若想向主机声明为键盘之外的其他设备类别可按规范查表后修改CONFIG_BT_DEVICE_APPEARANCE961 # 0x03C1通用键盘填入时使用十进制不同外观值请查阅蓝牙规范 assigned numbers 表格换算。Windows 电池通知 Bug 的规避CONFIG_BT_GATT_ENFORCE_SUBSCRIPTION默认y。该选项是 Zephyr 蓝牙协议栈的低层 GATT 行为开关强制要求客户端先订阅subscribe才能收到通知。部分 Windows 主机会对电池服务BAS见 ble.c#L75-L77 中广播的BT_UUID_BAS_VAL的订阅处理不标准导致电量通知异常甚至连接异常。遇到这类问题时将其设为n是仓库文档明确给出的绕行方案CONFIG_BT_GATT_ENFORCE_SUBSCRIPTIONn这也是仓库内置板卡正在使用的真实配置glove80 左侧固件在 glove80_lh_defconfig 中正是这样设置的。与配置相关的两个关键行为概念配对 Profile 管理ZMK 默认提供 5 个蓝牙 profile 用于存储不同主机的配对信息bond 信息配对新主机前需确保目标 profile 是空的否则配对会被拒绝。profile 的切换、清除、断开均通过btbehavior 完成详见 蓝牙 behavior 文档常用命令包括BT_CLR清除当前 profile 的配对、BT_CLR_ALL、BT_SEL 0选中第 1 个 profile等。配对信息连同协商出的长期密钥LTK保存在芯片的持久存储中重新刷写固件也不会丢失这也就是启用 passkey entry 后旧主机必须重新配对的原因——旧主机仍持有旧密钥而键盘侧已删除对应绑定继续连接会以 Security failed 失败。启用新功能后刷新 HID 描述符修改 HID 相关设置如开启 NKRO、HID 指示灯或启用鼠标功能后ZMK 通过 USB/BLE 上报的数据结构会改变需要更新 HID report descriptor 才能被主机正确解析。USB 端在启动时会自动刷新但 BLE 主机会缓存描述符需要在主机侧删除该键盘设备 → 在键盘上用BT_CLR清除对应 profile → 重新配对。Windows 用户如遇已连接但无法输入的情况通常就是这一步没做。完整示例一份面向稳定与安全的配置综合以上各选项一份兼顾连接稳定性与配对安全的.conf配置可以这样组织按需取舍不要盲目全开# zmk-config/config/name.conf # 连接稳定性禁用 2M PHY CONFIG_ZMK_BLE_EXPERIMENTAL_CONNy # 配对安全启用键盘输入 passkey开启后需重新配对所有主机 CONFIG_ZMK_BLE_PASSKEY_ENTRYy # 或者直接聚合开启以上两项实验性设置 # CONFIG_ZMK_BLE_EXPERIMENTAL_FEATURESy # Windows 电池通知异常时取消 GATT 订阅强制 # CONFIG_BT_GATT_ENFORCE_SUBSCRIPTIONn # 自定义设备外观值十进制默认 961 通用键盘 # CONFIG_BT_DEVICE_APPEARANCE961修改完成后重新构建并刷写固件即可生效若不确定最终生效的配置可以检查构建产物中最终合并的 Kconfig 设置来核对。所有选项的权威定义均可直接在仓库的 app/Kconfig 与 app/Kconfig.defaults 中查阅行为实现则在 app/src/ble.c 中逐行对应。赞分享固件嵌入式智能硬件蓝牙【免费下载链接】zmkZMK Firmware Repository项目地址https://gitcode.com/gh_mirrors/zm/zmk点击查看免费下载相关推荐Umi-OCR双层可搜索PDF生成完整指南扫描件一键变成可搜索文档Umi OCR双层可搜索PDF生成完整指南扫描件一键变成可搜索文档 扫描件PDF只能看、不能搜复制文字还常得到乱码。Umi OCR是一款免费开源的离线OCR固件嵌入式智能硬件蓝牙ZMK 系统配置完全指南Kconfig 选项详解与 nRF 无 SoftDevice 内存 Snippets 实战ZMK 系统配置完全指南Kconfig 选项详解与 nRF 无 SoftDevice 内存 Snippets 实战 导读 本文基于 ZMK 固件仓库的官方系统固件嵌入式智能硬件蓝牙VeraCrypt 到底能帮你做什么?一份免费又完整的磁盘加密上手指南VeraCrypt 到底能帮你做什么?一份免费又完整的磁盘加密上手指南 VeraCrypt 是一款基于 TrueCrypt 的免费开源磁盘加密工具。它帮你解决一固件嵌入式智能硬件蓝牙上一篇5分钟让Unity游戏自动翻成中文XUnity.AutoTranslator完整上手教程下一篇日文字幕秒变中文Unity 游戏汉化插件 XUnity.AutoTranslator 实时翻译上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进