
本文详解如何在 micropython 环境下正确设置 raspberry pi pico 2w 的蓝牙广播名称,解决 nrf connect 中显示为 “n/a” 的常见问题,关键在于构造符合 bluetooth sig 规范的 ad(advertising data)结构。
本文详解如何在 micropython 环境下正确设置 raspberry pi pico 2w 的蓝牙广播名称,解决 nrf connect 中显示为 “n/a” 的常见问题,关键在于构造符合 bluetooth sig 规范的 ad(advertising data)结构。
在使用 Raspberry Pi Pico 2W 进行蓝牙开发时,许多开发者希望自定义设备在扫描工具(如 nRF Connect、nRF Toolbox 或手机蓝牙列表)中显示的名称。但若直接拼接原始字节(如 b'\x09' + bytes(name, 'utf-8')),极易因 AD 数据格式错误导致名称无法解析——典型表现即为显示 “N/A”。
根本原因在于:蓝牙广播数据必须严格遵循 AD Structure 格式:每个 AD 字段由三部分组成:
- 1 字节长度字段(Length):表示该 AD 字段后续总字节数(含类型 + 数据);
-
1 字节 AD 类型(AD Type):例如
0x09表示 Complete Local Name; - N 字节 AD 数据(AD Data):即实际名称的 UTF-8 编码字节。
你原代码中 b'\x09' + bytes(device_name, 'utf-8') 缺少长度字段,且未将 0x09 与名称正确封装为一个完整 AD 字段,因此主机端无法识别名称信息。
✅ 正确做法如下(推荐使用 bytearray 动态构建,清晰可控):
import bluetooth
from time import sleep
ble = bluetooth.BLE()
ble.active(True)
device_name = 'PicoW_Device'
# 构造标准 AD 数据:Flags + Complete Local Name
advertising_data = bytearray()
advertising_data += b'\x02\x01\x06' # Flags: LE General Discoverable + BR/EDR Not Supported
advertising_data += bytearray([1 + len(device_name), 0x09]) # [Length] + [AD Type 0x09]
advertising_data += device_name.encode('utf-8') # 名称 UTF-8 字节
# 启动广播(间隔约100ms)
ble.gap_advertise(100, adv_data=bytes(advertising_data))
print(f"Bluetooth advertising as: {device_name}")
while True:
sleep(1)? 关键说明:
-
bytearray([1 + len(device_name), 0x09])中的1 + len(...)是因为 AD 数据区包含 1 字节类型(0x09)+len(name)字节名称内容,而长度字段本身只计后续字节数(即不包含长度字段自身); -
ble.gap_advertise()要求传入bytes类型,因此最后需调用bytes(advertising_data)转换; - 若需同时广播服务 UUID(如
0x180F电池服务),可在advertising_data后追加对应 AD 结构(如b'\x03\x03\x0F\x18'); - 设备名称最长建议 ≤ 24 字节(受广播包总长 31 字节限制),过长将被截断或导致广播失败。
⚠️ 注意事项:
- 修改名称后需在扫描端(如 nRF Connect)执行「Refresh」或重启扫描,旧缓存可能仍显示旧名或 N/A;
- Pico 2W 的蓝牙仅支持 BLE 外设模式(Peripheral),不支持经典蓝牙(BR/EDR)名称广播;
- MicroPython 固件需为 v1.22 或更新版本(确保
bluetooth.BLE()接口稳定支持自定义广播)。
通过规范构造 AD 数据,你的 Pico 2W 将稳定以自定义名称出现在所有标准 BLE 扫描工具中,为调试与产品化奠定可靠基础。

















