如何在蓝牙广播包中配置设备类型?nRF52832键盘适配macOS
解决nRF52832蓝牙键盘在macOS设备图标显示问题
macOS通过蓝牙广播中的**设备类(Device Class)**和服务UUID识别设备类型,你提到的minor type就是设备类里的次设备类字段。针对nRF52832和NRF SDK,按以下步骤配置就能让macOS正确显示键盘图标:
核心配置步骤
1. 定位广播数据配置代码
在你的工程中找到蓝牙广播初始化代码,通常在main.c或ble_advertising.c里,找到ble_advdata_t类型的配置结构体——这是NRF SDK定义广播数据的核心结构。
2. 设置设备类参数
蓝牙HID键盘的标准设备类参数为:
- 主设备类(Major Class):
0x05(外设类) - 次设备类(Minor Class):
0x01(键盘) - 服务类掩码:
0x00(无需额外服务类标识,HID服务UUID会补充识别)
在代码中添加定义并关联到广播配置:
// 定义设备类数组(3字节,顺序:服务类掩码、主设备类、次设备类) uint8_t device_class[] = {0x00, 0x05, 0x01}; // 关联到广播数据结构体 ble_advdata_t advdata = {0}; advdata.device_class = device_class;
3. 广播中包含HID服务UUID
macOS会优先通过服务UUID确认设备类型,需在广播数据中添加HID服务的UUID(0x1812):
// 定义HID服务UUID ble_uuid_t adv_uuids[] = {{BLE_UUID_HID_SERVICE, BLE_UUID_TYPE_BLE}}; // 配置广播包含完整UUID列表 advdata.uuids_complete.uuid_cnt = sizeof(adv_uuids) / sizeof(adv_uuids[0]); advdata.uuids_complete.p_uuids = adv_uuids;
4. 完成广播初始化
补充广播标志,编码广播数据并启用广播:
// 设置广播标志:可连接、通用可发现 advdata.flags = BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE; // 编码广播数据 uint8_t m_adv_data[BLE_GAP_ADV_SET_DATA_SIZE_MAX]; uint16_t m_adv_data_len = 0; err_code = ble_advdata_encode(&advdata, m_adv_data, &m_adv_data_len); APP_ERROR_CHECK(err_code); // 配置并启动广播 ble_gap_adv_params_t adv_params = {0}; adv_params.type = BLE_GAP_ADV_TYPE_CONNECTABLE_SCANNABLE_UNDIRECTED; adv_params.p_peer_addr = NULL; adv_params.fp = BLE_GAP_ADV_FP_ANY; adv_params.interval = MSEC_TO_UNITS(100, UNIT_0_625_MS); adv_params.duration = 0; err_code = sd_ble_gap_adv_set_configure(&m_adv_handle, &adv_params, m_adv_data); APP_ERROR_CHECK(err_code); err_code = sd_ble_gap_adv_start(m_adv_handle, APP_BLE_CONN_CFG_TAG); APP_ERROR_CHECK(err_code);
额外提示
- 如果你用的是NRF SDK自带的
ble_hids_keyboard示例工程,直接在示例的广播配置部分替换上述代码即可,示例已有大部分基础框架,只需补充设备类和UUID配置。 - 罗技M590鼠标的次设备类是
0x02,这是它能显示鼠标图标的原因,可对照这个逻辑验证配置正确性。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

