一、前言在低功耗蓝牙BLE开发中广播Advertising是设备发现、连接建立、数据广播、设备重连的核心基石所有BLE交互流程均始于广播报文的收发。不同于传统经典蓝牙BLE所有广播行为标准化、可配置、可管控开发者可根据业务场景精准选择广播模式平衡设备发现成功率、连接速度、功耗、数据承载量四大核心指标。日常开发中90%的蓝牙疑难问题均是广播模式误用导致设备前台可搜后台失联、重连延迟过高、广播数据截断、功耗飙升、无法被指定设备绑定、老旧机型兼容异常等。绝大多数开发者仅会使用默认可连接广播对不可连接、定向、周期广播的底层特性、适用边界、平台差异一无所知导致项目后期迭代频繁踩坑。BLE 协议栈标准定义了四类核心广播模式覆盖所有BLE业务场景可连接非定向广播、不可连接非定向广播、定向可连接广播、周期扩展广播。本文摒弃空洞理论深度拆解每种模式的底层协议原理、时序逻辑、报文结构、参数配置同时补齐Android、iOS、Flutter三平台完整生产级代码细化平台差异、报错处理、参数调优、避坑方案全方位落地BLE广播开发。二、BLE广播基础核心认知在深入四大模式前必须掌握BLE广播底层基础才能理解不同模式的设计逻辑与差异。1. 广播信道机制BLE 不占用数据通信信道专门独立3个广播信道规避数据传输干扰保障设备发现稳定性37信道、38信道、39信道。所有广播报文会依次在三个信道循环发送扫描设备监听对应信道即可捕获广播数据。2. 核心参数定义广播间隔Advertising Interval两次广播报文发送的时间间隔间隔越小、发现越快、功耗越高间隔越大、功耗越低、发现延迟越高。广播超时Timeout广播持续运行时长超时后自动停止广播0代表永久广播。可连接性是否允许外围设备发起连接请求。可扫描性是否允许外围设备发送扫描请求、获取扫描响应数据。广播数据扫描响应数据普通广播最大承载31字节数据扫描响应可额外携带31字节合计62字节BLE5.0周期广播突破该限制。三、四大广播模式核心对照表全网最全下表整合协议定义、核心属性、能力限制、功耗等级、兼容版本、业务场景是BLE广播开发选型核心依据。广播模式协议宏定义可连接可扫描定向对象数据上限功耗等级兼容版本核心场景可连接非定向广播ADV_IND✅✅无全局广播62字节中BLE4.0设备首次配对、常规搜索连接、通用设备发现不可连接非定向广播ADV_NONCONN_IND❌❌无全局广播31字节极低BLE4.0Beacon信标、传感器数据上报、点位打卡、纯数据透传定向可连接广播ADV_DIRECT_IND✅❌唯一指定MAC设备0字节无自定义数据高短时爆发BLE4.0设备断线快速重连、绑定设备专属回连、低延迟唤醒周期扩展广播ADV_EXT_IND可选配置可选配置无全局广播超大字节可配置BLE5.0大数据广播、设备组网、音频同步、批量设备状态同步四、四大广播模式深度原理拆解1. 可连接非定向广播ADV_IND这是BLE项目默认最常用的广播模式也是兼容性最好、功能最全面的基础模式。设备开启该广播后会在37/38/39三个信道循环发送广播报文公开对外暴露设备信息。该模式同时支持广播报文扫描响应报文双数据承载普通广播包携带设备基础信息设备名、厂商ID扫描响应可携带自定义业务数据合计62字节有效数据。任意外围设备扫描到广播后可主动发起扫描请求获取完整数据也可直接发起连接请求建立BLE链路。底层时序逻辑广播设备周期性发送广播包 → 扫描设备捕获报文 → 可选择发起扫描/连接 → 广播设备响应请求。核心优缺点适配全平台、支持交互、可扩展数据缺点是持续广播功耗偏高易被陌生设备扫描、连接干扰不适合纯数据低功耗场景。2. 不可连接非定向广播ADV_NONCONN_IND纯单向数据广播模式彻底关闭扫描响应与连接能力是BLE功耗最低的广播方案。该模式仅单向对外发送固定广播报文不响应任何外围设备的扫描请求、连接请求无任何双向交互逻辑。协议限制仅支持31字节单广播包数据无扫描响应扩展空间数据承载量有限但极致省电。设备开启该广播后无需处理任何上层交互事件CPU、蓝牙模块可进入低功耗休眠状态续航可提升50%以上。核心适用场景无需连接的纯上报业务包括室内定位Beacon、温湿度传感器实时上报、设备点位打卡、广播型状态同步等。3. 定向可连接广播ADV_DIRECT_IND专属一对一广播模式核心作用是快速重连、设备绑定。该广播不会对外公开广播仅针对开发者指定的唯一MAC地址设备发送广播报文拒绝所有其他设备的扫描、连接请求。协议分为两种占空比模式高占空比模式广播间隔仅3.75ms毫秒级低延迟专门用于断线瞬间回连但协议强制限制最大存活时间1.28秒超时自动终止低占空比模式间隔更长、功耗更低可延长广播时长。硬性协议限制定向广播不支持任何自定义广播数据仅能传递设备基础连接信息无法携带业务数据这是很多开发者踩坑的核心点。该模式只做「快速唤醒、建立连接」不做数据透传。4. 周期扩展广播ADV_EXT_INDBLE5.0 重磅升级的广播模式彻底打破BLE4.0广播的所有限制是高端蓝牙设备组网、大数据传输的核心能力。传统BLE4.0广播存在62字节数据上限、无同步机制、信道固定的短板周期扩展广播全部优化。核心能力支持超长广播数据包、支持广播周期同步、支持多信道扩展、可自由配置是否可连接、可扫描。多设备可同步监听同一周期广播实现一对多批量数据同步完美适配设备组网、音频同步、批量固件状态上报等复杂场景。核心限制仅支持BLE5.0及以上设备老旧安卓、iOS低版本设备无法兼容项目使用必须做版本兼容降级处理。五、Android 原生全模式完整实战代码KotlinAndroid 5.0API21及以上完整支持BLE广播APIAndroid 12需要新增蓝牙扫描、广播动态权限适配。以下代码包含四种模式完整实现、权限适配、回调监听、异常处理、广播启停、资源释放可直接用于生产。import android.Manifest import android.bluetooth.le.AdvertiseCallback import android.bluetooth.le.AdvertiseSettings import android.bluetooth.le.AdvertiseData import android.bluetooth.le.BluetoothLeAdvertiser import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothManager import android.content.Context import android.content.pm.PackageManager import android.os.Build /** * BLE四大广播模式统一管理类 * 适配Android5.0兼容Android12权限 */ class BleAdvertiseManager(private val context: Context) { private val bluetoothAdapter: BluetoothAdapter by lazy { val bluetoothManager context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager bluetoothManager.adapter } private val advertiser: BluetoothLeAdvertiser by lazy { bluetoothAdapter.bluetoothLeAdvertiser } // 全局广播回调统一处理成功/失败 private val advertiseCallback object : AdvertiseCallback() { override fun onStartSuccess(settingsInEffect: AdvertiseSettings?) { super.onStartSuccess(settingsInEffect) println(BLE广播启动成功) } override fun onStartFailure(errorCode: Int) { super.onStartFailure(errorCode) println(BLE广播启动失败错误码$errorCode) } } // 1. 可连接非定向广播 ADV_IND fun startConnectableAdv() { if (!checkBluetoothPermission()) return // 广播参数配置低延迟、可连接、永久广播 val settings AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY) .setConnectable(true) .setTimeout(0) .setTxPowerLevel(AdvertiseSettings.TX_POWER_HIGH) .build() // 广播数据携带设备名称 val data AdvertiseData.Builder() .setIncludeDeviceName(true) .setIncludeTxPowerLevel(true) .build() advertiser.startAdvertising(settings, data, advertiseCallback) } // 2. 不可连接非定向广播 ADV_NONCONN_IND低功耗纯数据广播 fun startNonConnectableAdv() { if (!checkBluetoothPermission()) return // 低功耗模式、不可连接、永久广播 val settings AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER) .setConnectable(false) .setTimeout(0) .setTxPowerLevel(AdvertiseSettings.TX_POWER_LOW) .build() // 自定义厂商数据31字节内 val data AdvertiseData.Builder() .addManufacturerData(0x1234, byteArrayOf(0x01, 0x02, 0x03, 0x04, 0x05)) .build() advertiser.startAdvertising(settings, data, advertiseCallback) } // 3. 定向可连接广播 ADV_DIRECT_IND指定设备重连 fun startDirectConnectAdv(targetMac: String) { if (!checkBluetoothPermission()) return // 定向广播默认高优先级、可连接、1.28s超时 val settings AdvertiseSettings.Builder() .setConnectable(true) .setTimeout(1280) .setTxPowerLevel(AdvertiseSettings.TX_POWER_HIGH) .build() // 定向广播无自定义数据 val data AdvertiseData.Builder().build() advertiser.startAdvertising(settings, data, targetMac, advertiseCallback) } // 4. 周期扩展广播 ADV_EXT_INDBLE5.0专属 fun startExtPeriodAdv() { if (!checkBluetoothPermission()) return // 校验设备是否支持BLE5.0扩展广播 if (!bluetoothAdapter.isLeExtendedAdvertisingSupported) { println(当前设备不支持BLE5.0周期广播) return } val settings AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED) .setConnectable(false) .setTimeout(0) .build() val data AdvertiseData.Builder() .addManufacturerData(0x5678, ByteArray(20) { 0x01 }) .build() advertiser.startAdvertising(settings, data, advertiseCallback) } // 停止所有广播释放资源 fun stopAllAdv() { advertiser.stopAdvertising(advertiseCallback) println(BLE广播已全部停止) } // 权限校验适配Android12 private fun checkBluetoothPermission(): Boolean { return if (Build.VERSION.SDK_INT Build.VERSION_CODES.S) { context.checkSelfPermission(Manifest.permission.BLUETOOTH_ADVERTISE) PackageManager.PERMISSION_GRANTED } else { true } } }六、iOS 原生全模式完整实战代码SwiftiOS 蓝牙广播基于CBPeripheralManager实现存在系统硬性限制无原生定向广播API、后台广播严格限流、周期广播仅高版本支持。以下代码补齐模式适配、状态监听、异常捕获、跨平台兼容方案。import UIKit import CoreBluetooth /// BLE广播管理类 iOS全模式适配 class BleAdvertiseManager: NSObject, CBPeripheralManagerDelegate { private var peripheralManager: CBPeripheralManager! private var isBLE5Support: Bool false override init() { super.init() // 初始化蓝牙外设管理器 peripheralManager CBPeripheralManager(delegate: self, queue: nil, options: [ CBPeripheralManagerOptionShowPowerAlertKey: true ]) // 检测BLE5.0扩展广播支持性 isBLE5Support peripheralManager.isLeExtendedAdvertisingSupported } // 1. 可连接广播 ADV_IND func startConnectableAdv() { let advData: [String: Any] [ CBAdvertisementDataLocalNameKey: iOS_BLE_Connect_Device, CBAdvertisementDataTxPowerLevelKey: NSNumber(value: 4) ] // 防止重复广播 if peripheralManager.isAdvertising { peripheralManager.stopAdvertising() } peripheralManager.startAdvertising(advData) print(iOS可连接广播启动) } // 2. 不可连接广播 ADV_NONCONN_IND func startNonConnectableAdv() { let advData: [String: Any] [ CBAdvertisementDataManufacturerDataKey: Data([0x01, 0x02, 0x03, 0x04]) ] if peripheralManager.isAdvertising { peripheralManager.stopAdvertising() } peripheralManager.startAdvertising(advData) print(iOS不可连接低功耗广播启动) } // 3. iOS定向广播 模拟实现系统无原生API业务层过滤 func startDirectAdv(targetMac: String) { // iOS无法发送原生定向广播通过开启可连接广播拦截连接请求实现定向效果 startConnectableAdv() print(iOS模拟定向广播启动仅允许\(targetMac)连接) } // 4. 周期扩展广播 BLE5.0 func startExtPeriodAdv() { guard isBLE5Support else { print(当前iOS设备不支持BLE5.0周期广播) return } // iOS扩展广播配置 let advData: [String: Any] [ CBAdvertisementDataLocalNameKey: iOS_BLE_Ext_Device ] peripheralManager.startAdvertising(advData) } // 停止广播 func stopAdv() { if peripheralManager.isAdvertising { peripheralManager.stopAdvertising() print(iOS广播已停止) } } // 蓝牙状态监听 func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) { switch peripheral.state { case .poweredOn: print(蓝牙正常开启) case .poweredOff: print(蓝牙已关闭) case .unauthorized: print(蓝牙权限未开启) default: print(蓝牙状态异常) } } }iOS核心限制深度说明iOS系统出于隐私安全管控彻底屏蔽ADV_DIRECT_IND 原生定向广播无法像Android一样指定MAC定向广播。生产解决方案全局开启可连接广播在连接回调中拦截非目标MAC设备主动拒绝陌生设备连接完美模拟定向广播效果。同时iOS后台广播会被系统节流间隔大幅拉长无法实现前台高频广播效果。七、Flutter 跨平台全模式统一封装生产级可用Flutter 无原生蓝牙能力依赖社区成熟插件flutter_blue_plus实现跨平台统一广播能力抹平Android/iOS平台差异。以下代码封装四大广播模式、状态监听、异常捕获、启停管控一套代码双端通用。1. 项目依赖配置dependencies: flutter_blue_plus: ^1.13.32. Flutter 完整广播工具类import package:flutter_blue_plus/flutter_blue_plus.dart; /// Flutter BLE四大广播模式统一封装 class FlutterBleAdvManager { /// 1. 可连接非定向广播 ADV_IND static Futurebool startConnectableAdv() async { try { await FlutterBluePlus.startAdvertising( localName: Flutter_BLE_Device, connectable: true, timeout: 0, txPowerLevel: TxPowerLevel.high, ); return true; } catch (e) { print(可连接广播启动失败$e); return false; } } /// 2. 不可连接低功耗广播 ADV_NONCONN_IND static Futurebool startNonConnectableAdv() async { try { await FlutterBluePlus.startAdvertising( connectable: false, timeout: 0, txPowerLevel: TxPowerLevel.low, manufacturerData: { 0x1234: [0x01, 0x02, 0x03, 0x04, 0x05] }, ); return true; } catch (e) { print(不可连接广播启动失败$e); return false; } } /// 3. 跨平台兼容定向广播模拟实现适配iOSAndroid static Futurebool startDirectAdv(String targetMac) async { try { // 统一开启可连接广播业务层拦截连接请求 await startConnectableAdv(); // 监听连接请求仅放行目标设备 FlutterBluePlus.onConnectionReceived.listen((event) { if(event.device.remoteId.str ! targetMac) { event.device.disconnect(); } }); return true; } catch (e) { print(定向广播模拟启动失败$e); return false; } } /// 4. 周期扩展广播BLE5.0 static Futurebool startExtPeriodAdv() async { try { // 校验设备BLE版本 bool support await FlutterBluePlus.isSupported; if(!support) return false; await FlutterBluePlus.startAdvertising( connectable: false, timeout: 0, manufacturerData: { 0x5678: List.generate(20, (index) 0x02) }, ); return true; } catch (e) { print(周期广播启动失败$e); return false; } } /// 停止所有广播 static Futurevoid stopAllAdv() async { await FlutterBluePlus.stopAdvertising(); } } /// 业务调用示例 // await FlutterBleAdvManager.startConnectableAdv(); // await FlutterBleAdvManager.startNonConnectableAdv();八、四大广播模式场景选型与参数调优指南1. 精准选型规则设备首次配对、通用搜索连接优先 可连接非定向广播兼容性拉满适配所有设备纯数据上报、低功耗续航优先优先 不可连接广播关闭所有交互极致省电设备绑定、断线快速回连、低延迟重连优先 定向广播一对一专属连接防干扰大数据传输、设备组网、批量同步优先 周期扩展广播突破数据长度限制2. 广播参数调优经验用户交互场景低延迟模式广播间隔100ms以内提升发现成功率后台常驻场景平衡模式间隔500ms~1s兼顾功耗与可用性超低功耗场景低功耗模式间隔2s以上大幅降低耗电重连场景高功率短时定向广播毫秒级唤醒设备九、生产级高频坑点深度解析与解决方案1. 可连接广播常见问题问题后台设备搜不到、多设备连接干扰、功耗过高。解决方案前台低延迟广播后台自动切换低功耗间隔业务层增加设备白名单拦截陌生连接请求。2. 不可连接广播常见问题问题无法被扫描、数据无法扩展、新手误以为功能异常。解决方案该模式协议本身不支持扫描响应无需适配扫描逻辑数据严格控制在31字节内。3. 定向广播致命坑点问题广播1.28秒自动消失、无法携带自定义数据、iOS无原生支持。解决方案定向广播仅用于重连唤醒业务数据连接后透传iOS统一使用「可连接广播连接拦截」模拟定向效果。4. 周期广播兼容坑点问题老旧设备完全无法扫描、部分安卓机型适配失效。解决方案必须做版本判断BLE5.0以下设备自动降级为普通可连接广播保障兼容。5. 跨平台通用坑点广播未手动停止会造成蓝牙模块资源泄漏、后续广播启动失败Android12/iOS13必须申请蓝牙权限否则广播直接失效无报错频繁启停广播会导致蓝牙栈异常需增加启停间隔防抖
BLE四大广播模式详解:可连接/不可连接/定向/周期广播
发布时间:2026/5/26 2:09:18
一、前言在低功耗蓝牙BLE开发中广播Advertising是设备发现、连接建立、数据广播、设备重连的核心基石所有BLE交互流程均始于广播报文的收发。不同于传统经典蓝牙BLE所有广播行为标准化、可配置、可管控开发者可根据业务场景精准选择广播模式平衡设备发现成功率、连接速度、功耗、数据承载量四大核心指标。日常开发中90%的蓝牙疑难问题均是广播模式误用导致设备前台可搜后台失联、重连延迟过高、广播数据截断、功耗飙升、无法被指定设备绑定、老旧机型兼容异常等。绝大多数开发者仅会使用默认可连接广播对不可连接、定向、周期广播的底层特性、适用边界、平台差异一无所知导致项目后期迭代频繁踩坑。BLE 协议栈标准定义了四类核心广播模式覆盖所有BLE业务场景可连接非定向广播、不可连接非定向广播、定向可连接广播、周期扩展广播。本文摒弃空洞理论深度拆解每种模式的底层协议原理、时序逻辑、报文结构、参数配置同时补齐Android、iOS、Flutter三平台完整生产级代码细化平台差异、报错处理、参数调优、避坑方案全方位落地BLE广播开发。二、BLE广播基础核心认知在深入四大模式前必须掌握BLE广播底层基础才能理解不同模式的设计逻辑与差异。1. 广播信道机制BLE 不占用数据通信信道专门独立3个广播信道规避数据传输干扰保障设备发现稳定性37信道、38信道、39信道。所有广播报文会依次在三个信道循环发送扫描设备监听对应信道即可捕获广播数据。2. 核心参数定义广播间隔Advertising Interval两次广播报文发送的时间间隔间隔越小、发现越快、功耗越高间隔越大、功耗越低、发现延迟越高。广播超时Timeout广播持续运行时长超时后自动停止广播0代表永久广播。可连接性是否允许外围设备发起连接请求。可扫描性是否允许外围设备发送扫描请求、获取扫描响应数据。广播数据扫描响应数据普通广播最大承载31字节数据扫描响应可额外携带31字节合计62字节BLE5.0周期广播突破该限制。三、四大广播模式核心对照表全网最全下表整合协议定义、核心属性、能力限制、功耗等级、兼容版本、业务场景是BLE广播开发选型核心依据。广播模式协议宏定义可连接可扫描定向对象数据上限功耗等级兼容版本核心场景可连接非定向广播ADV_IND✅✅无全局广播62字节中BLE4.0设备首次配对、常规搜索连接、通用设备发现不可连接非定向广播ADV_NONCONN_IND❌❌无全局广播31字节极低BLE4.0Beacon信标、传感器数据上报、点位打卡、纯数据透传定向可连接广播ADV_DIRECT_IND✅❌唯一指定MAC设备0字节无自定义数据高短时爆发BLE4.0设备断线快速重连、绑定设备专属回连、低延迟唤醒周期扩展广播ADV_EXT_IND可选配置可选配置无全局广播超大字节可配置BLE5.0大数据广播、设备组网、音频同步、批量设备状态同步四、四大广播模式深度原理拆解1. 可连接非定向广播ADV_IND这是BLE项目默认最常用的广播模式也是兼容性最好、功能最全面的基础模式。设备开启该广播后会在37/38/39三个信道循环发送广播报文公开对外暴露设备信息。该模式同时支持广播报文扫描响应报文双数据承载普通广播包携带设备基础信息设备名、厂商ID扫描响应可携带自定义业务数据合计62字节有效数据。任意外围设备扫描到广播后可主动发起扫描请求获取完整数据也可直接发起连接请求建立BLE链路。底层时序逻辑广播设备周期性发送广播包 → 扫描设备捕获报文 → 可选择发起扫描/连接 → 广播设备响应请求。核心优缺点适配全平台、支持交互、可扩展数据缺点是持续广播功耗偏高易被陌生设备扫描、连接干扰不适合纯数据低功耗场景。2. 不可连接非定向广播ADV_NONCONN_IND纯单向数据广播模式彻底关闭扫描响应与连接能力是BLE功耗最低的广播方案。该模式仅单向对外发送固定广播报文不响应任何外围设备的扫描请求、连接请求无任何双向交互逻辑。协议限制仅支持31字节单广播包数据无扫描响应扩展空间数据承载量有限但极致省电。设备开启该广播后无需处理任何上层交互事件CPU、蓝牙模块可进入低功耗休眠状态续航可提升50%以上。核心适用场景无需连接的纯上报业务包括室内定位Beacon、温湿度传感器实时上报、设备点位打卡、广播型状态同步等。3. 定向可连接广播ADV_DIRECT_IND专属一对一广播模式核心作用是快速重连、设备绑定。该广播不会对外公开广播仅针对开发者指定的唯一MAC地址设备发送广播报文拒绝所有其他设备的扫描、连接请求。协议分为两种占空比模式高占空比模式广播间隔仅3.75ms毫秒级低延迟专门用于断线瞬间回连但协议强制限制最大存活时间1.28秒超时自动终止低占空比模式间隔更长、功耗更低可延长广播时长。硬性协议限制定向广播不支持任何自定义广播数据仅能传递设备基础连接信息无法携带业务数据这是很多开发者踩坑的核心点。该模式只做「快速唤醒、建立连接」不做数据透传。4. 周期扩展广播ADV_EXT_INDBLE5.0 重磅升级的广播模式彻底打破BLE4.0广播的所有限制是高端蓝牙设备组网、大数据传输的核心能力。传统BLE4.0广播存在62字节数据上限、无同步机制、信道固定的短板周期扩展广播全部优化。核心能力支持超长广播数据包、支持广播周期同步、支持多信道扩展、可自由配置是否可连接、可扫描。多设备可同步监听同一周期广播实现一对多批量数据同步完美适配设备组网、音频同步、批量固件状态上报等复杂场景。核心限制仅支持BLE5.0及以上设备老旧安卓、iOS低版本设备无法兼容项目使用必须做版本兼容降级处理。五、Android 原生全模式完整实战代码KotlinAndroid 5.0API21及以上完整支持BLE广播APIAndroid 12需要新增蓝牙扫描、广播动态权限适配。以下代码包含四种模式完整实现、权限适配、回调监听、异常处理、广播启停、资源释放可直接用于生产。import android.Manifest import android.bluetooth.le.AdvertiseCallback import android.bluetooth.le.AdvertiseSettings import android.bluetooth.le.AdvertiseData import android.bluetooth.le.BluetoothLeAdvertiser import android.bluetooth.BluetoothAdapter import android.bluetooth.BluetoothManager import android.content.Context import android.content.pm.PackageManager import android.os.Build /** * BLE四大广播模式统一管理类 * 适配Android5.0兼容Android12权限 */ class BleAdvertiseManager(private val context: Context) { private val bluetoothAdapter: BluetoothAdapter by lazy { val bluetoothManager context.getSystemService(Context.BLUETOOTH_SERVICE) as BluetoothManager bluetoothManager.adapter } private val advertiser: BluetoothLeAdvertiser by lazy { bluetoothAdapter.bluetoothLeAdvertiser } // 全局广播回调统一处理成功/失败 private val advertiseCallback object : AdvertiseCallback() { override fun onStartSuccess(settingsInEffect: AdvertiseSettings?) { super.onStartSuccess(settingsInEffect) println(BLE广播启动成功) } override fun onStartFailure(errorCode: Int) { super.onStartFailure(errorCode) println(BLE广播启动失败错误码$errorCode) } } // 1. 可连接非定向广播 ADV_IND fun startConnectableAdv() { if (!checkBluetoothPermission()) return // 广播参数配置低延迟、可连接、永久广播 val settings AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY) .setConnectable(true) .setTimeout(0) .setTxPowerLevel(AdvertiseSettings.TX_POWER_HIGH) .build() // 广播数据携带设备名称 val data AdvertiseData.Builder() .setIncludeDeviceName(true) .setIncludeTxPowerLevel(true) .build() advertiser.startAdvertising(settings, data, advertiseCallback) } // 2. 不可连接非定向广播 ADV_NONCONN_IND低功耗纯数据广播 fun startNonConnectableAdv() { if (!checkBluetoothPermission()) return // 低功耗模式、不可连接、永久广播 val settings AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_POWER) .setConnectable(false) .setTimeout(0) .setTxPowerLevel(AdvertiseSettings.TX_POWER_LOW) .build() // 自定义厂商数据31字节内 val data AdvertiseData.Builder() .addManufacturerData(0x1234, byteArrayOf(0x01, 0x02, 0x03, 0x04, 0x05)) .build() advertiser.startAdvertising(settings, data, advertiseCallback) } // 3. 定向可连接广播 ADV_DIRECT_IND指定设备重连 fun startDirectConnectAdv(targetMac: String) { if (!checkBluetoothPermission()) return // 定向广播默认高优先级、可连接、1.28s超时 val settings AdvertiseSettings.Builder() .setConnectable(true) .setTimeout(1280) .setTxPowerLevel(AdvertiseSettings.TX_POWER_HIGH) .build() // 定向广播无自定义数据 val data AdvertiseData.Builder().build() advertiser.startAdvertising(settings, data, targetMac, advertiseCallback) } // 4. 周期扩展广播 ADV_EXT_INDBLE5.0专属 fun startExtPeriodAdv() { if (!checkBluetoothPermission()) return // 校验设备是否支持BLE5.0扩展广播 if (!bluetoothAdapter.isLeExtendedAdvertisingSupported) { println(当前设备不支持BLE5.0周期广播) return } val settings AdvertiseSettings.Builder() .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED) .setConnectable(false) .setTimeout(0) .build() val data AdvertiseData.Builder() .addManufacturerData(0x5678, ByteArray(20) { 0x01 }) .build() advertiser.startAdvertising(settings, data, advertiseCallback) } // 停止所有广播释放资源 fun stopAllAdv() { advertiser.stopAdvertising(advertiseCallback) println(BLE广播已全部停止) } // 权限校验适配Android12 private fun checkBluetoothPermission(): Boolean { return if (Build.VERSION.SDK_INT Build.VERSION_CODES.S) { context.checkSelfPermission(Manifest.permission.BLUETOOTH_ADVERTISE) PackageManager.PERMISSION_GRANTED } else { true } } }六、iOS 原生全模式完整实战代码SwiftiOS 蓝牙广播基于CBPeripheralManager实现存在系统硬性限制无原生定向广播API、后台广播严格限流、周期广播仅高版本支持。以下代码补齐模式适配、状态监听、异常捕获、跨平台兼容方案。import UIKit import CoreBluetooth /// BLE广播管理类 iOS全模式适配 class BleAdvertiseManager: NSObject, CBPeripheralManagerDelegate { private var peripheralManager: CBPeripheralManager! private var isBLE5Support: Bool false override init() { super.init() // 初始化蓝牙外设管理器 peripheralManager CBPeripheralManager(delegate: self, queue: nil, options: [ CBPeripheralManagerOptionShowPowerAlertKey: true ]) // 检测BLE5.0扩展广播支持性 isBLE5Support peripheralManager.isLeExtendedAdvertisingSupported } // 1. 可连接广播 ADV_IND func startConnectableAdv() { let advData: [String: Any] [ CBAdvertisementDataLocalNameKey: iOS_BLE_Connect_Device, CBAdvertisementDataTxPowerLevelKey: NSNumber(value: 4) ] // 防止重复广播 if peripheralManager.isAdvertising { peripheralManager.stopAdvertising() } peripheralManager.startAdvertising(advData) print(iOS可连接广播启动) } // 2. 不可连接广播 ADV_NONCONN_IND func startNonConnectableAdv() { let advData: [String: Any] [ CBAdvertisementDataManufacturerDataKey: Data([0x01, 0x02, 0x03, 0x04]) ] if peripheralManager.isAdvertising { peripheralManager.stopAdvertising() } peripheralManager.startAdvertising(advData) print(iOS不可连接低功耗广播启动) } // 3. iOS定向广播 模拟实现系统无原生API业务层过滤 func startDirectAdv(targetMac: String) { // iOS无法发送原生定向广播通过开启可连接广播拦截连接请求实现定向效果 startConnectableAdv() print(iOS模拟定向广播启动仅允许\(targetMac)连接) } // 4. 周期扩展广播 BLE5.0 func startExtPeriodAdv() { guard isBLE5Support else { print(当前iOS设备不支持BLE5.0周期广播) return } // iOS扩展广播配置 let advData: [String: Any] [ CBAdvertisementDataLocalNameKey: iOS_BLE_Ext_Device ] peripheralManager.startAdvertising(advData) } // 停止广播 func stopAdv() { if peripheralManager.isAdvertising { peripheralManager.stopAdvertising() print(iOS广播已停止) } } // 蓝牙状态监听 func peripheralManagerDidUpdateState(_ peripheral: CBPeripheralManager) { switch peripheral.state { case .poweredOn: print(蓝牙正常开启) case .poweredOff: print(蓝牙已关闭) case .unauthorized: print(蓝牙权限未开启) default: print(蓝牙状态异常) } } }iOS核心限制深度说明iOS系统出于隐私安全管控彻底屏蔽ADV_DIRECT_IND 原生定向广播无法像Android一样指定MAC定向广播。生产解决方案全局开启可连接广播在连接回调中拦截非目标MAC设备主动拒绝陌生设备连接完美模拟定向广播效果。同时iOS后台广播会被系统节流间隔大幅拉长无法实现前台高频广播效果。七、Flutter 跨平台全模式统一封装生产级可用Flutter 无原生蓝牙能力依赖社区成熟插件flutter_blue_plus实现跨平台统一广播能力抹平Android/iOS平台差异。以下代码封装四大广播模式、状态监听、异常捕获、启停管控一套代码双端通用。1. 项目依赖配置dependencies: flutter_blue_plus: ^1.13.32. Flutter 完整广播工具类import package:flutter_blue_plus/flutter_blue_plus.dart; /// Flutter BLE四大广播模式统一封装 class FlutterBleAdvManager { /// 1. 可连接非定向广播 ADV_IND static Futurebool startConnectableAdv() async { try { await FlutterBluePlus.startAdvertising( localName: Flutter_BLE_Device, connectable: true, timeout: 0, txPowerLevel: TxPowerLevel.high, ); return true; } catch (e) { print(可连接广播启动失败$e); return false; } } /// 2. 不可连接低功耗广播 ADV_NONCONN_IND static Futurebool startNonConnectableAdv() async { try { await FlutterBluePlus.startAdvertising( connectable: false, timeout: 0, txPowerLevel: TxPowerLevel.low, manufacturerData: { 0x1234: [0x01, 0x02, 0x03, 0x04, 0x05] }, ); return true; } catch (e) { print(不可连接广播启动失败$e); return false; } } /// 3. 跨平台兼容定向广播模拟实现适配iOSAndroid static Futurebool startDirectAdv(String targetMac) async { try { // 统一开启可连接广播业务层拦截连接请求 await startConnectableAdv(); // 监听连接请求仅放行目标设备 FlutterBluePlus.onConnectionReceived.listen((event) { if(event.device.remoteId.str ! targetMac) { event.device.disconnect(); } }); return true; } catch (e) { print(定向广播模拟启动失败$e); return false; } } /// 4. 周期扩展广播BLE5.0 static Futurebool startExtPeriodAdv() async { try { // 校验设备BLE版本 bool support await FlutterBluePlus.isSupported; if(!support) return false; await FlutterBluePlus.startAdvertising( connectable: false, timeout: 0, manufacturerData: { 0x5678: List.generate(20, (index) 0x02) }, ); return true; } catch (e) { print(周期广播启动失败$e); return false; } } /// 停止所有广播 static Futurevoid stopAllAdv() async { await FlutterBluePlus.stopAdvertising(); } } /// 业务调用示例 // await FlutterBleAdvManager.startConnectableAdv(); // await FlutterBleAdvManager.startNonConnectableAdv();八、四大广播模式场景选型与参数调优指南1. 精准选型规则设备首次配对、通用搜索连接优先 可连接非定向广播兼容性拉满适配所有设备纯数据上报、低功耗续航优先优先 不可连接广播关闭所有交互极致省电设备绑定、断线快速回连、低延迟重连优先 定向广播一对一专属连接防干扰大数据传输、设备组网、批量同步优先 周期扩展广播突破数据长度限制2. 广播参数调优经验用户交互场景低延迟模式广播间隔100ms以内提升发现成功率后台常驻场景平衡模式间隔500ms~1s兼顾功耗与可用性超低功耗场景低功耗模式间隔2s以上大幅降低耗电重连场景高功率短时定向广播毫秒级唤醒设备九、生产级高频坑点深度解析与解决方案1. 可连接广播常见问题问题后台设备搜不到、多设备连接干扰、功耗过高。解决方案前台低延迟广播后台自动切换低功耗间隔业务层增加设备白名单拦截陌生连接请求。2. 不可连接广播常见问题问题无法被扫描、数据无法扩展、新手误以为功能异常。解决方案该模式协议本身不支持扫描响应无需适配扫描逻辑数据严格控制在31字节内。3. 定向广播致命坑点问题广播1.28秒自动消失、无法携带自定义数据、iOS无原生支持。解决方案定向广播仅用于重连唤醒业务数据连接后透传iOS统一使用「可连接广播连接拦截」模拟定向效果。4. 周期广播兼容坑点问题老旧设备完全无法扫描、部分安卓机型适配失效。解决方案必须做版本判断BLE5.0以下设备自动降级为普通可连接广播保障兼容。5. 跨平台通用坑点广播未手动停止会造成蓝牙模块资源泄漏、后续广播启动失败Android12/iOS13必须申请蓝牙权限否则广播直接失效无报错频繁启停广播会导致蓝牙栈异常需增加启停间隔防抖