我可以通过 BLE 通告长度超过 31 个字节的字符串吗?

问题描述

private fun advertise(tek:String){bluetoothManager.adapter.bluetoothLeAdvertiser
        val advertiser: BluetoothLeAdvertiser=BluetoothAdapter.getDefaultAdapter().bluetoothLeAdvertiser
        val settings = AdvertiseSettings.Builder().setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED).setConnectable(true).setTimeout(0).setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_MEDIUM).build()
        val uuid = UUID.randomUUID()
        val pUuid = ParcelUuid(UUID.fromString(uuid.toString())) 
        val data: AdvertiseData = AdvertiseData
            .Builder()
            .addServiceData(pUuid,tek.toByteArray()).build()


        val advertiseCallback = object: AdvertiseCallback(){
            override fun onStartSuccess(settingsInEffect: AdvertiseSettings){
                Log.d(TAG,"BLE Advertising start")
                super.onStartSuccess(settingsInEffect)
            }

            override fun onStartFailure(errorCode: Int){
                Log.d(TAG,"BLE Advertising onStartFailure: $errorCode")
                super.onStartFailure(errorCode)
            }
        }
        advertiser.startAdvertising(settings,data,advertiseCallback)
        finish()
    }

这是我为通过 BLE 做广告而编写的代码。这里的 tek 数据是一个长度超过 31 个字节的字符串(例如.QUNf4ScRXQ9mJDVI7k5T1THGr7l7Fvpquk4ASMySRn8=)。有什么办法可以通过 BLE 做广告吗?当我尝试在上面的代码上做广告时,它给出了 onStartFailure 代码 :1,这意味着数据太长了。

解决方法

这可以使用 extended Advertisements 来完成,这是 BLE 5.0 中添加的一项功能:

扩展广告:扩展广告是一种宣传比旧版广告允许的更多(卸载)数据的方式。卸载是通过首先在主通道上做广告来完成的,该主通道指向辅助通道上的辅助数据包。

注意:由于非蓝牙 5 设备将无法发现扩展广告,因此建议广告商也使用带有旧版广告 PDU 的广告集,以便较旧的扫描设备能够发现终端设备。广告集用于同时发送不同类型的广告事件。每个广告集都会有不同的广告参数,例如广告PDU类型、广告间隔和PHY。

Bluetooth Core specification(版本 5.2 | 第 6 卷,B 部分 | 4.6.12 LE 扩展广告)指定这会将可能的有效负载增加到 255 字节。

如上面引用所述:如果您需要支持使用 BLE 版本低于 5 的设备,这将不起作用,您必须减小广告负载的大小。