如何修改Raspberry Pico 2W蓝牙名称?解决nRF Connect显示N/A问题
问题分析与解决
你的代码里BLE广播数据的设备名称字段格式错误,导致nRF Connect无法正确解析名称,所以显示“N/A”。
BLE广播数据中的每个AD单元(数据段)都必须遵循长度-类型-值的格式:
- 第一个字节是长度:等于类型字节长度(1字节)加上值的字节长度
- 第二个字节是AD类型:0x09代表“完整本地名称”
- 后续字节是对应的值(这里就是设备名称)
你当前的代码直接把0x09和名称字节拼接,但缺少了长度字段,导致解析失败。
修改后的代码
import bluetooth from time import sleep # 初始化BLE ble = bluetooth.BLE() ble.active(True) device_name = 'PicoW_Device' # 构造广播数据: # 1. 标志位AD单元:长度0x02,类型0x01,值0x06(LE 通用可发现模式 + BR/EDR 不支持) flags = b'\x02\x01\x06' # 2. 服务UUID AD单元:长度0x03,类型0x03,值0x0F18(电池服务UUID) service_uuid = b'\x03\x03\x0F\x18' # 3. 设备名称AD单元:计算长度,类型0x09,值为设备名称字节 name_length = 1 + len(device_name) # 1是类型字节长度 name_ad = bytes([name_length]) + b'\x09' + bytes(device_name, 'utf-8') # 拼接所有AD单元,总长度不能超过31字节 advertising_data = flags + service_uuid + name_ad # 开始广播 ble.gap_advertise(100, adv_data=advertising_data) print(f"The Name of the device is currently: {device_name}") while True: sleep(1)
额外优化点
- 避免重复创建BLE实例:原代码中
bluetooth.BLE().active(True)和ble = bluetooth.BLE()会生成两个实例,合并成一次初始化更合理 - 确保广播数据总长度不超过31字节,这是BLE广播包的最大限制,如果设备名称过长,需要改用“缩短本地名称”(AD类型0x08)或者调整其他AD单元
内容的提问来源于stack exchange,提问作者5955_Pauli
相关产品推荐
相关产品推荐

