13
头图

前言

当前,多数智能家居设备在基础硬件性能上已能满足日常需求,但用户的实际体验并未因此变得顺畅。在手机上选好菜谱后,仍需切换应用启动烤箱;称重完成的数据无法自动流转到下一环节;想把烹饪画面投到大屏,常常要经历繁琐的配对操作……设备数量增加,反而让操作更加分散,智能停留在单品层面,难以真正提升整体体验。
在秦骏和团队看来,这并非无解难题,而是一个亟待系统攻克的体验课题。作为鸿蒙生态的早期开发者和华为鸿蒙应用开发高级认证获得者,秦骏将多年客户端开发经验聚焦于厨房场景,主导开发了鸿蒙原生应用《实验厨房》。在他看来,设备密度大,操作节奏快,出错余地小的厨房,恰好是检验多端协同是否真正可用的绝佳场景。

协同能力下沉,撑起体验底盘

秦骏第一次接触鸿蒙,是在 HarmonyOS 发布初期。当时他正关注跨设备协同领域的技术动向。看到鸿蒙提出的“万物互联”理念,以及“一套系统满足多终端设备需求”的架构设想,他立刻意识到,这可能是改变智能体验的根本逻辑。

过去多设备交互往往依赖多个系统与应用的适配,流程繁琐、体验割裂;而鸿蒙通过将协同能力下沉到系统层,使得设备发现、数据同步、任务调度成为系统级能力。这种能力,落到技术上,秦骏认为关键在于分布式软总线与原子化服务的深度融合。

分布式软总线能够实现设备间无感发现、低时延连接与高效传输,让多终端协同从“技术难题”变成“基础能力”。原子化服务则以按需调用的方式把服务送到用户当下最需要的位置,降低使用门槛。对智能家居而言,这两者几乎是体验的底盘。前者让设备真正联动,后者让服务自然触达。

在秦骏看来,这套机制的价值在于,它让多设备真正以统一逻辑协同工作成为可能。

正是这种判断,让他决定押注鸿蒙生态。一方面,他长期关注智能家居中的多设备协同问题,而鸿蒙提供的系统级能力让过去难以落地场景有了实现路径;另一方面,鸿蒙生态尚在早期,文档、工具和社区都在快速演进,开发者有机会参与底层交互逻辑的构建,而不只是在成熟平台上做功能微调。这种参与感,对他而言尤为珍贵。

多年客户端开发的经验,成为他快速切入鸿蒙开发的重要基础。过去在跨平台适配中积累的经验,让他能迅速把握手机、平板、智慧屏、智能厨电等设备的交互差异。分布式场景下的数据同步与任务调度,也因过往性能优化的经验而少走弯路。

而更深层的积累,是一种长期训练出的体验直觉。他清楚,技术可以复杂,但用户路径必须连贯;设备可以多样,但操作逻辑不能割裂。正是这种坚持,让《实验厨房》在分布式架构之上,实现了流畅的用户体验。

原生能力落地,助力服务创新

真正让秦骏得以深入了解鸿蒙的契机,是备考华为鸿蒙应用开发高级认证的过程。他坦言,真正的挑战不在于掌握 ArkTS、UI 、生命周期管理等基础内容,而在于要吃透分布式数据管理、分布式任务调度、原子化服务开发等鸿蒙独有模块,这些模块正是《实验厨房》核心功能实现的关键。

备考期间,他通过阅读官方文档、搭建自研 Demo、参与开发者社区讨论,深入验证技术细节。以分布式数据同步为例,他反复调试多设备间的传输逻辑,特别是在断连重连场景下确保状态一致性,这为《实验厨房》中 “菜谱 - 记录” 关系型数据的跨设备同步提供了技术保障,让用户在任一设备上编辑的菜谱、记录的烹饪实践都能实时同步至其他设备。这个过程耗时,却让他真正吃透了鸿蒙 “一次开发、多端部署” 背后的技术支撑,也为《实验厨房》采用 ArkUI 前端框架实现多设备自适应界面奠定了基础。

也正是在这个过程中,他找到了自己的技术方向:聚焦鸿蒙原生应用在智能家居场景的技术落地与创新,而《实验厨房》就是这一方向的具体实践。

核心页面与操作演示

《实验厨房》的界面设计深度贴合鸿蒙多端适配特性,核心页面流程清晰连贯,覆盖 “选菜谱 - 做记录 - 多设备联动” 全场景:

