灾难来临时,基站首先倒塌——于是我为沿海社区构建了网状网络

发布: (2026年3月2日 GMT+8 15:21)
7 分钟阅读
原文: Dev.to

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 为全球沿海社区提供统一的全栈安全平台。它支持四种用户角色,每种角色都有专属控制台和工作流:

RoleCapabilities
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_URLPostgreSQL 连接字符串postgresql://user:pass@localhost/db

所有值都可以通过环境变量覆盖。

API 参考

  • 身份验证POST /auth/login 返回 JWT。
  • 报告 – 请参阅上面的 后端 API 部分。
  • 用户 – 管理员端点用于 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...