재난이 발생하면, 셀 타워가 먼저 무너진다 — 그래서 나는 해안 커뮤니티를 위해 메시 네트워크를 구축했다
Source: Dev.to
Ocean Sentinels는 안드로이드 기반 플랫폼으로, 해안 지역 커뮤니티가 위험을 보고하고, 구조 활동을 조정하며, 셀룰러나 Wi‑Fi 네트워크가 끊겨도 연결된 상태를 유지할 수 있게 해줍니다. 핵심 아이디어는 일반 안드로이드 폰을 블루투스 저전력(BLE) 기술을 이용한 재난에 강인한 릴레이 네트워크로 전환하는 것입니다. 오프라인에서 생성된 보고서는 폰 간에 (≈ 400 m 정도씩) 전송되어, 체인상의 어느 장치가 인터넷에 도달하면 데이터를 서버에 업로드합니다.
작동 방식
[ Phone A ] ---BLE 400 m---> [ Phone B ] ---BLE 400 m---> [ Phone C : Has Internet ]
No signal No signal Uploads to server ✓
- 위험 보고 – GPS + 사진 (높은 파도, 홍수, 실종 보트 등)
- BLE 메쉬 릴레이 – 오프라인 전파가 홉당 약 400 m까지 테스트됨
- 실시간 지도 – 실시간 사건 마커 (Mapbox)
- 역할 기반 접근 – 시민, 구조팀, 당국, 관리자
- 푸시 알림 – Firebase, 앱이 닫혀 있어도 작동
- 웹 대시보드 – 당국용 (인터넷 필요)
개요
Ocean Sentinels는 전 세계 해안 지역 사회를 위한 통합 풀스택 안전 플랫폼을 제공합니다. 네 가지 사용자 역할을 지원하며, 각 역할마다 전용 콘솔과 워크플로우가 있습니다.
| 역할 | 기능 |
|---|---|
| 시민 | 사고 보고서 제출, 실시간 지도 보기 |
| 구조팀 | 푸시 알림 수신, 보고서 검증, 대응 조정 |
| 당국 | 대시보드 분석, 사용자 관리, 사고 감독 |
| 관리자 | 전체 시스템 구성 및 사용자 관리 |
주요 기술 하이라이트
- Android 앱 – Kotlin + Jetpack Compose, Hilt DI, 오프라인 저장을 위한 Room, 포그라운드 BLE 서비스.
- BLE 메쉬 레이어 – 홉 카운트 TTL 대신 시간 기반 만료(72 h), Android 6+ MAC 무작위화와 호환.
- 백엔드 – FastAPI + PostgreSQL, 역할 기반 접근 제어, WebSocket 실시간 업데이트.
- 푸시 – 즉각적인 알림을 위한 Firebase Cloud Messaging.
Architecture
+-------------------+ +-------------------+ +-------------------+
| Android App | | BLE Mesh Layer | | Internet (API) |
+-------------------+ +-------------------+ +-------------------+
| |
v v
+-------------------+ +-------------------+
| Local Room DB | | Firebase Cloud |
+-------------------+ +-------------------+
- Device ↔︎ Mesh – BLE 광고는 암호화된 페이로드를 전송하며, 각 노드는 Room에 보류 중인 보고서를 저장합니다.
- Device ↔︎ Server – 어떤 노드든 연결이 복구되면 저장된 보고서를 배치로 묶어 FastAPI 엔드포인트를 통해 전송합니다.
- Server ↔︎ Dashboard – WebSocket은 새로운 사고를 웹 UI에 푸시하고, REST API는 과거 데이터를 제공합니다.
프로젝트 구조
/android-app
/src/main/kotlin/com/oceansentinels
- ui/ # Compose screens
- ble/ # Mesh service
- di/ # Hilt modules
- data/ # Room + repository
/backend
/app
- routers/ # FastAPI routers
- models/ # SQLAlchemy models
- services/ # Business logic
/web-dashboard
/src
- components/ # React/Vue components
- store/ # State management
백엔드 API
- POST
/reports/– GPS와 사진 URL, 선택적 메타데이터를 포함한 JSON을 받습니다. - GET
/reports/– 최근 사건들의 페이지네이션된 목록을 반환합니다 (지역, 심각도별 필터 가능). - WebSocket
/ws/updates– 새로운 사건 이벤트를 연결된 대시보드에 스트리밍합니다.
인증은 JWT 기반이며; 역할 클레임에 따라 관리자 엔드포인트 접근이 결정됩니다.
프론트엔드 웹 앱
- React와 TypeScript로 구축되었습니다.
- Mapbox GL JS가 실시간 사고 지도를 렌더링합니다.
- 역할별 패널(검증, 분석, 사용자 관리).
- WebSocket 엔드포인트를 통한 실시간 업데이트.
Android App
- Kotlin + Jetpack Compose UI.
- BLE Mesh Service는 백그라운드 제한을 피하기 위해 포그라운드 서비스로 실행됩니다.
- Room은 대기 중인 보고서를 저장하고; 연결이 복구되면 WorkManager 작업이 이를 동기화합니다.
- Firebase Messaging은 앱이 닫혀 있어도 푸시 알림을 전달합니다.
BLE 메쉬 네트워크
- 범위: 개방된 지역에서 홉당 약 400 m (세 대의 휴대폰으로 테스트).
- 메시지 수명: 72 h 기반 만료, 긴 체인에서도 전달 보장.
- 식별: MAC 주소 대신 생성된 UUID 사용 (Android 6+에서는 MAC을 무작위화).
실제 테스트
세 대의 휴대폰을 약 400 m 간격으로 배치하여, 오프라인 단말에서 위험 보고서를 인터넷이 연결된 장치로 성공적으로 중계했으며, 해당 장치는 데이터를 서버에 업로드했습니다.
Getting Started
Prerequisites
- Android Studio Flamingo (or newer)
- Python 3.10+ with
pip - PostgreSQL 13+
Android
git clone https://github.com/yourorg/ocean-sentinels.git
cd ocean-sentinels/android-app
./gradlew assembleDebug
생성된 APK를 디바이스에 설치하고 위치 및 Bluetooth 권한을 부여합니다.
Backend
cd ocean-sentinels/backend
python -m venv venv
source venv/bin/activate
pip install -r requirements.txt
alembic upgrade head # apply migrations
uvicorn app.main:app --reload
Web Dashboard
cd ocean-sentinels/web-dashboard
npm install
npm run dev
브라우저에서 http://localhost:3000을 엽니다.
배포
- Backend – FastAPI 서비스를 Dockerize하고, 관리형 클라우드 인스턴스에서 PostgreSQL을 사용합니다.
- Web – 정적 빌드를 Nginx 또는 CDN을 통해 제공하세요.
- Android – Google Play(내부 테스트)를 통해 배포하거나 대상 커뮤니티에 APK를 사이드로드합니다.
구성
| 설정 | 설명 | 기본값 |
|---|---|---|
BLE_MAX_HOPS | 메시지를 삭제하기 전 최대 홉 수 | 50 |
MESSAGE_TTL_HOURS | 보류 중인 보고서의 시간 기반 만료 | 72 |
MAPBOX_TOKEN | 실시간 지도를 위한 Mapbox 액세스 토큰 | "" |
FIREBASE_SERVER_KEY | 푸시 알림을 위한 서버 키 | "" |
DATABASE_URL | PostgreSQL 연결 문자열 | postgresql://user:pass@localhost/db |
모든 값은 환경 변수로 재정의할 수 있습니다.
API 레퍼런스
- Authentication –
POST /auth/login은 JWT를 반환합니다. - Reports – 위의 Backend API 섹션을 참조하십시오.
- Users – CRUD 작업을 위한 관리자 엔드포인트 (
/users/).
전체 OpenAPI 사양은 http:///docs에서 확인할 수 있습니다.
라이선스
이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE를 확인하십시오.
테스트 자격 증명
| 역할 | 이메일 | 비밀번호 |
|---|---|---|
| 시민 | sihcitizen@vi.com | SIH@2025 |
| 구조 | sihrescue@vi.com | Ocean@123 |
| 관리자 | OceanAdmin1 | admin |
이 계정들은 Android 앱과 웹 대시보드 모두에서 작동합니다.