如何通过 BLE 100 字节做广告?

How can I advertise via BLE 100 bytes?

如何通过 BLE 100 字节做广告?
SDK >= 26
我能够通告 20 个字节,但是当我通告超过 20 个字节时,我得到一个异常。

我已经阅读了这些文章:
Android: Sending data >20 bytes by BLE

据我了解,提到的链接不是用于广告而是用于 P2P 连接的解决方案,对吗?

我的代码:

     private fun startAdvertising() {
        goForeground()

        Log.d(tag, "Service: Starting Advertising")

        if (mAdvertiseCallback == null) {
            val settings = buildAdvertiseSettings()
            mAdvertiseCallback = SampleAdvertiseCallback()

            if (mBluetoothLeAdvertiser != null) {
                mBluetoothLeAdvertiser!!.startAdvertising(settings, data, mAdvertiseCallback)
            }
        }
    } 

private fun buildAdvertiseData(): AdvertiseData {
        val advertisingData = AdvertiseData.Builder()
        val uuid = BeaconWiliot.manufactureUuid
        advertisingData.addServiceUuid(uuid)
        advertisingData.setIncludeDeviceName(false)
        advertisingData.addServiceData(uuid, ByteArray(20))
        return advertisingData.build()
    }

你不能。

广告包最大长度为31字节。此外,您可以实施扫描响应。
BLE 数据包的 MTU 大小是在连接建立后协商的,与广告大小无关。

此扫描响应类似于广告数据的扩展:
您的设备广播广告。如果扫描设备感兴趣,它可以请求扫描响应。扫描响应可以包含或多或少与广告相同的数据,也可以有 31 个字节。
通常,将数据放入扫描响应会稍慢一些,因为必须发出新请求。从用户的角度来看,这几乎没有什么区别。

总共有 62 个字节。通常这 62 个字节包含数据,例如名称和一些标志,如 "BLE_FLAGS_GENERAL_DISCOVERABLE_MODE"(名称取决于实现)加上一些开销来标记数据的类型和长度。

(顺便说一句:我不知道为什么 31 和通常的数据包 20 字节有效负载...)

当然,您可以在运行时更改广告数据并在每个广告中传输新数据。扫描器会漏掉大部分的广告,所以你可以实现定时重传等等...但这不是广告的意思。

As I right understand, the mentioned links are no solution for advertising but for P2P connections, am I right?

是的。在 P2P 连接中,您可以将数据分段为多个数据包,或者更好地增加 MTU 大小以发送更大的数据块。