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.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/
发表评论 取消回复