feat(bluetooth): 실제 BLE 기반 맛집 리스트 공유 구현

- ble_peripheral 패키지 추가 (Peripheral/GATT Server 역할)
- flutter_blue_plus 패키지 활용 (Central/스캔/연결 역할)

변경 사항:
- BleConstants: BLE UUID 및 설정 상수 정의
- BluetoothService: Mock에서 실제 BLE 통신으로 전면 재작성
  - Receiver: GATT Server로 광고, Write callback으로 데이터 수신
  - Sender: 서비스 UUID로 스캔, 연결 후 Characteristic에 데이터 전송
  - 청크 기반 대용량 데이터 전송 프로토콜 구현
- ShareDevice: BLE 디바이스 정보 필드 추가 (remoteId, rssi, bleDevice)
- Android/iOS: BLE 권한 및 기능 선언 추가

데이터 전송 프로토콜:
- 'CHUNK:index:total:data' 형식으로 500바이트 단위 분할 전송
- 수신 측에서 청크 조립 후 JSON 파싱
This commit is contained in:
JiWoong Sul
2026-01-30 00:09:13 +09:00
parent 24b074ff4c
commit c608b6c7df
11 changed files with 534 additions and 60 deletions

View File

@@ -211,11 +211,11 @@ class _ShareScreenState extends ConsumerState<ShareScreen> {
Text('이 코드를 상대방에게 알려주세요', style: AppTypography.caption(isDark)),
const SizedBox(height: 16),
TextButton.icon(
onPressed: () {
onPressed: () async {
setState(() {
_shareCode = null;
});
ref.read(bluetoothServiceProvider).stopListening();
await ref.read(bluetoothServiceProvider).stopListening();
},
icon: const Icon(Icons.close),
label: const Text('취소'),
@@ -551,7 +551,7 @@ class _ShareScreenState extends ConsumerState<ShareScreen> {
setState(() {
_shareCode = null;
});
ref.read(bluetoothServiceProvider).stopListening();
await ref.read(bluetoothServiceProvider).stopListening();
}
void _showLoadingDialog(String message) {