灾难来临时,基站首先倒塌——于是我为沿海社区构建了网状网络
Source: Dev.to
Ocean Sentinels 是一个 Android 为主的平台,让沿海社区能够报告灾害、协调救援,即使在蜂窝或 Wi‑Fi 网络中断时也能保持连接。核心理念是将普通 Android 手机转变为使用蓝牙低功耗(BLE)的防灾中继网络。离线创建的报告会在手机之间跳转(≈ 400 米/跳),直到链中的任意设备连上互联网并将数据上传到服务器。
工作原理
[ 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,即使应用关闭也能工作
- 网页仪表盘 – 为当局提供(需要互联网)
Overview
Ocean Sentinels 为全球沿海社区提供统一的全栈安全平台。它支持四种用户角色,每种角色都有专属控制台和工作流:
| Role | Capabilities |
|---|---|
| Citizen | 提交事件报告,查看实时地图 |
| Rescue Team | 接收推送警报,核实报告,协调响应 |
| Authority | 仪表盘分析,管理用户,监督事件 |
| Admin | 完整的系统配置和用户管理 |
Key technical highlights
- Android app – Kotlin + Jetpack Compose,Hilt DI,Room 用于离线存储,前台 BLE 服务。
- BLE mesh layer – 基于时间的过期(72 h)而非跳数 TTL,兼容 Android 6+ MAC 随机化。
- Backend – FastAPI + PostgreSQL,基于角色的访问控制,WebSocket 实时更新。
- Push – Firebase Cloud Messaging 实现即时警报。
架构
+-------------------+ +-------------------+ +-------------------+
| 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 界面
- ble/ # Mesh 服务
- di/ # Hilt 模块
- data/ # Room + 仓库
/backend
/app
- routers/ # FastAPI 路由
- models/ # SQLAlchemy 模型
- services/ # 业务逻辑
/web-dashboard
/src
- components/ # React/Vue 组件
- store/ # 状态管理
后端 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 Mesh 网络
- 范围:在开放区域每跳约 400 m(使用三部手机测试)。
- 消息寿命:基于时间的 72 h 过期,确保在长链路中传递。
- 标识:使用生成的 UUID 而非 MAC 地址(Android 6+ 会随机化 MAC)。
实际测试
将三部手机间隔约 400 m 放置,成功将离线端的危害报告中继至具备互联网的设备,随后该设备将数据上传至服务器。
入门
前置条件
- Android Studio Flamingo(或更新版本)
- Python 3.10+ 并带有
pip - PostgreSQL 13+
Android
git clone https://github.com/yourorg/ocean-sentinels.git
cd ocean-sentinels/android-app
./gradlew assembleDebug
在设备上安装生成的 APK 并授予位置和蓝牙权限。
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。
部署
- 后端 – 将 FastAPI 服务 Docker 化;在托管的云实例上使用 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 参考
- 身份验证 –
POST /auth/login返回 JWT。 - 报告 – 请参阅上面的 后端 API 部分。
- 用户 – 管理员端点用于 CRUD 操作(
/users/)。
完整的 OpenAPI 规范可在 http:///docs。
许可证
本项目采用 MIT 许可证 授权。详情请参阅 LICENSE。
测试凭证
| 角色 | 邮箱 | 密码 |
|---|---|---|
| 公民 | sihcitizen@vi.com | SIH@2025 |
| 救援 | sihrescue@vi.com | Ocean@123 |
| 管理员 | OceanAdmin1 | admin |
这些账户可在 Android 应用和网页仪表板上使用。