재난이 발생하면, 셀 타워가 먼저 무너진다 — 그래서 나는 해안 커뮤니티를 위해 메시 네트워크를 구축했다

발행: (2026년 3월 2일 오후 04:21 GMT+9)
9 분 소요
원문: Dev.to

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 기반이며; 역할 클레임에 따라 관리자 엔드포인트 접근이 결정됩니다.

프론트엔드 웹 앱

  • ReactTypeScript로 구축되었습니다.
  • 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_URLPostgreSQL 연결 문자열postgresql://user:pass@localhost/db

모든 값은 환경 변수로 재정의할 수 있습니다.

API 레퍼런스

  • AuthenticationPOST /auth/login은 JWT를 반환합니다.
  • Reports – 위의 Backend API 섹션을 참조하십시오.
  • Users – CRUD 작업을 위한 관리자 엔드포인트 (/users/).

전체 OpenAPI 사양은 http:///docs에서 확인할 수 있습니다.

라이선스

이 프로젝트는 MIT 라이선스에 따라 라이선스가 부여됩니다. 자세한 내용은 LICENSE를 확인하십시오.

테스트 자격 증명

역할이메일비밀번호
시민sihcitizen@vi.comSIH@2025
구조sihrescue@vi.comOcean@123
관리자OceanAdmin1admin

이 계정들은 Android 앱과 웹 대시보드 모두에서 작동합니다.

0 조회
Back to Blog

관련 글

더 보기 »

일이 정신 건강 위험이 될 때

markdown !Ravi Mishrahttps://media2.dev.to/dynamic/image/width=50,height=50,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fu...