FlutterでBLE接続する方法

Flutterでflutter_blue_plusを使用してBLEデバイスに接続する方法を説明します。以下は、BLEデバイスをスキャンし、接続し、サービスやキャラクタリスティックを取得する手順です。


1. パッケージの追加

flutter_blue_plusパッケージをに追加します。

dependencies:
  flutter_blue_plus: ^1.0.0  # 最新バージョンを確認して追加

 


2. BLEデバイスのスキャンと接続

以下は、BLEデバイスをスキャンし、接続するコード例です。

import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BleClientScreen(),
    );
  }
}

class BleClientScreen extends StatefulWidget {
  
  _BleClientScreenState createState() => _BleClientScreenState();
}

class _BleClientScreenState extends State<BleClientScreen> {
  FlutterBluePlus flutterBlue = FlutterBluePlus();//.instance;
  BluetoothDevice? connectedDevice;
  List<BluetoothService> services = [];
  String status = "Scanning...";

  
  void initState() {
    super.initState();
    startScan();
  }

  void startScan() {
    flutterBlue.startScan(timeout: Duration(seconds: 4));
    flutterBlue.scanResults.listen((results) {
      for (ScanResult result in results) {
        if (result.device.name == "AQUA-FAN-BLE") { // デバイス名を指定
          stopScan();
          connectToDevice(result.device);
          break;
        }
      }
    });
  }

  void stopScan() {
    flutterBlue.stopScan();
  }

  void connectToDevice(BluetoothDevice device) async {
    setState(() {
      status = "Connecting...";
    });

    await device.connect();
    setState(() {
      connectedDevice = device;
      status = "Connected";
    });

    discoverServices(device);
  }

  void discoverServices(BluetoothDevice device) async {
    List<BluetoothService> services = await device.discoverServices();
    setState(() {
      this.services = services;
    });

    for (BluetoothService service in services) {
      print("Service UUID: ${service.uuid}");
      for (BluetoothCharacteristic characteristic in service.characteristics) {
        print("Characteristic UUID: ${characteristic.uuid}");
      }
    }
  }

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('BLE Client'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text("Status: $status"),
            if (connectedDevice != null) Text("Connected to: ${connectedDevice!.name}"),
            if (services.isNotEmpty) Text("Services discovered: ${services.length}"),
          ],
        ),
      ),
    );
  }
}

 


3. コードの説明

  1. スキャンの開始:

    • flutterBlue.startScan(timeout: Duration(seconds: 4)); でBLEデバイスのスキャンを開始します。
    • flutterBlue.scanResults.listen でスキャン結果をリッスンし、指定したデバイス名(例: "AQUA-FAN-BLE")を見つけたら接続します。
  2. デバイスへの接続:

    • device.connect() でデバイスに接続します。
    • 接続が成功したら、discoverServices(device) を呼び出してサービスとキャラクタリスティックを取得します。
  3. サービスの探索:

    • device.discoverServices() でデバイスのサービスとキャラクタリスティックを取得します。
    • 取得したサービスとキャラクタリスティックのUUIDをログに出力します。

4. キャラクタリスティックの読み取りと通知

キャラクタリスティックからデータを読み取ったり、通知を有効にしたりするには、以下のようにします。

void readCharacteristic(BluetoothCharacteristic characteristic) async {
  List<int> value = await characteristic.read();
  print("Characteristic Value: $value");
}

void setNotification(BluetoothCharacteristic characteristic) async {
  await characteristic.setNotifyValue(true);
  characteristic.value.listen((value) {
    print("Notification Value: $value");
  });
}

 


5. 実行結果

  • アプリを実行すると、指定したBLEデバイスをスキャンし、接続します。
  • 接続が成功すると、デバイスのサービスとキャラクタリスティックが表示されます。

6. 注意点

  • デバイス名の確認: BLEデバイスの名前が正しく設定されているか確認してください。デバイス名が異なる場合は、スキャンで見つかりません。

  • パーミッション: AndroidとiOSでBLEを使用するには、適切なパーミッションが必要です。にパーミッションを追加してください。

  • BLEの対応: BLEデバイスが正しく動作しているか確認してください。デバイスが広告(Advertising)を行っている必要があります。


これで、FlutterでBLEデバイスに接続し、サービスやキャラクタリスティックを取得できるはずです。

タイトルとURLをコピーしました