반응형

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(() {});
  },);
}

datadisplay.dart
0.00MB
global.dart
0.00MB
main.dart
0.01MB

반응형

+ Recent posts