从单端到“空地一体”:基于 HarmonyOS 的多端协同感知系统开发实践

从单端到"空地一体"

基于 HarmonyOS 的多端协同感知系统开发实践

作者VON
技术栈 :Vue 3 + TypeScript + Vite + DevUI
参考文档


引子:当"单车感知"遇上"空地融合"

2024 年底,我接手了一个极具挑战性的项目:构建一套面向道路安全的 车-空协同智能感知系统。目标很明确------通过"无人机 + 车载终端 + 云端地图"的联动,实现对路面风险(如坑洼、障碍物、事故)的秒级发现与预警。

起初,我本能地想到用传统方案:手机 App 接收云端推送,车载屏显示静态地图。但很快意识到,这仍是"单车感知"的延伸,无法发挥 空域视角多设备协同 的真正价值。

直到团队决定全面采用 HarmonyOS NEXT 作为开发底座,我才真正看到了突破口:鸿蒙原生的分布式能力,或许正是打通"空-地"感知链的关键


突破一:重构 UI 架构 ------ 从"适配多端"到"自适应多端"

过去做跨端开发,我的策略是"一套逻辑,多套界面"------为手机写一套 Vue 页面,为车机另写一套 React Native 组件。这种方式维护成本高,且难以保证体验一致性。

而在 HarmonyOS 中,声明式 UI(ArkTS) + 自适应布局引擎 提供了更优雅的解法。

场景驱动的响应式设计

我们的系统需运行于三类典型设备:

  • 车载终端(1080P 横屏,强光环境,操作以语音/物理按键为主)
  • 地面站平板(中等尺寸触控屏,用于操控无人机与查看实时识别结果)
  • 运维人员手机 (小屏、移动网络波动大,侧重轻量交互)

我摒弃了"按设备类型写分支"的做法,转而采用 基于屏幕特征的动态渲染策略

ts 复制代码
// 获取当前设备显示信息
import display from '@ohos.display';

@Entry
@Component
struct RoadRiskDashboard {
  build() {
    Column({ space: 12 }) {
      // 动态标题栏
      this.renderHeader()

      // 核心内容区:根据宽度决定布局模式
      if (display.defaultWidth >= 800) {
        // 大屏:左右分栏(地图 + 风险列表)
        Row() {
          MapView().width('60%')
          RiskEventList().width('40%')
        }
      } else {
        // 小屏:上下堆叠,优先保障地图可视性
        MapView().height(320)
        RiskEventList()
      }

      // 底部操作栏:仅在触控设备显示
      if (this.isTouchDevice()) {
        ActionBar()
      }
    }
    .padding(16)
  }

  renderHeader() {
    Text('道路风险预警中心')
      .fontSize(display.defaultWidth > 600 ? 24 : 18)
      .fontWeight(FontWeight.Bold)
  }

  isTouchDevice(): boolean {
    // 可通过 inputManager 或设备类型判断
    return true; // 简化示例
  }
}

这种模式下,UI 不再绑定具体设备,而是响应环境特征。即使未来接入 AR 眼镜或指挥中心大屏,只需扩展判断逻辑,无需重写整个页面。


突破二:拥抱分布式 ------ 让无人机成为"可编程的空中传感器"

如果说 UI 自适应解决了"看"的问题,那么 分布式软总线(DSoftBus) 则解决了"联"与"算"的问题。

在传统架构中,无人机与车载终端通常通过私有协议通信,开发复杂、延迟高、安全性弱。而 HarmonyOS 的分布式能力,让两者如同"同一台设备的不同模块"。

设备发现与可信组网

我们利用 @ohos.distributedHardware.deviceManager 实现自动发现:

ts 复制代码
import deviceManager from '@ohos.distributedHardware.deviceManager';

deviceManager.on('deviceFound', (deviceInfo) => {
  if (deviceInfo.deviceName.includes('Drone') && deviceInfo.networkId) {
    // 自动发起可信认证
    deviceManager.authenticateDevice(deviceInfo, (err, token) => {
      if (!err) {
        console.log('无人机已加入本地设备群');
        this.droneNetworkId = deviceInfo.networkId;
      }
    });
  }
});

