졸업 프로젝트
[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('디바이스 연결 실패');
}
};