1.瀑布流首页(多设备自适应):手机端采用垂直瀑布流布局,以高清菜谱成品图为核心,搭配难度星级、预估耗时等关键信息卡片,支持下拉刷新与懒加载;智慧屏端自动适配横向网格布局,放大菜谱图片与操作按钮,方便烹饪时远距离查看。用户点击任意菜谱卡片,即可触发分布式拉起 —— 手机端打开详情编辑页,智慧屏同步显示步骤流程图,烤箱端自动唤醒并准备接收参数。

2.菜谱详情页(黄桃罐头示例):顶部展示高清成品图,下方分模块呈现基础信息卡(大号加粗字体显示菜名,星级可视化难度,细分准备 / 烹饪 / 冷却时间)、食材清单(带勾选功能,标注特殊说明与消毒提示)、步骤流程图(每步配示意图 + 文字说明,支持左右滑动切换)。点击步骤中的 “下发至烤箱” 按钮,无需跳转应用,系统通过原子化服务直接将蒸制温度、时间参数同步至关联设备,同时弹出权限申请弹窗,确认后立即执行预热操作。

3.烹饪记录编辑页:支持时间轴式添加内容,用户可拍摄图片、输入文字备注,系统自动添加时间戳。例如调整冰糖比例为 1:5 时,可标注 “原菜谱 1:6,此比例更甜”,并上传糖水沸腾特写图;点击 “关联菜谱” 可直接绑定原食谱,形成 “菜谱 - 记录” 追溯链路。记录完成后,点击 “多端同步”,数据通过分布式数据对象实时同步至手机、平板、智慧屏,确保所有设备显示一致。

4.原子化服务卡片:在鸿蒙桌面或负一屏,用户可添加 “今日食谱”“烤箱状态”“采购清单” 卡片。“烤箱状态” 卡片实时显示当前温度、剩余时间,支持一键暂停 / 继续;“采购清单” 可通过食材识别功能自动生成,用户勾选后可直接同步至手机购物 APP,实现 “从厨房到超市” 的无缝衔接。

关键技术代码示例

秦骏团队在开发中,将鸿蒙分布式能力与应用场景深度绑定,以下为核心功能的代码片段及解析:

1. 分布式设备发现与菜谱下发(基于分布式软总线)

import { distributedDeviceManager, DistributedDevice } from '@ohos.distributedDevice';
import { recipeManager } from '../model/RecipeManager';

// 设备发现与连接
async function discoverKitchenDevices() {
  try {
    // 筛选厨房类智能设备(烤箱、智能秤等)
    const devices: DistributedDevice[] = await distributedDeviceManager.discoverDevices({
      deviceType: ['kitchen_appliance'],
      transportType: 'wifi' // 优先WiFi传输,保障低时延
    });
    // 自动连接已绑定设备
    for (const device of devices) {
      if (device.isBound) {
        await distributedDeviceManager.connectDevice(device.deviceId);
        console.log(`已连接设备:${device.deviceName}`);
      }
    }
  } catch (error) {
    console.error(`设备发现失败:${error.message}`);
  }
}

// 向烤箱下发菜谱参数
async function sendRecipeToOven(recipeId: string) {
  const recipe = await recipeManager.getRecipeById(recipeId);
  const ovenDevice = distributedDeviceManager.getBoundDeviceByType('oven');
  
  if (ovenDevice && ovenDevice.isConnected) {
    // 封装烹饪参数(高优先级数据)
    const cookingParams = {
      temperature: recipe.cookingTemp, // 从菜谱中获取温度
      time: recipe.cookingTime, // 从菜谱中获取时间
      recipeName: recipe.name,
      priority: 'high' // 标记为高优先级,保障传输稳定性
    };
    
    // 通过分布式软总线发送数据
    await distributedDeviceManager.sendData({
      deviceId: ovenDevice.deviceId,
      data: JSON.stringify(cookingParams),
      serviceType: 'cooking_control'
    });
    console.log(`菜谱${recipe.name}已下发至${ovenDevice.deviceName}`);
  }
}

解析:该代码实现了厨房智能设备的无感发现与连接,通过筛选设备类型精准定位烤箱、智能秤等相关设备;下发菜谱参数时,将核心数据标记为高优先级,确保在网络波动时仍能优先传输,避免烹饪过程中出现参数延迟或偏差。

2. 分布式数据同步(基于 DataObject)

import { DistributedDataObject, dataObjectManager } from '@ohos.data.distributedData';
import { CookingRecord } from '../model/CookingRecord';

