Bluetooth (BLE) デバイスをスキャンする

Recipe ID: hw-004

tauri-plugin-blec を使用して、周囲の BLE デバイスをスキャンする方法です。このプラグインはクロスプラットフォームな BLE クライアントを提供します。

前提条件

1. Rust 側のプラグインインストール

src-tauri ディレクトリに移動して、以下のコマンドを実行します。

cargo add tauri-plugin-blec

2. フロントエンド側のパッケージインストール

プロジェクトのルートディレクトリで以下のコマンドを実行します。

npm add @mnlphlp/plugin-blec

3. プラグインの登録

src-tauri/src/lib.rs にプラグインを登録します。

tauri::Builder::default()
    .plugin(tauri_plugin_blec::init())
    .run(tauri::generate_context!())
    .expect("error while running tauri application");

4. Permissions(権限)の設定

src-tauri/capabilities/default.json に以下の権限を追加します。

{
  "permissions": [
    ...,
    "blec:default"
  ]
}

1. 基本的なスキャンの実行

フロントエンド(TypeScript)から BLE デバイスのスキャンを実行します。

import { startScan, stopScan, type BleDevice } from '@mnlphlp/plugin-blec';

// 発見されたデバイスを保持する配列
let devices: BleDevice[] = [];

// スキャンを開始(タイムアウト: 10秒)
async function scanForDevices() {
  devices = [];
  
  await startScan(
    (foundDevices) => {
      // スキャン中にデバイスが発見されるたびに呼ばれる
      devices = foundDevices;
      console.log('発見されたデバイス:', devices);
    },
    10000  // タイムアウト(ミリ秒)
  );
}

// スキャンを手動で停止
async function cancelScan() {
  await stopScan();
}

2. BleDevice の構造

startScan で取得できる BleDevice オブジェクトには以下の情報が含まれます。

プロパティ名説明
addressstringデバイスのアドレス(MAC アドレスまたは UUID)
namestringデバイスの表示名
rssinumber受信信号強度(dBm)。値が大きいほど近い
isConnectedboolean現在接続中かどうか
isBondedbooleanペアリング済みかどうか
servicesstring[]アドバタイズしているサービス UUID の配列
manufacturerDataRecord<number, number[]>メーカー固有データ(キー: 企業ID)
serviceDataRecord<string, number[]>サービス固有データ(キー: サービスUUID)

3. スキャン状態の監視

スキャン中かどうかを監視することもできます。

import { getScanningUpdates } from '@mnlphlp/plugin-blec';

// スキャン状態が変わるたびに呼ばれる
getScanningUpdates((isScanning) => {
  console.log('スキャン中:', isScanning);
});

4. 権限の確認

BLE を使用するには OS からの権限が必要です。権限が付与されているかを確認できます。

import { checkPermissions } from '@mnlphlp/plugin-blec';

async function ensurePermissions() {
  // askIfDenied: true の場合、権限がなければユーザーに許可を求める
  const granted = await checkPermissions(true);
  
  if (!granted) {
    console.error('Bluetooth の権限が付与されていません');
    return false;
  }
  return true;
}

注意点

  • スキャン結果はリアルタイムで更新されるため、UI を適切に更新するようにしてください。