Quảng cáo năng lượng thấp Bluetooth

Bluetooth Low Energy (BLE) tiết kiệm năng lượng bằng cách duy trì ở chế độ ngủ trong hầu hết thời gian. Nó thức dậy chỉ để thực hiện quảng cáo và kết nối ngắn, vì vậy 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.

Tiện ích mở rộng quảng cáo Bluetooth 5

Android 8.0 hỗ trợ Bluetooth 5, cung cấp các cải tiến về phát sóng và quảng cáo dữ liệu linh hoạt cho BLE. Bluetooth 5 hỗ trợ Lớp vật lý BLE (PHY) giúp duy trì mức tiêu thụ điện năng giảm của Bluetooth 4.2 và cho phép người dùng chọn băng thông hoặc phạm vi tăng lên. Bạn có thể tìm thêm thông tin trong Thông số kỹ thuật lõi Bluetooth 5 .

Thực hiện

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 có bộ điều khiển Bluetooth tương thích. Sử dụng các phương pháp BluetoothAdapter này để 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 nhà cung cấp chip Bluetooth để tắt hỗ trợ bộ chip.

Các PHY Bluetooth độc quyền với nhau và hoạt động của mỗi PHY được xác định trước bởi Bluetooth SIG. Theo mặc định, Android 8.0 sử dụng Bluetooth LE 1M PHY, từ Bluetooth 4.2. Gói android.bluetooth.le hiển thị các tính năng quảng cáo Bluetooth 5 thông qua các API sau:

  • AdvertisingSet
  • AdvertisingSetCallback
  • AdvertisingSetParameters
  • PeriodicAdvertisingParameters

Tạo một AdvertisingSet để sửa đổi cài đặt quảng cáo Bluetooth bằng cách sử dụng phương thức 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 nó bị vô hiệu hóa, các tính năng API cũng có thể áp dụng cho LE 1M PHY.

Ví dụ

Ứng dụng ví dụ này sử dụng Bluetooth LE 1M PHY để 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 để quảng cáo. Trước tiên, ứng dụng sẽ kiểm tra xem thiết bị có hỗ trợ các tính năng đang được sử dụng hay khô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àm PHY chính. Khi 2M PHY đang hoạt động, quảng cáo không hỗ trợ bộ điều khiển Bluetooth 4.x, do đó setLegacyMode được đặt thành false . Ví dụ này sửa đổi các tham 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ử nghiệm sản phẩm Bluetooth hiện hành để xác minh khả năng tương thích của thiết bị với Bluetooth 5.

AOSP chứa Bộ kiểm tra Android Comms (ACTS), bao gồm các bài kiểm tra cho Bluetooth 5. Bạn có thể tìm thấy các bài kiểm tra ACTS cho Bluetooth 5 trong tools/test/connectivity/acts/tests/google/ble/bt5 .