BLE蓝牙的广播类型

BLE(Bluetooth Low Energy)是一种低功耗蓝牙技术,可以通过广播和连接传输数据。BLE广播是无需建立连接即可向周围设备发送信息的一种通信方式。本文将对BLE蓝牙的广播类型进行详细介绍,并介绍BLE广播的使用方法和案例说明。

BLE蓝牙的广播类型:

1. Connectable undirected advertising(可连接未定向广告)

如果设备想要建立一个BLE连接,就会发送这种类型的广播。这种广播的作用是发送设备的地址以及一些其他信息,如设备名称、服务UUID以及制造商数据等。

2. Connectable directed advertising(可连接定向广告)

这种类型的广播是向特定的设备发送连接请求,只有当接收方设备与发送方设备地址匹配时才会连接。这种广播需要指定接收方设备地址和发送方设备地址,因此是一种主动发起连接的广播方式。

3. Non-connectable undirected advertising(非连接未定向广告)

这种类型的广播是用于发送不需要连接的广告,例如一些传感器设备的数据信息。这种广播消息中一般包含了设备地址、信号强度等信息,但不需要连接到其他设备。

4. Scan request(扫描请求)

扫描请求是用于请求走光某一广播数据的设备信息。该设备会发出一个请求信号,询问某个广播信号的设备是否在附近发送广播。

5. Scan response(扫描响应)

当设备接收到扫描请求时,它可以选择发送扫描响应。这种类型的广播包含了一些有关设备的信息。

BLE广播的使用方法:

1. 获取广播数据

要获取BLE广播数据,需要注册一个广播监听器,并覆盖onScanResult()回调方法,扫描结果会从这里返回。在回调方法中,扫描结果的行为因数据类型和处理方法而异。对于定向广播,可使用startScan()方法在扫描结果时进行设置。

2. 解析广播数据

BLE广播数据可以包含运输协议的UUID、服务UUID、制造商数据、信号强度等信息。为检索这些信息,需要解析广播数据。解析可以通过一些解析工具类诸如BLEUtils等。

3. 发送BLE广播

发送BLE广播需要创建BluetoothLeAdvertiser实例,它是所有BLE广播的核心。可以使用BluetoothLeAdvertiser构建可连接和非连接的广播,然后将广播发送到周围设备。发送BLE广播的方法之一是使用startAdvertising()方法。如果启用了手动连接,还需要在AdvertisingCallback中创建相应的连接回调。

BLE广播的案例说明:

假设我们想要将iBeacon发送给附近的设备,如何实现呢?在这个案例中,我们将发送一个非连接的未定向广播,作为iBeacon服务。

1. 准备iBeacon数据

iBeacon数据是一种特殊格式的BLE广播,需要包含三个元素——UUID、Major和Minor。您可以使用iBeacon Builder工具类创建iBeacon数据,如下所示:

private static final String UUID = "2f234454-cf6d-4a0f-adf2-f4911ba9ffa6";

private static final int MAJOR = 1;

private static final int MINOR = 1;

private static final int TX_POWER = -59;

private static final AdvertiseData ADVERTISE_DATA =

new AdvertiseData.Builder()

.setIncludeDeviceName(false)

.addManufacturerData(0x01, new byte[]{0x01, 0x02, 0x03, 0x04, 0x05})

.addManufacturerData(0x0118, new byte[]{0x0a, 0x0b})

.addServiceUuid(new ParcelUuid(UUID))

.setTxPowerLevel(TX_POWER)

.build();

2. 发送iBeacon数据

接下来,我们需要创建一个广告对象,并使用startAdvertisting()方法将广告对象广播到附近的设备中,如下所示:

private BluetoothLeAdvertiser advertiser;

private AdvertiseCallback advertiseCallback = new AdvertiseCallback() {

@Override

public void onStartSuccess(AdvertiseSettings settingsInEffect) {

Toast.makeText(getApplicationContext(), "Advertising start success!", Toast.LENGTH_SHORT).show();

}

@Override

public void onStartFailure(int errorCode) {

Toast.makeText(getApplicationContext(), "Advertising start failure : "+errorCode, Toast.LENGTH_SHORT).show();

}

};

private void sendiBeacon() {

if (advertiser == null) {

advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser();

}

if (advertiser != null) {

AdvertiseSettings settings = new AdvertiseSettings.Builder()

.setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)

.setConnectable(false)

.setTimeout(0)

.setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)

.build();

advertiser.startAdvertising(settings,ADVERTISE_DATA,advertiseCallback);

}

}

3. 接收iBeacon数据

要接收来自附近iBeacon设备的广播数据,需要实现BLE扫描回调方法,并使用startScan()来在扫描时启用iBeacon过滤器,如下所示:

private BluetoothLeScanner bleScanner;

private ScanCallback scanCallback = new ScanCallback() {

@Override

public void onScanResult(int callbackType, ScanResult result) {

BluetoothDevice device = result.getDevice();

byte[] scanRecord = result.getScanRecord().getBytes();

parseIBeacon(scanRecord);

}

};

private void receiveiBeacon() {

if (bleScanner == null) {

bleScanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner();

}

if (bleScanner != null) {

ScanFilter.Builder scanFilterBuilder = new ScanFilter.Builder();

scanFilterBuilder.setServiceUuid(new ParcelUuid(UUID));

List filters = new ArrayList<>();

filters.add(scanFilterBuilder.build());

ScanSettings.Builder settingsBuilder = new ScanSettings.Builder();

settingsBuilder.setScanMode(ScanSettings.SCAN_MODE_LOW_LATENCY);

bleScanner.startScan(filters, settingsBuilder.build(), scanCallback);

}

}

private void parseIBeacon(byte[] scanRecord) {

if (scanRecord[5] == (byte) 0x4c && scanRecord[6] == (byte) 0x00 && scanRecord[7] == (byte) 0x02 && scanRecord[8] == (byte) 0x15) {

String uuid = bytes2HexString(Arrays.copyOfRange(scanRecord, 9, 25)).replaceAll("(\\w{8})(\\w{4})(\\w{4})(\\w{4})(\\w{12})", "$1-$2-$3-$4-$5");

int major = (scanRecord[25] & 0xff) * 0x100 + (scanRecord[26] & 0xff);

int minor = (scanRecord[27] & 0xff) * 0x100 + (scanRecord[28] & 0xff);

if (uuid.equals(UUID)) {

Log.d("IBeaconDemo", "iBeacon found: UUID = " + uuid +

", major = " + major +

", minor = " + minor );

}

}

}

这是一个简单的例子,说明了如何使用Android BLE API的扫描功能接收iBeacon广播数据。我们创建了一个IBeacon Builder类来生成iBeacon广播数据,然后使用BluetoothLeAdvertiser.startAdvertising()方法进行广播。当我们扫描时,我们将UUID添加到ScanFilter中,以便只接收特定UUID的广播。最后,在扫描结果回调中,我们解析iBeacon数据,如果接收到的UUID与我们在广播中使用的UUID匹配,则将其记录到日志中。

总结:

本文介绍了BLE蓝牙广播类型,包括连接未定向广告、连接定向广告、非连接未定向广告、扫描请求和扫描响应。我们还介绍了使用BLE广播的方法,并提供了一个iBeacon广播的案例说明,该案例说明了如何在Android应用程序中使用BLE API发送和接收iBeacon广播。在使用BLE广播时,应注意限制广告时间并保守使用广告方法,以便防止耗电。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(34) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部