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

Posted

技术标签:

【中文标题】我可以通过 BLE 宣传长度超过 31 个字节的字符串吗?【英文标题】:Can I advertise string that is longer than 31 bytes through BLE? 【发布时间】:2021-06-27 14:53:02 【问题描述】:
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,这意味着数据太长了。

【问题讨论】:

如果您不能像 M. Kotzjan 建议的那样使用扩展广告,那么另一种解决方案是将广告分成两部分并添加序列号。换句话说,您将按如下方式宣传上述数据:- (12QUNf4ScRXQ9mJDVI7k5T1THGr7l7F) 和 (22vpquk4ASMySRn8=)。第一个数字 (1) 是数据的序列,第二个数字 (2) 是该数据中的数据包总数。然后扫描设备可以在读取两个广告时将信息拼凑在一起。 我应该怎么做?我可以分割数据然后重复广播吗?但如果我这样做,它会给出 onStartFailure: 3,这意味着广告已经开始。 您必须停止正在进行的广告,然后使用更新的数据开始新的广告。 由于我的数据大约 44 字节,我试图分成 5 个字符串。我应该为每个字符串数据设置广告时间并停止广告吗? 为什么是 5 个字符串?您只需使用 2 个字符串即可完成您想要的操作。在任何情况下,即使您分成 5 个字符串,那么是的,您需要停止并开始为每个字符串做广告 - 可能有一个 1 或 2 秒的计时器,它会在计时器到期时发送一个新字符串。如果您发现这对您不起作用,那么通过广告发送数据可能不是最合适的选择,您必须改用 GATT 交换。请查看此答案以获取更多信息:-***.com/a/65645550/2215147 【参考方案1】:

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

扩展广告:扩展广告是一种宣传更多(卸载)数据的方式,而不是传统广告所允许的数据。卸载是通过首先在主要通道上发布指向辅助通道上的辅助数据包的广告来完成的。

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

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

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

【讨论】:

以上是关于我可以通过 BLE 宣传长度超过 31 个字节的字符串吗?的主要内容,如果未能解决你的问题,请参考以下文章

蓝牙 LE 的最大数据包长度?

android蓝牙BLE(三) —— 广播

BluetoothGattServer.sendResponse 中的数据长度不能超过 20 字节。 (低功耗蓝牙)

iOS 会保证完整交付 BLE 特征值吗? [关闭]

遍历字节数组以解析出各个长度

js判断输入字符串长度(汉字算两个字符,字母数字算一个):例如 要求输入12的字,24个字节