亲爱的读者,大家好,相信很多人对android蓝牙BLE —— 广播和蓝牙 le 广播数据是什么意思都不是特别了解,因此今天我来为大家分享一些关于android蓝牙BLE —— 广播和蓝牙 le 广播数据是什么意思的知识,希望能够帮助大家解决一些困惑。

本文目录一览

android蓝牙BLE(三) —— 广播

​在蓝牙开发中,有些情况是不需要连接的,只要外设广播自己的数据即可,例如苹果的ibeacon。自Android5.0更新蓝牙API后,手机可以作为外设广播数据。

广播包有两种:

其中广播包是每个外设都必须广播的,而响应包是可选的。每个广播包的长度必须是31个字节,如果不到31个字节,则剩下的全用0填充补全,这部分的数据是无效的

广播包中包含若干个广播数据单元,广播数据单元也称为ADStructure。

广播数据单元=长度值Length+ADtype+ADData。

长度值Length只占一个字节,并且位于广播数据单元的第一个字节。

概念的东西有些抽象,先看看下面的广播报文:

​0x代表这串字符串是十六进制的字符串。两位十六进制数代表一个字节。因为两个字符组成的十六进制字符串最大为FF,即255,而Java中byte类型的取值范围是-128到127,刚好可以表示一个255的大小。所以两个十六进制的字符串表示一个字节。

​继续查看报文内容,开始读取第一个广播数据单元。读取第一个字节:0x07,转换为十进制就是7,即表示后面的7个字节是这个广播数据单元的数据内容。超过这7个字节的数据内容后,表示是一个新的广播数据单元。

​而第二个广播数据单元,第一个字节的值是0x16,转换为十进制就是22,表示后面22个字节为第二个广播数据单元。

​在广播数据单元的数据部分中,第一个字节代表数据类型(ADtype),决定数据部分表示的是什么数据。(即广播数据单元第二个字节为ADtype)

ADType的类型如下:

​这bit1~7分别代表着发送该广播的蓝牙芯片的物理连接状态。当bit的值为1时,表示支持该功能。
例:

蓝牙广播的数据格式大致讲了一下,有助于下面的广播操作的理解。

先看看广播设置(AdvertiseSettings)如何定义:

(1)、通过AdvertiseSettings.Builder#setAdvertiseMode()设置广播模式。其中有3种模式:

(2)、通过AdvertiseSettings.Builder#setAdvertiseMode()设置广播发射功率。共有4种功率模式:

(3)、通过AdvertiseSettings.Builder#setTimeout()设置持续广播的时间,单位为毫秒。最多180000毫秒。当值为0则无时间限制,持续广播,除非调用BluetoothLeAdvertiser#stopAdvertising()停止广播。

(4)、通过AdvertiseSettings.Builder#setConnectable()设置该广播是否可以连接的。

之前说过,外设必须广播广播包,扫描包是可选。但添加扫描包也意味着广播更多得数据,即可广播62个字节。

可见无论是广播包还是扫描包,其广播的内容都是用AdvertiseData类封装的。

(1)、AdvertiseData.Builder#setIncludeDeviceName()方法,可以设置广播包中是否包含蓝牙的名称。

(2)、AdvertiseData.Builder#setIncludeTxPowerLevel()方法,可以设置广播包中是否包含蓝牙的发射功率。

(3)、AdvertiseData.Builder#addServiceUUID(ParcelUUID)方法,可以设置特定的UUID在广播包中。

(4)、AdvertiseData.Builder#addServiceData(ParcelUUID,byte[])方法,可以设置特定的UUID和其数据在广播包中。

(5)、AdvertiseData.Builder#addManufacturerData(int,byte[])方法,可以设置特定厂商Id和其数据在广播包中。

​从AdvertiseData.Builder的设置中可以看出,如果一个外设需要在不连接的情况下对外广播数据,其数据可以存储在UUID对应的数据中,也可以存储在厂商数据中。但由于厂商ID是需要由BluetoothSIG进行分配的,厂商间一般都将数据设置在厂商数据。

另外可以通过BluetoothAdapter#setName()设置广播的名称

先看一个例子,我们分别在广播包和扫描包中设置AdvertiseData.Builder的每一种广播报文参数,得到一下报文内容:

(1)、Type=0x01表示设备LE物理连接。

