Bluetooth năng lượng thấp (BLE) tiết kiệm pin bằng cách tiếp tục ở chế độ ngủ hầu như mọi lúc. Trình quản lý thẻ của Google chỉ bật để tạo quảng cáo và do đó, quảng cáo ảnh hưởng đến cả mức tiêu thụ điện năng và băng thông truyền dữ liệu.
Phần mở rộng quảng cáo Bluetooth 5
Android 8.0 hỗ trợ Bluetooth 5, cung cấp tính năng truyền phát các điểm cải tiến và quảng cáo dữ liệu linh hoạt cho BLE. Bluetooth 5 hỗ trợ BLE Lớp (PHY) giữ lại giảm mức tiêu thụ điện năng của Bluetooth 4.2 và cho phép người dùng lựa chọn tăng băng thông hoặc phạm vi. Bạn có thể xem thêm thông tin trong Thông số kỹ thuật Bluetooth 5 Core.
Triển khai
Các tính năng Bluetooth 5 mới tự động có sẵn cho các thiết bị
chạy Android 8.0 với bộ điều khiển Bluetooth tương thích. Sử dụng
BluetoothAdapter
để kiểm tra xem thiết bị có hỗ trợ các tính năng Bluetooth 5 hay không:
isLe2MPhySupported()
isLeCodedPhySupported()
isLeExtendedAdvertisingSupported()
isLePeriodicAdvertisingSupported()
Để tắt các tính năng quảng cáo, hãy làm việc với chip Bluetooth tắt tính năng hỗ trợ bộ chip.
PHY Bluetooth độc quyền với nhau và hành vi của
mỗi PHY là do Bluetooth SIG xác định trước. Theo mặc định, Android 8.0
sử dụng Bluetooth LE 1M PHY, từ Bluetooth 4.2. Chiến lược phát hành đĩa đơn
android.bluetooth.le
gói này cung cấp các tính năng quảng cáo Bluetooth 5 thông qua
API:
AdvertisingSet
AdvertisingSetCallback
AdvertisingSetParameters
PeriodicAdvertisingParameters
Tạo một
AdvertisingSet
sửa đổi chế độ cài đặt quảng cáo qua Bluetooth bằng cách sử dụng startAdvertisingSet()
trong
android.bluetooth.le.BluetoothLeAdvertiser
. Ngay cả khi
hỗ trợ Bluetooth 5 hoặc các tính năng quảng cáo của Bluetooth 5 bị tắt,
Các tính năng API cũng có thể áp dụng cho LE 1M PHY.
Ví dụ
Ứng dụng mẫu này sử dụng Bluetooth LE 1M PHY cho quảng cáo:
// Start legacy advertising. Works for devices with 5.x controllers, // and devices that support multi-advertising. void example1() { BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser(); AdvertisingSetParameters parameters = (new AdvertisingSetParameters.Builder()) .setLegacyMode(true) // True by default, but set here as a reminder. .setConnectable(true) .setInterval(AdvertisingSetParameters.INTERVAL_HIGH) .setTxPowerLevel(AdvertisingSetParameters.TX_POWER_MEDIUM) .build(); AdvertiseData data = (new AdvertiseData.Builder()).setIncludeDeviceName(true).build(); AdvertisingSetCallback callback = new AdvertisingSetCallback() { @Override public void onAdvertisingSetStarted(AdvertisingSet advertisingSet, int txPower, int status) { Log.i(LOG_TAG, "onAdvertisingSetStarted(): txPower:" + txPower + " , status: " + status); currentAdvertisingSet = advertisingSet; } @Override public void onAdvertisingDataSet(AdvertisingSet advertisingSet, int status) { Log.i(LOG_TAG, "onAdvertisingDataSet() :status:" + status); } @Override public void onScanResponseDataSet(AdvertisingSet advertisingSet, int status) { Log.i(LOG_TAG, "onScanResponseDataSet(): status:" + status); } @Override public void onAdvertisingSetStopped(AdvertisingSet advertisingSet) { Log.i(LOG_TAG, "onAdvertisingSetStopped():"); } }; advertiser.startAdvertisingSet(parameters, data, null, null, null, callback); // After onAdvertisingSetStarted callback is called, you can modify the // advertising data and scan response data: currentAdvertisingSet.setAdvertisingData(new AdvertiseData.Builder(). setIncludeDeviceName(true).setIncludeTxPowerLevel(true).build()); // Wait for onAdvertisingDataSet callback... currentAdvertisingSet.setScanResponseData(new AdvertiseData.Builder().addServiceUuid(new ParcelUuid(UUID.randomUUID())).build()); // Wait for onScanResponseDataSet callback... // When done with the advertising: advertiser.stopAdvertisingSet(callback); }
Ứng dụng ví dụ này sử dụng BLE 2M PHY cho mục đích quảng cáo. Ứng dụng trước tiên
kiểm tra để đảm bảo rằng thiết bị hỗ trợ các tính năng đang được sử dụng. Nếu
các tính năng quảng cáo được hỗ trợ, thì ứng dụng sẽ định cấu hình BLE 2M
PHY là PHY chính. Khi 2 triệu PHY đang hoạt động, quảng cáo thì hoạt động
không hỗ trợ bộ điều khiển Bluetooth 4.x, vì vậy setLegacyMode
được đặt thành false
. Ví dụ này sửa đổi các thông số trong khi
quảng cáo và cũng tạm dừng quảng cáo.
void example2() { BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); BluetoothLeAdvertiser advertiser = BluetoothAdapter.getDefaultAdapter().getBluetoothLeAdvertiser(); // Check if all features are supported if (!adapter.isLe2MPhySupported()) { Log.e(LOG_TAG, "2M PHY not supported!"); return; } if (!adapter.isLeExtendedAdvertisingSupported()) { Log.e(LOG_TAG, "LE Extended Advertising not supported!"); return; } int maxDataLength = adapter.getLeMaximumAdvertisingDataLength(); AdvertisingSetParameters.Builder parameters = (new AdvertisingSetParameters.Builder()) .setLegacyMode(false) .setInterval(AdvertisingSetParameters.INTERVAL_HIGH) .setTxPowerLevel(AdvertisingSetParameters.TX_POWER_MEDIUM) .setPrimaryPhy(BluetoothDevice.PHY_LE_1M) .setSecondaryPhy(BluetoothDevice.PHY_LE_2M); AdvertiseData data = (new AdvertiseData.Builder()).addServiceData(new ParcelUuid(UUID.randomUUID()), "You should be able to fit large amounts of data up to maxDataLength. This goes up to 1650 bytes. For legacy advertising this would not work".getBytes()).build(); AdvertisingSetCallback callback = new AdvertisingSetCallback() { @Override public void onAdvertisingSetStarted(AdvertisingSet advertisingSet, int txPower, int status) { Log.i(LOG_TAG, "onAdvertisingSetStarted(): txPower:" + txPower + " , status: " + status); currentAdvertisingSet = advertisingSet; } @Override public void onAdvertisingSetStopped(AdvertisingSet advertisingSet) { Log.i(LOG_TAG, "onAdvertisingSetStopped():"); } }; advertiser.startAdvertisingSet(parameters.build(), data, null, null, null, callback); // After the set starts, you can modify the data and parameters of currentAdvertisingSet. currentAdvertisingSet.setAdvertisingData((new AdvertiseData.Builder()).addServiceData(new ParcelUuid(UUID.randomUUID()), "Without disabling the advertiser first, you can set the data, if new data is less than 251 bytes long.".getBytes()).build()); // Wait for onAdvertisingDataSet callback... // Can also stop and restart the advertising currentAdvertisingSet.enableAdvertising(false, 0, 0); // Wait for onAdvertisingEnabled callback... currentAdvertisingSet.enableAdvertising(true, 0, 0); // Wait for onAdvertisingEnabled callback... // Or modify the parameters - i.e. lower the tx power currentAdvertisingSet.enableAdvertising(false, 0, 0); // Wait for onAdvertisingEnabled callback... currentAdvertisingSet.setAdvertisingParameters(parameters.setTxPowerLevel (AdvertisingSetParameters.TX_POWER_LOW).build()); // Wait for onAdvertisingParametersUpdated callback... currentAdvertisingSet.enableAdvertising(true, 0, 0); // Wait for onAdvertisingEnabled callback... // When done with the advertising: advertiser.stopAdvertisingSet(callback); }
Xác minh
Chạy thích hợp Kiểm tra sản phẩm Bluetooth để xác minh khả năng tương thích của thiết bị với Bluetooth 5.