// 初始化烹饪记录分布式数据对象
function initCookingRecordDataObject(recordId: string): DistributedDataObject {
  // 创建跨设备共享的数据对象
  const dataObject = dataObjectManager.createDataObject({
    storeId: 'cooking_record_store',
    objectKey: `record_${recordId}`,
    syncMode: 'real_time' // 实时同步模式
  });
  
  // 定义数据结构(与记录模型一致)
  dataObject.defineProperties({
    title: { type: 'string', defaultValue: '' },
    createTime: { type: 'string', defaultValue: '' },
    steps: { type: 'array', defaultValue: [] },
    relatedRecipeId: { type: 'string', defaultValue: '' }
  });
  
  // 监听数据变化,同步至本地数据库
  dataObject.on('dataChange', (changes) => {
    const updatedRecord: CookingRecord = {
      id: recordId,
      title: dataObject.getValue('title'),
      createTime: dataObject.getValue('createTime'),
      steps: dataObject.getValue('steps'),
      relatedRecipeId: dataObject.getValue('relatedRecipeId')
    };
    // 更新本地RDB数据库
    recipeManager.updateCookingRecord(updatedRecord);
  });
  
  return dataObject;
}

// 保存烹饪记录(多端同步)
async function saveCookingRecord(record: CookingRecord) {
  const dataObject = initCookingRecordDataObject(record.id);
  // 设置数据(自动同步至所有关联设备)
  dataObject.setValue('title', record.title);
  dataObject.setValue('createTime', record.createTime);
  dataObject.setValue('steps', record.steps);
  dataObject.setValue('relatedRecipeId', record.relatedRecipeId);
  
  await dataObject.flush(); // 强制刷新,确保数据实时同步
}

解析:通过分布式数据对象(DataObject)封装烹饪记录数据,采用实时同步模式,确保用户在手机上编辑的记录能即时同步至智慧屏、平板等设备;同时监听数据变化,同步更新本地 RDB 关系型数据库,保障数据一致性与完整性,实现 “一次编辑,多端可用”。

3. 原子化服务卡片(烤箱状态展示)

// oven_status_card.ets
@Entry
@Component
struct OvenStatusCard {
  @State temperature: number = 0;
  @State remainingTime: number = 0;
  @State isWorking: boolean = false;
  
  build() {
    Column() {
      Text('烤箱状态')
        .fontSize(16)
        .fontWeight(FontWeight.Bold)
        .margin({ bottom: 8 });
      
      Row() {
        Text('当前温度:')
          .fontSize(14);
        Text(`${this.temperature}℃`)
          .fontSize(18)
          .fontColor(this.isWorking ? Color.Red : Color.Black);
      }
      .margin({ bottom: 4 });
      
      Row() {
        Text('剩余时间:')
          .fontSize(14);
        Text(`${this.remainingTime}分钟`)
          .fontSize(18)
          .fontColor(this.isWorking ? Color.Red : Color.Gray);
      }
      .margin({ bottom: 8 });
      
      Button(this.isWorking ? '暂停' : '继续')
        .width('100%')
        .onClick(() => {
          // 调用分布式服务控制烤箱
          this.controlOven(!this.isWorking);
        });
    }
    .padding(12)
    .width('100%');
  }
  
  // 初始化时获取烤箱状态
  aboutToAppear() {
    this.fetchOvenStatus();
    // 定时刷新状态(每3秒)
    setInterval(() => {
      this.fetchOvenStatus();
    }, 3000);
  }
  
  // 从分布式设备获取烤箱状态
  async fetchOvenStatus() {
    const ovenDevice = distributedDeviceManager.getBoundDeviceByType('oven');
    if (ovenDevice && ovenDevice.isConnected) {
      const statusData = await distributedDeviceManager.receiveData({
        deviceId: ovenDevice.deviceId,
        serviceType: 'oven_status'
      });
      const status = JSON.parse(statusData);
      this.temperature = status.temperature;
      this.remainingTime = status.remainingTime;
      this.isWorking = status.isWorking;
    }
  }
  
  // 控制烤箱启停
  async controlOven(isStart: boolean) {
    const ovenDevice = distributedDeviceManager.getBoundDeviceByType('oven');
    if (ovenDevice && ovenDevice.isConnected) {
      await distributedDeviceManager.sendData({
        deviceId: ovenDevice.deviceId,
        data: JSON.stringify({ isWorking: isStart }),
        serviceType: 'oven_control'
      });
      this.isWorking = isStart;
    }
  }
}

