졸업 프로젝트

[React Native - Expo] BLE 블루투스 기능 _ (3) 디바이스 연결, 데이터 전송

yyyujinnn 2025. 1. 6. 00:47

이전 포스팅에서 얘기했다시피

저는 블루투스를 통해

발신자 - 정수 ID값 전달

수신자 - 받은 ID값으로 API 요청

을 구현하고자 합니다 (제발🙏)

 

-> 결론 : BLE 는 휴대폰과 장치의 연결에 최적화 되어있어 연결과 데이터 전송을 테스트할 수 없었어요....

하단의 소스코드는 저의 발악입니다..


- useBLE.js 이전 코드에서 추가

import { useEffect, useState, useRef } from 'react';
import { BleManager } from 'react-native-ble-plx';
import BluetoothRequestPermissions from './BluetoothRequestPermissions';

const useBLE = () => {
  const [connectedDevice, setConnectedDevice] = useState(null); // 연결된 장치
  
  async function connectToDevice(deviceId) {
    try {

      // 기존 연결된 디바이스 연결 해제
      if (connectedDevice) {
        await bleManager.disconnectFromDevice();
      }

      // 새로운 디바이스 연결
      const deviceConnection = await bleManager.connectToDevice(deviceId);
      console.log("디바이스 연결:", deviceConnection.name);
      setConnectedDevice(deviceConnection);
      await deviceConnection.discoverAllServicesAndCharacteristics();
    } catch (error) {
      console.log("디바이스 연결 오류", deviceConnection.name, error);
    }
  }

  async function sendData(serviceUUID, characteristicUUID, cardId) {
    if (!connectedDevice) {
      console.log("연결된 디바이스 없음");
      return;
    }
    try {
      const dataBuffer = new Uint16Array(1); // 0-65535 범위의 정수 전송
      dataBuffer[0] = cardId; // 0에서 65535 사이의 정수 전송
  
      // 데이터 전송
      await connectedDevice.writeCharacteristicWithResponseForService(
        serviceUUID,
        characteristicUUID,
        dataBuffer.buffer // ArrayBuffer를 전달
      );

      console.log("데이터 전송:", cardId);
    } catch (error) {
      console.log("데이터 전송 오류:", error);
    }
  }

  return {
    allDevices,
    scanForPeripherals,
    connectedDevice,
    connectToDevice,
    sendData,
  };
};

export default useBLE;

 

- bluetooth.js

function Step2Screen({ route }) {
  const { permissionGranted = false, cardId } = route.params || {};

  const [recipients, setRecipients] = useState([]);
  
  const handlePressRecipient = async (id, cardId) => {
    const isConnected = await connectToDevice(id); // 디바이스 연결

    if (isConnected) {
      setRecipientStatuses((prevStatuses) => {
        if (prevStatuses[id] === '공유 완료됨') {
          return prevStatuses; // 이미 공유 완료된 경우 상태 유지
        }
        return {
          ...prevStatuses,
          [id]: '요청 중...' // 연결이 성공한 경우에만 상태 업데이트
        };
      });

      // 연결한 디바이스에 cardId 전달
      await sendData(cardId);
      
    } else {
      showCustomToast('디바이스 연결 실패');
    }
  };