(2)、Type=0x09表示设备的全名

(3)、Type=0x03表示完整的16bitUUID。其值为0xFFF7。

(4)、Type=0xFF表示厂商数据。前两个字节表示厂商ID,即厂商ID为0x11。后面的为厂商数据,具体由用户自行定义。

(5)、Type=0x16表示16bitUUID的数据,所以前两个字节为UUID,即UUID为0xF117,后续为UUID对应的数据,具体由用户自行定义。

最后继承AdvertiseCallback自定义广播回调。

初始化完毕上面的对象后,就可以进行广播:

​广播主要是通过BluetoothLeAdvertiser#startAdvertising()方法实现,但在之前需要先获取BluetoothLeAdvertiser对象。

BluetoothLeAdvertiser对象存在两个情况获取为Null:

所以在调用BluetoothAdapter#getBluetoothLeAdvertiser()前,需要先调用判断蓝牙已开启,并判断在BluetoothAdapter中获取的BluetoothLeAdvertiser是否为空(测试过某些华为手机mBluetoothAdapter.isMultipleAdvertisementSupported()为false,但是能发送ble广播)。

​与广播成对出现就是BluetoothLeAdvertiser.stopAdvertising()停止广播了,传入开启广播时传递的广播回调对象,即可关闭广播:

​虽然通过广播告知外边自身拥有这些Service,但手机自身并没有初始化Gattd的Service。导致外部的中心设备连接手机后,并不能找到对应的GATTService和获取对应的数据。

Service类型有两个级别:

创建BluetoothGattService时,传入两个参数:UUID和Service类型:

​我们都知道Gatt中,Service的下一级是Characteristic,Characteristic是最小的通信单元,通过对Characteristic进行读写操作来进行通信。

​特征属性表示该BluetoothGattCharacteristic拥有什么功能,即能对BluetoothGattCharacteristic进行什么操作。其中主要有3种:

权限属性用于配置该特征值所具有的功能。主要两种:

Characteristic下还有Descriptor,初始化BluetoothGattDescriptor时传入:DescriptorUUID和权限属性

为Service添加Characteristic,为Characteristic添加Descriptor:

​通过蓝牙管理器mBluetoothManager获取GattServer,用来添加GattService。添加完GattService后,外部中心设备连接手机时,将能获取到对应的GATTService和获取对应的数据

​定义GattServer回调。当中心设备连接该手机外设、修改特征值、读取特征值等情况时,会得到相应情况的回调。

最后开启广播后,用nRF连接后看到的特征值信息如下图所示:(加多了一个只能都的特征值)

android蓝牙BLE(一)——扫描

android蓝牙BLE(二)——通信

android蓝牙BLE(三)——广播

android蓝牙BLE(四)——实战

返回目录

蓝牙 le 广播数据是什么意思

①目的:如果说蓝牙4.0主打的是省电特性的话,那么此次升级蓝牙4.1应当是IOT(全联网),也就是把所有设备都联网的意思,改善数据传输,迎合可穿戴设备需求。
②传输速率:蓝牙4.1在蓝牙4.0LE基础上进行了升级,使得批量数据可以以更高的速率传输。但是也只是相对提高那么一丢丢而已!

角色:蓝牙4.0LE的设备角色早就被安排好了为逗BluetoothSmart地和逗BluetoothSmart
Ready地;而在蓝牙4.1中,就允许设备同时充当逗BluetoothSmart地和逗BluetoothSmart
Ready地两个角色的功能,这就意味着能够让多款设备连接到一个蓝牙设备上。这样玩起来就有意思多了!
④上网:穿戴设备上网不易的问题,也可以通过蓝牙4.1进行解决。估计还需要一个过程!
⑤连接:两款带有蓝牙4.1的设备之前已经成功配对,重新连接时只要将这两款设备靠近,即可实现重新连接,完全不需要任何手动操作。
⑥兼容性:蓝牙4.1不仅可以向下兼容蓝牙4.0,更重要的是对现有的蓝牙4.0设备来说,不需要更换芯片,只需要升级固件就可以升级到蓝牙4.1。老用户不用花钱就能升级呀!

返回目录

总结:以上就是本站针对你的问题搜集整理的答案,希望对你有所帮助。如果您想更深入地了解相关内容,可以查看文章下方的相关链接。