蓝牙技术
直播中

徐伟

8年用户 1005经验值
私信 关注
[问答]

cybt343026-01 ibeacon的应用如何设置设备名称?

我想在cybt343021-01的模块上实现ibeacon的应用。现在已经了ibeacon的应用通过下面的代码和19 0e 01 19 00 31 01 02 15 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 11 22 aa bb 01的hci命令

这是测试结果。但是我想显示device name。但是根据adv的最大长度是31bytes(我的应用已经用了30byte(3 bytes,BTM_BLE_ADVERT_TYPE_FLAG, 27bytes BTM_BLE_ADVERT_TYPE_MANUFACTURER)),那我现在要如何实现这个device name的应用呢

回帖(1)

倪山骋

2025-7-14 17:33:02

在BLE广播数据长度接近31字节限制的情况下,您可以通过扫描响应数据(Scan Response)来添加设备名称(Device Name)。以下是完整解决方案:


1. 原理分析



  • 广播数据(Advertising Data):已使用30字节(3B Flags + 27B Manufacturer Data),剩余1字节不足添加设备名称。

  • 扫描响应数据(Scan Response):独立数据包,当中心设备主动扫描时返回,同样支持31字节长度。


2. 修改方案


将设备名称移至扫描响应数据包中:


广播数据(31B满):
  [Flags: 3B] + [Manufacturer Data: 27B](保持iBeacon不变)

扫描响应数据(存放设备名称):
  [Complete Local Name: N+2B](设备名称类型+字符串)

3. 代码实现


使用ModusToolbox API(基于WICED BLE)设置扫描响应:


#include "wiced_bt_ble.h"
#include "wiced_bt_stack.h"

// 设备名称(示例:"MY_DEVICE")
#define DEVICE_NAME "MY_DEVICE"
const uint8_t device_name[] = {
    sizeof(DEVICE_NAME) - 1, // 名称长度(不包括结尾NULL)
    BTM_BLE_ADVERT_TYPE_NAME_COMPLETE, // 设备名称类型(0x09)
    'M','Y','_','D','E','V','I','C','E'
};

// iBeacon广播数据(保持您原有的30字节)
uint8_t beacon_adv_data[] = {
    0x02, 0x01, 0x06,      // Flags
    0x1A, 0xFF,            // Manufacturer Data Header
    /* 这里放入25字节的iBeacon数据 */
};

void app_bt_management_callback(wiced_bt_management_evt_t event, wiced_bt_management_evt_data_t *p_event_data) {
    switch (event) {
    case BTM_ENABLED_EVT:
        // 设置广播数据
        wiced_bt_ble_set_raw_advertisement_data(sizeof(beacon_adv_data), beacon_adv_data);

        // 关键:设置扫描响应数据(包含设备名称)
        wiced_bt_ble_set_raw_scan_response_data(sizeof(device_name), device_name);

        // 启动广播
        wiced_bt_start_advertisements(BTM_BLE_ADVERT_UNDIRECTED_HIGH, 0, NULL);
        break;
    }
}

// 初始化
void application_start() {
    wiced_bt_stack_init(app_bt_management_callback, NULL, NULL);
}

4. HCI命令实现(底层方式)


如果您需直接使用HCI命令:




  • 设置扫描响应数据


    # HCI命令格式:hcitool cmd   <参数...>
    # LE Set Scan Response Data (0x08|0x0009)
    # 参数:长度 (1B) + 扫描响应数据(31B)

    # 示例:添加设备名称"MY_DEVICE"(0x09表示Complete Local Name)
    sudo hcitool cmd 0x08 0x09 0x0B 0x09 0x4D 0x59 0x5F 0x44 0x45 0x56 0x49 0x43 0x45
    # 解释:
    #   0x0B: 总长度11字节(0x09类型1B + 名称9B)
    #   0x09: 设备名称类型
    #   后续9字节: "M Y _ D E V I C E"的ASCII(0x4D,0x59,...)



5. 验证方法


使用BLE扫描工具(如nRF Connect):



  1. 扫描设备时会显示您的iBeacon(如未连接)

  2. 在设备信息中查看扫描响应数据,应包含设置的设备名称


注意事项



  • 设备名称长度:确保扫描响应数据不超过31字节(名称最大29字符)

  • 广播模式:使用ADVERT_UNDIRECTED(不可连接广播)以免占用Flags字节

  • 功耗影响:扫描响应仅在主动扫描时发送,功耗增加可忽略


通过此方案,您可以在维持iBeacon功能的前提下,通过扫描响应数据传递设备名称,完美解决31字节长度限制问题。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分