이번학기에 대학교에서 BLE에 대해서 공부하게 되었습니다. 처음에는 이론시험만 치룰 줄 알았는데, 세상에 BLE와 관련된 모바일 앱을 만드는게 과제였습니다. 교수님께서 예제 앱을 주셨는데, 아쉽게도 Android 프로젝트더군요. 그래서 직접 허락을 구하고 Flutter를 이용해서 제작하기로 하였습니다. 이러쿵 저러쿵 서론이 길었지만, 이 시리즈는 저의 완성품을 토대로 Flutter 프로젝트에서 Bluetooth 앱을 만드는 법을 정리한 시리즈입니다.
Bluetooth는 근거리 무선통신 방식입니다. 이전과 달리 현대의 Bluetooth 기술은 굉장히 엄청난 수준까지 발전하였고, 멀지 않은 미래의 IoT 세상을 만드는 중요한 기술입니다. 하지만, 제가 이번 글에서 다룰 주인공은 BLE입니다.
BLE란 (Bluetooth Low Energe)를 의미합니다. 말 그대로 저전력 블루투스라는 의미에요. 이 기술의 특징은 저전력 기능, 쉬운 상호 연결성이라고 할 수 있습니다. 이 글에서 다루어지는 주인공이기도 하죠. 더욱 자세한 사항은 하단 링크의 게시물에서 얻을 수 있습니다.
pub.dev 에 여러 좋은 패키지가 많았지만, 제가 사용한 패키지는 flutter_blue_plus 패키지입니다. 이 패키지는 flutter_blue 패키지에서 업그레이드 된 패키지인데요. flutter_blue패키지를 제작하던 개발자님께서 손을 놔서, 다른 여러 개발자님들이 보완하여 제작한 패키지입니다. 때문에, flutter_blue_plus 패키지를 이용해서 앱을 만들어봅시다. 상태관리를 위해서 GetX를 함께 사용하였습니다.
가장 중요한 점은 flutter_blue_plus패키지로 앱을 완성해도, 시뮬레이터에서는 제대로 작동하지 않을 수 있습니다. 따라서, 실제 기기를 이용해서 디버깅 하는 것이 좋습니다. 때문에, 안된다고 멘탈 부숴지지 말고 실제 기기 한번 연결해보세요.
일단, 앱을 실행시키면 아래와 같은 UI가 나타납니다. 디자인 괜찮지 않나요? 가운데 Bluetooth 로고는 rive를 이용해서 만들어보았습니다. 물론, 훌륭하신 분께서 이미 올려놓은 것을 제가 변경해서 사용했습니다. asset과 rive는 하단에서 확인해볼 수 있어요.
이제, 시작하기 버튼을 이용해서 블루투스 검색을 할건데, 그전에 앞서 패키지에서 클라이언트 장치의 블루투스 상태값을 가져오지 못한 상태로 검색하면 에러가 발생할 수 있습니다. 게다가, 블루투스가 꺼져있다면 검색기능을 사용할 때 에러가 발생할 수도 있을 것 같습니다. 이를 막기 위해서 블루투스 기능을 확인해서 각각의 페이지로 라우팅 하는 컨트롤러를 만들겠습니다.
class BluetoothCheckController extends GetxController {
final _bluetoothState = Rx<BluetoothState>(BluetoothState.unknown);
set bluetoothState(value) => _bluetoothState.value = value;
void onReady() {
super.onReady();
//블루투스 상태에 변하면 moveToPage 메소드를 이용해서 라우팅
ever(_bluetoothState, (_) => moveToPage());
//블루투스 상태의 Stream을 전달받음.
_bluetoothState.bindStream(flutterBlue.state);
}
void moveToPage() {
if (_bluetoothState.value == BluetoothState.on) {
//블루투스가 켜져 있다면, 앱으로 라우팅
Get.off(() => const OnBoard(), transition: Transition.fadeIn);
} else {
//그렇지 않은 경우 앱을 이용하지 못하는 페이지로 라우팅
Get.off(() => const Check(), transition: Transition.fadeIn);
}
}
}
이제, 클라이언트의 블루투스 기능에 따라서 적절한 페이지로 라우팅 되므로, 검색 기능에서의 에러를 방지할 수 있습니다. 다음 글에서부터 본격적으로 알아보도록 하겠습니다 !