解析:该代码实现了烤箱状态原子化卡片,通过定时从分布式设备获取状态数据,实时展示温度、剩余时间;支持一键控制烤箱启停,无需打开主应用,直接通过卡片完成核心操作,契合鸿蒙原子化服务 “按需调用、自然触达” 的理念,极大提升厨房操作效率。

应用还尝试更主动的服务逻辑。通过智能冰箱同步的食材库存数据,结合用户过往的烹饪习惯,《实验厨房》能推荐适配现有食材的菜谱,而不是让用户先选菜再看缺什么。这种 “用已有食材决定做什么” 的思路,更贴近真实的厨房逻辑,更利于提升用户体验,同时也呼应了应用 “智能辅助烹饪” 的核心功能,比如借助计算机视觉的食材识别技术自动生成食材清单,通过自然语言处理分析用户记录提供步骤优化建议。

这些流畅的体验,建立在多设备状态高度一致的基础之上。秦骏坦言,多设备协同中最棘手的问题是状态的实时性与一致性。烤箱当前的温度和剩余时间必须在手机与智慧屏上保持同步,任何延迟或偏差都可能让用户误判烹饪进度。为解决这一问题,团队采用分布式数据对象(DataObject)封装关键状态,并将烹饪相关数据标记为高优先级,确保在网络波动时核心信息仍能优先传输,这一技术方案也保障了《实验厨房》中烹饪实践记录的时间轴式流程展示与数据准确性,让用户能完整追溯每次烹饪改进。

权限机制的设计同样需要精细权衡。系统仅在用户明确触发 “下发食谱” 等操作时临时申请设备控制权限,任务一旦完成便立即释放。这种按需授权、用完即收的方式,在保障功能可用的同时,也尽可能降低对用户隐私和信任的消耗,与《实验厨房》注重用户数据安全与隐私保护的设计原则一致。

同时,《实验厨房》的技术架构深度契合鸿蒙生态特性,前端采用 ArkUI 框架保障原生性能与声明式开发效率,数据持久化通过 RDB 关系型数据库保证菜谱数据的一致性和完整性,文件系统专门存储烹饪过程中的图片、视频等多媒体数据,再结合图像处理服务实现食材图片的智能裁剪与优化显示,让应用在多设备上都能呈现出直观美观的瀑布流菜谱浏览体验。

未来与建议

谈到行业未来,秦骏认为鸿蒙为智能家居提供了一种新的可能。未来几年,他看好三个方向:一是设备能自动组网,用户无需手动配对就能实现无感协同;二是 AI 与鸿蒙深度融合,让系统从被动响应指令转向主动理解需求、提供服务;三是跨品牌生态全面打通,最终实现一个入口管理全家设备。在他看来,智能家居的下一步,是从“功能联动”走向“体验融合”,从“设备智能”走向“服务智能”。

这些想法,他没有停留在判断层面,而是带回了开发一线。在思否社区,秦骏主动分享了实战教程,参与了技术问答,涵盖分布式数据同步、原子化服务卡片开发等内容。他相信,好的经验应该能被复现,也能激发新的问题,而别人的问题往往就是你的下一步方向。

对于刚入门鸿蒙的开发者,他的建议同样务实。先理解分布式与原子化服务的核心理念,再通过 Demo 验证端到端的协同链路。在此基础上,深入理解分布式数据管理与任务调度的机制;最终聚焦一个场景深耕,把能力沉淀成可复用的方案。

生态真正的增长,离不开一批愿意持续投入、愿意把经验写成方法的人。也正因此,秦骏特别鼓励开发者关注鸿蒙领航者计划。“我相信,加入鸿蒙领航者计划,努力成为鸿蒙极客,不仅能够获得与行业专家深度交流的机会,还能不断提升自己的技术水平。开发者更加全面地理解鸿蒙生态的核心优势,从而为个人成长和整个社区贡献更多价值。”

采访最后,秦骏给年轻开发者留下一句话:“别怕从零开始,鸿蒙生态正处在能做事的阶段,每个早期参与者都有机会成为建设者和受益者。要相信技术的价值永远在你写下的每一行代码里。”

报名链接 👉:鸿蒙领航者招募|加入领航者阵营,共享共建鸿蒙新世界


思否编辑部
4.9k 声望117k 粉丝

思否编辑部官方账号,欢迎私信投稿、提供线索、沟通反馈。