2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Brilloのbluetoothtbdとbluetooth-cliを読む

Posted at

Brilloのbluetoothtbd とbluetooth-cli についてちょっと調べてみました。

BrilloではAndroid由来のBluetoothプロトコルスタック Fluoride (system/bt)を採用しています。

ただし、AndroidとはAPIが異なります。
AndroidではAndroid Bluetooth HAL(libhardware)をwrapper経由 (core/java/android/bluetooth/)で使っていますが、
Brilloではcppで実装したBinder APIを用います。

ソース

bluetoothtbd

  • Brilloではbluetoothtbdというデーモンがbluetoothプロトコルスタックの本体です。
  • bluetoothtbdのメインのソースは service/main.cc にあります。 このソースでプロトコルスタックのメインループを起動しています。
main.cc
  if (!bluetooth::Daemon::Initialize()) {
    LOG(ERROR) << "Failed to initialize Daemon";
    return EXIT_FAILURE;
  }
  // Start the main event loop.
  bluetooth::Daemon::Get()->StartMainLoop();

Brilloのbluetooth API

  • APIは、service/common/android/bluetooth のAIDLからヘッダファイルを生成して使います。
  • Bluetoothの起動・停止などを行うIBluetooth.aidl
IBluetooth.aidl
package android.bluetooth;
import android.bluetooth.IBluetoothCallback;
import android.bluetooth.IBluetoothLowEnergy;
import android.bluetooth.IBluetoothGattClient;
import android.bluetooth.IBluetoothGattServer;
import android.bluetooth.UUID;
interface IBluetooth {
  boolean IsEnabled();
  int GetState();
  boolean Enable(boolean startRestricted);
  boolean EnableNoAutoConnect();
  boolean Disable();
  String GetAddress();
  UUID[] GetUUIDs();
  boolean SetName(String name);
  String GetName();
  void RegisterCallback(IBluetoothCallback callback);
  void UnregisterCallback(IBluetoothCallback callback);
  boolean IsMultiAdvertisementSupported();
  IBluetoothLowEnergy GetLowEnergyInterface();
  IBluetoothGattClient GetGattClientInterface();
  IBluetoothGattServer GetGattServerInterface();
}

bluetooth-cli

  • APIのサンプルとして、bluetooh-cli というツールが提供されています。
  • bluetooth-cli のソースは service/client/main.cc にあります。
  • 現時点ではBLEのアドバタイズ、BLEの接続などをコマンドで行うことができます。
# bluetooth-cli                                                                                                                                                                                                   
Fluoride Command-Line Interface

Type "help" to see possible commands.

[FCLI] help

	help			Display this message
	disable			Disable Bluetooth
	enable			Enable Bluetooth
	get-state		Get the current adapter state
	is-enabled		Return if Bluetooth is enabled
	get-local-address	Get the local adapter address
	set-local-name		Set the local adapter name
	get-local-name		Get the local adapter name
	adapter-info		Print adapter properties
	supports-multi-adv	Whether multi-advertisement is currently supported
	register-ble		Register with the Bluetooth Low Energy interface
	unregister-ble		Unregister from the Bluetooth Low Energy interface
	unregister-all-ble	Unregister all clients from the Bluetooth Low Energy interface
	register-gatt		Register with the Bluetooth GATT Client interface
	unregister-gatt		Unregister from the Bluetooth GATT Client interface
	connect-le		Connect to LE device (-h for options)
	disconnect-le		Disconnect LE device (-h for options)
	set-mtu		Set MTU (-h for options)
	start-adv		Start advertising (-h for options)
	stop-adv		Stop advertising
	start-le-scan		Start LE device scan (-h for options)
	stop-le-scan		Stop LE device scan
  • ソースコードを少し見てみました。
  • bt_ifaceの取得
  sp<IBluetooth> bt_iface;
  status_t status = getService(String16(kServiceName.c_str()), &bt_iface);
  • コールバックの登録
  // Register Adapter state-change callback
  sp<CLIBluetoothCallback> callback = new CLIBluetoothCallback();
  bt_iface->RegisterCallback(callback);
  • Bluetooth起動
  bool status;
  bt_iface->Enable(is_restricted_mode, &status);
  • BDアドレスの取得
  String16 address;
  bt_iface->GetAddress(&address);
  PrintFieldAndValue("\tAddress", std::string(String8(address).string()));
  • アドバタイズの開始
  base::TimeDelta timeout;
  bluetooth::AdvertiseSettings settings(
      bluetooth::AdvertiseSettings::MODE_LOW_POWER, timeout,
      bluetooth::AdvertiseSettings::TX_POWER_LEVEL_MEDIUM, connectable);
  bluetooth::AdvertiseData adv_data(data);
  adv_data.set_include_device_name(include_name);
  adv_data.set_include_tx_power_level(include_tx_power);
  bluetooth::AdvertiseData scan_rsp;
  bool status;
  ble_iface->StartMultiAdvertising(ble_client_id.load(), adv_data, scan_rsp,
                                   settings, &status);
  • Android Bluetooth HALに比べて、callbackがclass化されているので見通しが良くなっている気がします。
  • Brilloが正式にリリースされる際には、BluetoothのBinder APIがドキュメント化されるのを期待します。
2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?