Arduino 보드로 만든 BLE 디바이스와 아이폰 앱을 연동하는 개발을 하던 중 BLE 기기와 연결할 때 특성(Characteristic) 속성이 "Not Available"로 표시되는 문제가 발생 했습니다...
확인해 보니 이 문제는 iOS가 특성의 읽기(Read), 쓰기(Write), 알림(Notify) 등의 속성을 제대로 감지하지 못할 때 발생할 수 있습니다.
특히, React Native에서는 특성의 "Notify" 속성이 필요하기 때문에 이를 추가 해주면 문제가 해결 될수 있습니다.
오늘은 ESP32 펌웨어를 수정하여 iOS에서 BLE 특성을 정상적으로 인식하도록 만드는 방법을 알려드리겠습니다. 🚀
✅ 첫번째 방법: BLE 특성 속성을 올바르게 설정하기
ESP32에서 BLE 특성을 정의할 때는 속성을 명확하게 지정해야 합니다.
특히, iOS에서 알림(Notification)을 정상적으로 받으려면 PROPERTY_NOTIFY
속성을 반드시 추가해야 합니다.
🔹 ESP32 코드 수정하기 (읽기 + 알림 활성화)
다음과 같이 BLECharacteristic을 생성할 때 PROPERTY_READ | PROPERTY_NOTIFY
속성을 추가해줘야 합니다.
BLECharacteristic* pCharacteristic = pService->createCharacteristic(
CHARACTERISTIC_UUID,
BLECharacteristic::PROPERTY_READ |
BLECharacteristic::PROPERTY_NOTIFY // 🔹 Notify 속성 추가
);
// 🔹 알림(Notifications) 활성화
BLE2902* pBLE2902 = new BLE2902();
pBLE2902->setNotifications(true);
pCharacteristic->addDescriptor(pBLE2902);
✅ 이렇게 설정하면 iOS 앱 개발할때 해당 특성의 알림(Notify)값을 해당 디바이스에서 지원하는지 아니면 지원하지 않는지 명확하게 확인이 가능합니다.
✅ 테스트 전에 ESP32를 재부팅한 후 React Native 앱도 새로 빌드해서 재시작 해시고 테스트를 진행해주세요.
✅ 두번째 방법: BLE 연결이 끊어진 후 다시 Advertising 시작하기
iOS 앱에서 BLE 특성을 제대로 인식하지 못하는 경우, 기기가 연결을 끊었을 때 BLE의 Advertising을 다시 시작하면 문제 해결에 도움이 될 수 있습니다.
🔹 연결 종료 시 BLE Adevertising 다시 시작하기
다음 코드를 추가하여 기기가 연결을 끊었을 때 BLE Advertising을 재 시작 할수 있습니다.
void onDisconnect(BLEServer* pServer) {
deviceConnected = false;
Serial.println("❌ 디바이스 연결 해제됨, Advertiging 재시작...");
delay(500); // 안정성을 위한 짧은 대기 시간
BLEDevice::startAdvertising();
}
✅ 이 코드를 추가함으로써, BLE 기기의 연결이 끊긴 후 다시 재연결될 때 iOS 앱에서 특성을 새롭게 감지할 가능성이 높아질수 있습니다.
✅ 세번째 방법: iOS 블루투스 셋팅에서 BLE 기기 삭제 후 다시 연결하기
iOS는 BLE 기기의 정보를 캐시(Cache) 하기 때문에, 여러 번 연결을 하게 되면 캐시 데이터를 가지고 있어서 위에 방법들을 수정한게 반영이 안되서 문제가 발생할 수 있습니다.
이 경우, 아이폰에서 BLE 기기를 삭제하고 다시 연결하면 문제를 해결할 수 있습니다.
🔹 아이폰에서 BLE 기기 삭제하는 방법
- 아이폰 설정 → 블루투스 메뉴로 이동
- ESP32 BLE 기기(예: "Test-XX")를 찾기
- "이 기기 지우기(Forget This Device)" 선택
- iPhone과 ESP32를 재부팅
- React Native 앱에서 다시 연결 시도
✅ 이 과정을 거치면 아이폰이 BLE 특성을 새롭게 재검색하면서 "Not Available" 문제를 해결할 수 있습니다.
✅ 최종 점검 체크리스트
해결 방법 | 수정 내용 |
---|---|
✅ 1. BLE 특성 속성 올바르게 설정하기 | `PROPERTY_READ |
✅ 2. 연결 해제 후 Advertising 재 시작하기 | BLEDevice::startAdvertising(); 추가 |
✅ 3. 휴대폰 셋팅에서 BLE 기기 삭제 후 다시 연결하기 | 아이폰 블루투스 설정에서 "이 기기 지우기" 후 재연결 |
위의 모든 수정 사항을 적용한 후, React Native 앱에서 BLE 기기를 다시 스캔하고 로그를 확인해보세요.
아직 문제가 있다면 댓글로 로그를 공유해 주세요! 😊🔥
🚀 확인이 되지 않던 BLE 특성값을 이제 아이폰에서 확인 할 수 있습니다!