BLE(Bluetooth Low Energy) 통신을 통해 데이터를 전송하는 과정에서, Android에서는 한 번에 20바이트까지만 전송되는 것을 확인했습니다. (20바이트를 초과하면 패킷이 자동으로 나뉘어 전송됩니다.)
라이브러리 문서를 찾아보면서 MTU(Maximum Transmission Unit) 설정을 통해 데이터 전송량을 늘릴 수 있다는 것을 알게 되었습니다. 이 글에서는 React Native에서 MTU 크기를 설정하는 방법을 설명해 보겠습니다.
MTU란?
MTU(Maximum Transmission Unit)는 한 번에 전송할 수 있는 최대 바이트 크기를 의미합니다. BLE의 기본 MTU는 23바이트이지만, 이 중 3바이트는 헤더로 사용되므로 실제 데이터는 20바이트까지만 전송할 수 있습니다.
패킷을 여러 번 나눠 보내기보다 MTU 크기를 조정해 한 번에 더 많은 데이터를 전송하면 헤더 바이트를 아낄 수 있고 전송 속도도 높일 수 있습니다.
Android와 iOS의 MTU 차이
Android에서는 MTU 크기를 요청할 수 있지만 요청한 크기보다 작은 값이 설정될 수도 있습니다. iOS에서는 자동으로 MTU 크기가 조정됩니다. iOS에서의 MTU 최대값은 187바이트입니다.
MTU 요청하기 (Android)
React Native에서 BLE를 다루는 대표적인 라이브러리는 react-native-ble-manager
와 react-native-ble-plx
가 있습니다. 두 라이브러리에서 MTU를 요청하는 방법을 살펴보겠습니다.
1. react-native-ble-manager
react-native-ble-manager
에서는 requestMTU
메서드를 사용해서 MTU를 요청할 수 있습니다.
import BleManager from "react-native-ble-manager";
await BleManager.connect(deviceId);
const mtu = await BleManager.requestMTU(deviceId, 512);
console.log(`변경된 MTU: ${mtu}`);
const services = await BleManager.retrieveServices(deviceId);
데이터를 전송할 때 write
또는 writeWithoutResponse
메서드를 사용하면, 다섯 번째 인자로 maxByteSize
를 지정할 수 있습니다. maxByteSize
를 지정하지 않으면 기본값인 20바이트로 설정되어 데이터가 나누어 전송됩니다. 따라서 한 번에 더 긴 데이터를 보내려면 maxByteSize
를 설정해야 합니다.
await BleManager.write(deviceId, serviceUUID, characteristicUUID, data, 512);
2. react-native-ble-plx
react-native-ble-plx
에서는 connectToDevice
메서드의 requestMTU
옵션을 사용해서 MTU를 요청할 수 있습니다.
import { BleManager } from "react-native-ble-plx";
const manager = new BleManager();
const device = await manager.connectToDevice(deviceId, {
requestMTU: 512,
});
console.log(`변경된 MTU: ${device.mtu}`);
// 다른 MTU로 요청하고 싶다면
await device.requestMTU(23);
console.log(`다시 변경된 MTU: ${device.mtu}`);
주의점
- MTU 크기는 요청한 값보다 작을 수 있기 때문에 실제로 변경된 MTU 크기를 확인해야 합니다.
- 모든 BLE 장치가 큰 MTU 크기를 지원하는 것은 아닙니다.
참고 자료
- react-native-ble-manager
- react-native-ble-manager issue #736
- react-native-ble-plx
- react-native-ble-plx MTU Negotiation
추가 정보나 궁금한 점이 있다면 댓글로 남겨주세요!
'MOBILE APP' 카테고리의 다른 글
React Native에서 SSL 인증서 검증 우회하기 (Expo 포함) (1) | 2025.01.31 |
---|---|
React Native에서 로컬 서버에 접속하기 (Expo 포함) (0) | 2025.01.24 |
Expo에서 pod install 오류: "cannot load such file -- ./scripts/autolinking" 해결 방법 (0) | 2025.01.23 |