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. コードの説明
-
スキャンの開始:
flutterBlue.startScan(timeout: Duration(seconds: 4));でBLEデバイスのスキャンを開始します。flutterBlue.scanResults.listenでスキャン結果をリッスンし、指定したデバイス名(例:"AQUA-FAN-BLE")を見つけたら接続します。
-
デバイスへの接続:
device.connect()でデバイスに接続します。- 接続が成功したら、
discoverServices(device)を呼び出してサービスとキャラクタリスティックを取得します。
-
サービスの探索:
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デバイスに接続し、サービスやキャラクタリスティックを取得できるはずです。
