React Native BLE에서 MTU 설정으로 데이터 전송량 늘리기 (Android)

2025. 2. 14. 18:00·MOBILE APP

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 WebView에서 네이티브와 데이터 주고받기  (1) 2025.03.18
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
'MOBILE APP' 카테고리의 다른 글
  • React Native WebView에서 네이티브와 데이터 주고받기
  • React Native에서 SSL 인증서 검증 우회하기 (Expo 포함)
  • React Native에서 로컬 서버에 접속하기 (Expo 포함)
  • Expo에서 pod install 오류: "cannot load such file -- ./scripts/autolinking" 해결 방법
shinejung
shinejung
저의 블로그에 오신것을 환영합니다. 프론트엔드 개발을 많이 다룹니다.
  • shinejung
    shine.log
    shinejung
  • 전체
    오늘
    어제
    • 전체 글 (7)
      • FRONTEND (0)
      • BACKEND (0)
      • MOBILE APP (5)
      • 프로젝트 (1)
      • 후기 (1)
      • 회고 (0)
      • 기타 (0)
  • 블로그 메뉴

    • 방명록
    • 태그
  • 링크

    • 홈페이지
    • 깃허브
    • 링크드인
  • 인기 글

  • 태그

    swift student challenge
    보드게임
    양자역학
    apple
    expo
    ble
    ios
    프로젝트
    bluetooth
    WWDC
    webview
    React Native
    SWIFT
    스위프트 스튜던트 챌린지
    AR
    오목
    오류 해결
    Android
    https
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.3
shinejung
React Native BLE에서 MTU 설정으로 데이터 전송량 늘리기 (Android)
상단으로

티스토리툴바