1. 주변 BLE Device Scan
2022.07.07 - [Flutter/기능 구현] - [Flutter / BLE] 기능 구현 - SCAN 글을 참고하여
주변 BLE Device Scan을 수행한다.
해당 링크에 첨부된 main.dart를 참고하면 검색된 BLE Device Name을 title로 가지는
ListTile의 trailing을 터치했을 때 수행되는 onTab 속성이 주석 처리 되어있다.
Connect를 수행하기 위해서는 해당 주석을 해제하여 수행하도록 한다.
child: ListTile(
dense: true,
enabled: !(!_connected && _scanning),
trailing: GestureDetector(
behavior: HitTestBehavior.translucent,
onTap: () {
//(!_connected && _scanning) || (!_scanning && _connected)? (){}: onConnectDevice(index);
},
child: Container(
width: 48,
height: 48,
padding: const EdgeInsets.symmetric(vertical: 4.0),
alignment: Alignment.center,
child: const Icon(Icons.add_link),
),
),
subtitle: Text(_foundBleUARTDevices[index].id),
title: Text("${_foundBleUARTDevices[index].name}",style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20)),
),
2. onConnectDevice 함수 정의
검색된 주변 BLE 장치 이름을 가지는 ListTile을 터치 했을 때 호출되는 onConnectDevice 함수를 정의 한다.
onConnectDevice 에서는 Connect 관련 처리를 수행하고, 송수신되는 데이터의 처리를 담당하는 datadisplay.dart를
호출하여 화면을 전환 후 관련처리를 하도록한다.
void onConnectDevice(index) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => DataDisplay(
foundDeviceId: _foundBleUARTDevices[index].id,
foundDeviceName: _foundBleUARTDevices[index].name,
bleLib: flutterReactiveBle,
),
),
);
}
3. datadisplay.dart의 Connect 처리
datadisplay 클래스는 호출되자 마자 수행되는 override 함수인 initState 함수에서 Connect 처리를 수행한다.
Connect 처리에 관련된 소스는 2022.07.01 - [Flutter/기능 구현] - [Flutter / BLE] flutter_reactive_ble 라이브러리
글의 5.Establishing Connection 절을 참고하여 작성되었다.
@override
void initState() {
super.initState();
//안드로이드의 경우 범위 내에 있지 않은 장치에 연결을하려고 할 때
//중단되는 문제가 있으므로 connectToDevice가 아닌 connectToAdvertisingDevice로
//Connect 수행
_currentConnectionStream = widget.bleLib.connectToAdvertisingDevice(
id:widget.foundDeviceId, //장치 SCAN을 통해 검색된 장치ID(안드로이드의 경우 MAC주소)로 연결
prescanDuration: const Duration(seconds: 10), //연결을 시도하기 전에 BLE스택이 장치를 검색하는 시간
withServices: [globalVal.UART_UUID, globalVal.UART_RX, globalVal.UART_TX], //사용할 서비스 UUID
);
//BLE 상태 감시
connection = _currentConnectionStream.listen((event) {
if(event.failure != null){
print("Connect Fail${event}\n");
}
var id = event.deviceId.toString();
switch (event.connectionState) {
case DeviceConnectionState.connecting:
{
print("Connecting to ${id} \n");
break;
}
case DeviceConnectionState.connected:
{
globalVal.connected = true;
print("Connected to ${id} \n");
//수신 특성 등록
_txCharacteristic = QualifiedCharacteristic(
serviceId: globalVal.UART_UUID,
characteristicId: globalVal.UART_TX,
deviceId: event.deviceId);
//수신
_receivedDataStream =
widget.bleLib.subscribeToCharacteristic(_txCharacteristic);
_receivedDataStream.listen((data) {
onNewReceivedData(data);
});
_rxCharacteristic = QualifiedCharacteristic(
serviceId: globalVal.UART_UUID,
characteristicId: globalVal.UART_RX,
deviceId: event.deviceId);
_timer = Timer.periodic(Duration(seconds: 2), (timer) { _sendData(); });
break;
}
case DeviceConnectionState.disconnecting:
{
print("Disconnecting from $id\n");
break;
}
case DeviceConnectionState.disconnected:
{
_timer.cancel();
globalVal.connected = false;
print("Disconnected from $id\n");
break;
}
}
setState(() {});
},);
}
'Flutter > 기능 구현' 카테고리의 다른 글
[Flutter / BLE] 기능 구현 - SCAN (0) | 2022.07.07 |
---|---|
[Flutter / BLE] Android 권한 설정 (0) | 2022.07.04 |
[Flutter / BLE] flutter_reactive_ble 라이브러리 (0) | 2022.07.01 |