一旦组网成功,无人机便成为车载系统的"远程感知单元"。

跨设备服务调用与数据流转

我们定义了一个 RoadRiskService,部署在无人机端,负责:

  • 实时分析摄像头画面(使用 MindSpore Lite 运行轻量模型)
  • 识别坑洼、落石、积水等风险
  • 生成结构化事件(含 GPS、时间戳、置信度)

车载端通过 分布式 RPC 直接调用该服务:

ts 复制代码
// 车载端发起巡检任务
async startAerialInspection(targetLocation: GeoPoint) {
  const remoteService = await rpc.connectRemoteObject(
    this.droneNetworkId,
    'com.example.road.RoadRiskService'
  );

  const result = await remoteService.invoke('scanArea', {
    center: targetLocation,
    radius: 50 // 米
  });

  // 结果自动同步至本地数据库
  this.updateLocalRiskEvents(result.events);
}

得益于 DSoftBus 的 P2P 通信优化QoS 保障机制 ,即使在无蜂窝网络的山区高速,端到端延迟仍控制在 200ms 以内

分布式数据管理:状态一致性的基石

为避免多端数据冲突,我们采用 分布式数据管理(DDM) 构建统一的风险事件模型:

ts 复制代码
// 定义分布式数据模型
const riskStore = distributedData.createKVManager({
  bundleName: 'com.example.roadguardian',
  storeName: 'risk_events'
});

// 任一设备新增事件,自动同步至其他设备
riskStore.put('event_001', JSON.stringify({
  id: 'event_001',
  type: 'pothole',
  location: { lat: 31.23, lng: 121.47 },
  timestamp: Date.now(),
  source: 'drone_01'
}));

这意味着:运维人员在手机上标记"已处理",车载大屏和指挥中心会实时更新状态,无需手动刷新或轮询。


架构演进:从"功能实现"到"体验闭环"

初期,我们只关注"能不能通"。但随着测试深入,更多工程问题浮现:

  • 无人机电量不足时如何优雅降级?
  • 车载端网络中断后如何缓存指令?
  • 多用户同时操作如何避免冲突?

我们逐步引入:

  • 设备能力抽象层:将无人机视为"带摄像头的远程设备",屏蔽硬件差异
  • 离线优先策略:关键指令本地持久化,网络恢复后自动重发
  • 操作幂等性设计:确保重复请求不会产生副作用

最终,系统不仅"能用",更"可靠、可预期、可扩展"。


结语:技术成长的本质是认知边界的拓展

一年前,我对"多端开发"的理解还停留在"写多套 UI"。如今,我学会了用 分布式思维 重新定义应用------设备不再是孤岛,而是可组合、可调度、可协同的资源单元。

HarmonyOS 给我的不仅是工具,更是一种 系统级的协作范式。在这个范式下,"车-空协同"不再是一个炫酷概念,而是一套可落地、可量产、可进化的技术路径。

这条路,我才刚刚启程。但我知道,前方是真正的"万物互联"。

代码终将过时,但协同的思想永存。

相关推荐
2401_860319522 小时前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:Overlay 遮罩层(创建一个遮罩层)
react native·react.js·harmonyos
眼眸流转3 小时前
Godot学习笔记
笔记·学习·godot
圆弧YH3 小时前
键盘→语言操作
学习
世界宇宙超级无敌究极特级顶级第一非常谱尼3 小时前
RF Power Amplifers for Wireless Communications 第一章学习笔记
笔记·学习·pa·功率放大器·mmic
dog2503 小时前
让算法去学习,而不是去启发
学习·算法
小徐不会敲代码~3 小时前
Vue3 学习
前端·javascript·vue.js·学习
!!!!!!!!!!!!!!!!.3 小时前
CTF WEB入门 命令执行篇71-124
笔记·学习·安全·ctf
zhangrelay3 小时前
Webots 2025a + ROS 2 Jazzy e-puck 机器人教程
笔记·学习·机器人
2401_860494703 小时前
【精通篇】打造React Native鸿蒙跨平台开发高级复合组件库开发系列:Slider 滑块(用于在给定的范围内选择一个值)
react native·react.js·harmonyos