在MongoDB Enterprise Advanced上构建战术应用程序,并将它们连接到 Ditto,以便在断开连接的环境中实现本地优先的任务数据同步。
使用案例:离线环境
行业: 边缘和移动,
产品和工具: MongoDB Enterprise Advanced
合作伙伴: Ditto
解决方案概述
断开连接的字段操作会造成数据问题。现场团队需要股票位置更新、地图项、警报、文件和消息。
依赖于云的架构可以使这些工作流程依赖于持久连接。在实际操作中很难维持这一要求。当连接失败时,团队将无法访问权限当前信息。
开发者也面临着一个相关问题。它们必须支持本地存储、同步、冲突处理和命令中心可见性。单独构建这些功能会增加每个应用程序的复杂性。
该解决方案展示了如何构建在连接受限时继续运行的战术应用程序。它使用MongoDB作为数据层,将边缘同步平台连接到MongoDB,并在数据层的基础上增加功能。
从数据层入手
使用MongoDB Enterprise Advanced作为应用程序的可信数据层。将任务实体存储为BSON文档,并将它们组织成与操作工作流程匹配的集合。 MongoDB支持在同一数据库中使用不同的文档结构。存储位置数据、地图对象、聊天消息、警报和文件,而不强制它们采用一种严格的模式。
利用这种灵活的文档模型,在一个数据平台上构建所有应用程序功能。使用MongoDB为仪表盘、API、命令工作流和下游系统提供服务。添加新的任务实体,无需重新设计整个数据库。
将边缘连接到MongoDB
使用边缘同步平台 Ditto 作为边缘同步合作。 Ditto ATAK 插件将 ATAK 设备连接到本地优先的点对点网格。 ATAK 构成用于共享位置、地图、聊天和任务数据的字段应用程序。当网络访问权限发生变化或出现故障时,Ditto 可在附近设备之间同步任务数据。
然后,使用 Ditto MongoDB Connector 将 Ditto 连接到MongoDB 。该Connector可同步 Ditto 和MongoDB之间的文档,并解决两个系统之间的并发更改。
以数据为基础
在命令中心本地运行MongoDB Enterprise Advanced 。使用MongoDB数据层构建命令中心仪表盘和其他任务应用程序。数据层和访问权限层就位后,就可以专注于应用程序功能,而不是构建单独的存储和同步服务。
使用此模式可以:
将各种任务数据存储为文档。
使用标准驱动程序和 API 将应用程序连接到MongoDB 。
与 Ditto 集成以实现离线同步。
向命令中心应用程序公开一个共享数据层。
随着新任务工作流程的出现,扩展应用程序。
参考架构
该架构使用MongoDB Enterprise Advanced作为命令中心的应用程序数据层。 MongoDB存储任务文档并为仪表盘、API 和操作工作流提供服务。 MongoDB Ops Manager管理本地MongoDB 部署。
Ditto MongoDB Connector 将MongoDB链接到 Ditto Server。 Ditto Server 通过 Ditto ATAK 插件将MongoDB数据层连接到 ATAK 中战术边缘的点对点网格。然后,更改会在MongoDB和 Ditto 之间同步,而不会在两个系统之间发生冲突。
图 1。显示MongoDB Enterprise Advanced作为命令中心数据层的架构,通过 Ditto MongoDB Connector 连接到为 ATAK字段设备提供服务的 Ditto 对等网格
战术优势
战术边缘是字段设备在接近动作点创建和交换任务数据的层,包括在连接可能发生变化或失败的情况下运行的用户和设备。
ATAK 提供用于共享位置、地图、聊天和任务数据的字段应用程序。 Ditto ATAK 插件捕获该数据,并通过点对点网格在附近的设备之间进行同步。 Ditto 使用可用的传输,如低功耗蓝牙、Wi-Fi、点对点 Wi-Fi 和 MANET 兼容路径。 Ditto 还可以在网格中的多个设备之间中继数据。
边缘充当应用程序数据的另一个来源。 Ditto 保持数据可用并在设备之间移动。 MongoDB会存储同步的文档,并使其可供命令中心应用程序使用。
Command-Center 集成
MongoDB Enterprise Advanced提供中央应用程序数据层。仪表盘从MongoDB读取任务数据,并通过地图、节点状态视图和通信源进行呈现。
Ditto MongoDB Connector 监听 Ditto 和MongoDB中的更改。它将这些更改应用到其他系统中,并使两个数据存储保持一致。
基于MongoDB构建的应用程序查询和更新任务文档,而无需直接连接到 ATAK 设备。 Ditto 处理与断开连接的边缘设备之间的传输。这种集成允许您针对MongoDB而不是直接针对 ATAK 设备构建命令中心应用程序。
为什么这种设计具有弹性
MongoDB存储任务数据。 Ditto 保持字段设备同步。 ATAK 提供字段应用程序。Connector链接两个环境并解决并发更改。
这种分离使每种技术都专注于一项职责。 MongoDB提供应用程序数据层,Ditto 跨战术边缘同步数据,ATAK 提供字段经验。
这种设计允许您根据 MongoDB 的文档模型构建应用程序功能,而无需为每个设备或网络条件实现单独的存储模型。
数据模型方法
将每个任务实体存储在与应用程序使用方式相匹配的文档中。
位置更新、地图对象和聊天消息具有不同的字段和更新模式。将它们存储在单独的集合中,而不是强制每个实体采用一种严格的模式。这种方法使数据模型接近边缘生成的数据,并减少 Ditto 和MongoDB之间的转换代码。这些文档可用于离线边缘的实时分析和AI查询。
Ditto ATAK 插件写入 Ditto ATAK v2模式。该模式对基于 CoT 的数据使用紧凑的字段名称。以下示例显示了与应用程序开发最相关的领域。
将位置数据存储在 track 集合中
使用 track集合获取来自字段参与者的位置和状态数据。查询这些文档以在命令中心地图上显示当前和过时的设备。
{ "_id": "ANDROID-4486046569cda611", // document identifier "_r": false, // soft-delete flag "c": "MDB Actor 2", // display name "d": "ANDROID-4486046569cda611", // source device "e": "MDB Actor 2", // actor callsign "j": 19.451227, // latitude "l": -99.139832, // longitude "o": 1776886448640, // stale time "w": "a-f-G-U-C" // CoT type }
紧凑模式使同步的文档接近于 ATAK 生成的数据。 MongoDB存储文档时不需要单独的关系映射层。
将消息存储在 chat 集合中
将 chat集合用于字段用户和命令工作流程之间交换的消息。该集合使用与追踪不同的形状,其中包含消息文本、发件人、房间和时间戳字段。
{ "_id": "b547f0b4-c371-4aff-ac1d-3bafe110a9e1", // message identifier "_r": false, // soft-delete flag "authorType": "a-f-G-U-C", // sender CoT type "b": 1776735193948, // message timestamp "d": "COMMAND-VEHICLE", // source device "e": "COMMAND", // sender callsign "msg": "Command", // message text "room": "Ditto", // room name "roomId": "ChatContact-Ditto" // room identifier }
MongoDB允许应用程序将消息文档与 track 文档一起存储,而无需添加空位置字段或强制两个实体采用相同的结构。
将地图对象保留在 mapitem 集合中
将 mapitem集合用于持久地图图形和共享任务对象。
使用 MongoDB 的文档模型,按照应用程序所需的形式存储每个任务实体。将 track、mapitem 和 chat 保留在不同的集合中,因为它们代表不同的数据和访问权限模式。这种方法可以让您构建地图、状态和通信功能,而无需将所有任务数据强制采用一个严格的模式。
Collection | 用途 | 示例应用程序使用 |
|---|---|---|
| 位置和状态数据 | 渲染字段actor 和过时节点。 |
| 持久映射对象 | 显示共享标记和地图图形。 |
| 消息和对话元数据 | 在命令中心仪表盘显示通信。 |
将每个集合用于一个任务函数,并将所有集合保留在一个MongoDB数据层中。添加字段或新任务实体,而无需重新设计现有集合。
针对一个灵活的数据层进行构建
针对MongoDB构建仪表盘、API 和命令中心工作流程。根据其用途查询每个集合,并保留从边缘到达的文档结构。
使用此方法可以:
减少 Ditto 和MongoDB之间的数据转换。
保持每个任务实体易于查询。
添加新字段,无需重新设计不相关的文档。
扩展应用程序,无需为每个设备或工作流程创建单独的存储模型。
构建解决方案
使用 tak-situational-demo Github存储库来部署和探索解决方案。
准备字段设备
在继续之前,请确保您满足以下要求:
设置两台或更多 Android 设备。
确保每台设备运行 Android 13 或更高版本,具有至少 4 GB RAM。
在每台设备上安装 ATAK CIV 并批准所有必要的设备权限,包括 GPS访问权限。
获取 Ditto ATAK 插件并将应用程序旁加载到每部手机上。
将每台设备加入托管命令站的本地 Wi-Fi 环境。
部署命令中心堆栈
从根文件夹执行 make setup。出现任何错误后,您可以安全地重新运行此脚本,因为它会从停止的地方继续运行。它按顺序初始化组件:
MongoDB Ops Manager在集群内运行,用于管理Enterprise Advanced。
通过Ops Manager预配的MongoDB Enterprise Advanced副本集。
Ditto Operator 以及自托管的 Ditto Server实例。
Ditto MongoDB Connector,作为原生Kubernetes对象进行预配。
命令中心仪表盘应用程序。
此脚本为此解决方案创建数据库、用户和集合。等待 25 到 35 分钟进行初始设置。
完成后,输出显示仪表盘URL、 Compass连接字符串、 Ops Manager凭证和边缘设备所需的配对值。
执行 make verify 以验证您的环境。此步骤将文档插入MongoDB并通过 Ditto Server 检索该文档,从而检查双向同步。
有关完整的命令、配置详细信息和部署清单,查看TAK 情况演示存储存储库中的 docs/RUN_LOCAL.md。
配置同步
使用 Ditto MongoDB Connector 自动配置。将Connector声明为Kubernetes BigPeerDataBridge资源,以在战术单位和指挥中心应用程序之间双向同步track、mapitem、chat、file 和 alert 集合。
将 Ditto 服务器托管在与MongoDB相同的Kubernetes集群中,以便在内部路由流量。通过标准MongoDB连接字符串进行连接,无需公开公共端点或管理IP白名单。
在初始化Connector之前验证这些先决条件:
确认目标数据库和集合存在。
向Connector用户授予
readWrite权限。在所有同步集合上启用
changeStreamPreAndPostImages,以保持平台之间的因果一致性。
应用软删除标志 (_r: true) 来标记已过时的文档。 MongoDB中的硬删除触发Ditto 中的永久清除操作。使用 _r: false 筛选器查询操作数据。
配对战术单位
启动操作用户界面,然后单击“添加设备”。该叠加层显示一个 QR 码以及以下文本参数: App ID、身份验证端点、WebSocket 端点和 Playground 令牌。运行 make pair 以在终端中显示这些凭证。
在每个目标硬件设备上启动 ATAK 和 Ditto ATAK 插件。扫描生成的 QR 码或在插件偏好设置中输入连接变量。关闭 Ditto 云同步,将网络流量引向本地 Ditto 服务器部署。
打开位置服务,以便 ATAK 生成位置遥测数据。对加入本地网状网络的每个设备重复这些配置步骤。遥测更新会快速呈现在中央仪表盘地图上。
查看 TAK 情况演示存储库中的 docs/RUN_LOCAL.md,获取分步设备载入说明。
探索操作工作流程
通过 http://localhost 访问操作仪表盘。映射界面会显示字段角色并调暗非活动节点。遥测面板提供活动呼号,而聊天窗口则流式传输字段传输。
直接从中央界面调度消息或删除地图标记。仪表盘将新文档写入MongoDB,Connector通过 Ditto Server 将更新广播到共享数据层上的每个配对手持设备。
将MongoDB Compass连接到 localhost:27017 以检查原始应用程序文档,并打开Ops Manager像生产管理员一样监控集群。
关键要点
首先构建应用程序数据层:使用MongoDB Enterprise Advanced为仪表盘、API 和命令中心工作流程存储和提供服务任务数据。
将任务实体建模为文档:使用MongoDB集合存储位置数据、地图对象、聊天消息、文件和警报,而无需强制使用严格的模式。
将MongoDB连接到边缘:使用 Ditto MongoDB Connector 将MongoDB支持的应用程序扩展到断开连接的 ATAK 设备。
简化应用程序开发:根据一个MongoDB数据层构建应用程序功能,而不是为每种设备或网络条件创建单独的存储模型。
离线操作设计:将 MongoDB 的持久性文档存储与 Ditto 的本地优先同步和冲突处理相结合。
作者
Timothy Marland, MongoDB
Alberto Camarena Rodriguez, MongoDB