블루투스 통신은 다양한 기기 간의 데이터 전송을 가능하게 하는 무선 기술로, Flutter 애플리케이션에서 이를 구현하면 스마트폰과 주변 기기 간의 데이터 교환이 가능합니다. 이번 글에서는 Flutter에서 블루투스 통신을 구현하는 방법과 이를 구현하는 예제를 자세히 살펴보겠습니다.
1. 블루투스 패키지 설치
Flutter 애플리케이션에서 블루투스 통신을 구현하기 위해 flutter_blue 패키지를 사용합니다. pubspec.yaml 파일에 다음 의존성을 추가합니다.
dependencies:
flutter:
sdk: flutter
flutter_blue: ^0.8.0
그리고 pub get 명령어를 실행하여 패키지를 설치합니다.
2. Android 설정
Android 프로젝트에서 블루투스 권한을 사용하기 위해 android/app/src/main/AndroidManifest.xml 파일을 수정해야 합니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.your_project_name">
<application>
...
</application>
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.BLUETOOTH_SCAN"/>
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT"/>
</manifest>
위 코드는 블루투스 및 위치 사용 권한을 추가합니다.
3. iOS 설정
iOS 프로젝트에서 블루투스 권한을 사용하기 위해 ios/Runner/Info.plist 파일을 수정해야 합니다.
<key>NSBluetoothAlwaysUsageDescription</key>
<string>We need your Bluetooth to connect to devices.</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>We need your location to discover Bluetooth devices.</string>
위 코드는 블루투스 및 위치 사용 권한을 추가합니다.
4. 블루투스 디바이스 검색 및 연결
이제 Flutter 애플리케이션에서 블루투스 디바이스를 검색하고 연결하는 방법을 살펴보겠습니다.
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BluetoothScreen(),
);
}
}
class BluetoothScreen extends StatefulWidget {
@override
_BluetoothScreenState createState() => _BluetoothScreenState();
}
class _BluetoothScreenState extends State<BluetoothScreen> {
FlutterBlue flutterBlue = FlutterBlue.instance;
List<BluetoothDevice> devicesList = [];
BluetoothDevice? connectedDevice;
List<BluetoothService> services = [];
@override
void initState() {
super.initState();
startScan();
}
void startScan() {
flutterBlue.startScan(timeout: Duration(seconds: 4));
flutterBlue.scanResults.listen((results) {
for (ScanResult r in results) {
if (!devicesList.contains(r.device)) {
setState(() {
devicesList.add(r.device);
});
}
}
});
flutterBlue.stopScan();
}
void connectToDevice(BluetoothDevice device) async {
await device.connect();
setState(() {
connectedDevice = device;
});
discoverServices();
}
void discoverServices() async {
if (connectedDevice == null) return;
services = await connectedDevice!.discoverServices();
setState(() {});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Bluetooth Example'),
),
body: Column(
children: <Widget>[
Expanded(
child: ListView.builder(
itemCount: devicesList.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(devicesList[index].name),
onTap: () => connectToDevice(devicesList[index]),
);
},
),
),
connectedDevice != null
? Expanded(
child: ListView.builder(
itemCount: services.length,
itemBuilder: (context, index) {
return ListTile(
title: Text('Service UUID: ${services[index].uuid}'),
);
},
),
)
: Container(),
],
),
);
}
}
위 코드는 주변 블루투스 디바이스를 검색하고, 선택한 디바이스에 연결하여 그 디바이스의 서비스를 표시하는 예제입니다. flutterBlue.startScan 메서드를 사용하여 블루투스 디바이스를 검색하고, BluetoothDevice.connect 메서드를 사용하여 디바이스에 연결합니다.
5. 데이터 전송 및 수신
블루투스 디바이스와 연결된 후 데이터를 전송하고 수신하는 방법을 살펴보겠습니다. 연결된 디바이스의 서비스와 특성을 탐색한 후, 데이터를 주고받을 수 있습니다.
import 'package:flutter/material.dart';
import 'package:flutter_blue/flutter_blue.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: BluetoothScreen(),
);
}
}
class BluetoothScreen extends StatefulWidget {
@override
_BluetoothScreenState createState() => _BluetoothScreenState();
}
class _BluetoothScreenState extends State<BluetoothScreen> {
FlutterBlue flutterBlue = FlutterBlue.instance;
List<BluetoothDevice> devicesList = [];
BluetoothDevice? connectedDevice;
List<BluetoothService> services = [];
BluetoothCharacteristic? targetCharacteristic;
@override
void initState() {
super.initState();
startScan();
}
void startScan() {
flutterBlue.startScan(timeout: Duration(seconds: 4));
flutterBlue.scanResults.listen((results) {
for (ScanResult r in results) {
if (!devicesList.contains(r.device)) {
setState(() {
devicesList.add(r.device);
});
}
}
});
flutterBlue.stopScan();
}
void connectToDevice(BluetoothDevice device) async {
await device.connect();
setState(() {
connectedDevice = device;
});
discoverServices();
}
void discoverServices() async {
if (connectedDevice == null) return;
services = await connectedDevice!.discoverServices();
for (var service in services) {
for (var characteristic in service.characteristics) {
if (characteristic.properties.write) {
targetCharacteristic = characteristic;
}
}
}
setState(() {});
}
void sendData(String data) async {
if (targetCharacteristic == null) return;
await targetCharacteristic!.write(data.codeUnits);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Bluetooth Example'),
),
body: Column(
children: <Widget>[
Expanded(
child: ListView.builder(
itemCount: devicesList.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(devicesList[index].name),
onTap: () => connectToDevice(devicesList[index]),
);
},
),
),
connectedDevice != null
? Expanded(
child: ListView.builder(
itemCount: services.length,
itemBuilder: (context, index) {
return ListTile(
title: Text('Service UUID: ${services[index].uuid}'),
);
},
),
)
: Container(),
connectedDevice != null
? Padding(
padding: const EdgeInsets.all(8.0),
child: TextField(
onSubmitted: (value) {
sendData(value);
},
decoration: InputDecoration(
labelText: 'Send data',
border: OutlineInputBorder(),
),
),
)
: Container(),
],
),
);
}
}
위 코드는 연결된 블루투스 디바이스로 데이터를 전송하는 예제입니다. BluetoothCharacteristic.write 메서드를 사용하여 데이터를 전송합니다. 텍스트 입력 필드에서 데이터를 입력하고 전송할 수 있습니다.
결론
Flutter 애플리케이션에서 블루투스 통신을 구현하면 스마트폰과 주변 기기 간의 데이터 전송이 가능합니다. flutter_blue 패키지를 사용하여 블루투스 디바이스를 검색하고 연결하는 방법, 데이터를 전송하고 수신하는 방법을 통해 블루투스 통신 기능을 구현할 수 있습니다. 이번 글에서 소개한 방법들을 활용하여 Flutter 애플리케이션에서 블루투스 통신을 효율적으로 사용해보세요. 블루투스 통신을 통해 애플리케이션의 기능을 확장하고, 사용자 경험을 향상시킬 수 있습니다.
'Flutter' 카테고리의 다른 글
Flutter의 소켓 프로그래밍 사용법 (1) | 2024.08.04 |
---|---|
Flutter의 NFC 통신 사용법 (2) | 2024.08.04 |
Flutter의 바코드 스캔 사용법 (2) | 2024.08.03 |
Flutter의 QR 코드 스캔 사용법 (1) | 2024.08.03 |
Flutter의 위치 서비스(Location Services) 사용법 (1) | 2024.08.02 |