HarmonyOS分布式实战:智能灯控APP项目解析 原创
头像 巴拉巴拉~~ 2025-12-10 21:22:51    发布
15580 浏览 382 点赞 0 收藏

引言

HarmonyOS的核心竞争力之一是分布式技术,其通过分布式软总线、分布式数据管理等能力,实现了多设备之间的无缝连接与协同。本文以“智能灯控APP”为实战案例,解析如何基于鸿蒙分布式技术实现手机、平板等设备控制智能灯(模拟设备),包括设备发现、连接、数据同步等核心功能,为开发者提供分布式应用开发的实战思路。

一、项目背景与需求

随着智能家居的普及,用户希望通过多终端控制家中智能设备。本项目实现一款智能灯控APP,具备以下功能:1. 自动发现同一局域网内的智能灯设备;2. 建立手机与智能灯的分布式连接;3. 控制智能灯的开关、亮度调节、颜色切换;4. 多终端控制状态同步(如手机控制后,平板端实时显示灯的状态)。

技术选型:采用ArkTS语言开发,基于鸿蒙分布式软总线实现设备发现与通信,分布式数据对象实现状态同步,ArkUI构建UI界面。

二、核心技术原理

2.1 分布式软总线

分布式软总线是鸿蒙分布式技术的通信基础,为不同设备之间提供低延迟、高可靠的点对点通信能力。开发者无需关注底层通信协议,通过DeviceManager、SessionManager等API即可实现设备发现、连接建立和数据传输。

2.2 分布式数据对象

分布式数据对象(DistributedDataObject)是实现多设备状态同步的核心。通过将设备状态封装为分布式数据对象,当其中一个设备修改该对象时,其他连接的设备会实时收到状态变化通知,无需手动编写数据同步逻辑。

三、项目架构设计

本项目采用分层架构设计,分为UI层、业务逻辑层、分布式服务层,各层职责清晰,便于维护和扩展。

  1. UI层:基于ArkUI声明式开发,包含设备发现页面、灯控主页面,负责用户交互和界面展示;
  2. 业务逻辑层:封装灯控业务逻辑,如亮度计算、颜色转换,处理UI层与分布式服务层的交互;
  3. 分布式服务层:封装分布式相关操作,如设备发现、连接管理、分布式数据对象创建与更新,提供统一的API给业务逻辑层。

四、核心功能实现

4.1 权限配置

分布式功能需要申请相关权限,在“main_pages.json”同级目录的“module.json5”文件中添加权限配置:

{
  "module": {
    "reqPermissions": [
      {
        "name": "ohos.permission.DISTRIBUTED_DEVICE_MANAGER",
        "reason": "需要获取分布式设备管理权限以发现设备",
        "usedScene": { "ability": ["com.example.lightcontrol.MainAbility"], "when": "inuse" }
      },
      {
        "name": "ohos.permission.DISTRIBUTED_DATA_MANAGER",
        "reason": "需要获取分布式数据管理权限以同步设备状态",
        "usedScene": { "ability": ["com.example.lightcontrol.MainAbility"], "when": "inuse" }
      }
    ]
  }
}

4.2 分布式服务层实现

创建“distributed”目录,封装分布式服务类“DistributedService.ets”:

import distributedDeviceManager from '@ohos.distributedDeviceManager';
import distributedData from '@ohos.data.distributedData';

// 定义智能灯状态接口
export interface LightState {
  isOn: boolean; // 开关状态
  brightness: number; // 亮度0-100
  color: string; // 颜色值,如#ff0000
}

export class DistributedService {
  private ddm: distributedDeviceManager.DeviceManager | null = null;
  private dataManager: distributedData.DataManager | null = null;
  private lightData: distributedData.DistributedDataObject<LightState> | null = null;
  // 设备列表
  public deviceList: Array<{ deviceId: string, deviceName: string }> = [];

  // 初始化分布式服务
  async init() {
    // 初始化DeviceManager
    this.ddm = distributedDeviceManager.createDeviceManager('com.example.lightcontrol');
    if (!this.ddm) {
      throw new Error('初始化DeviceManager失败');
    }
    // 初始化DataManager
    this.dataManager = distributedData.createDataManager();
    if (!this.dataManager) {
      throw new Error('初始化DataManager失败');
    }
    // 创建分布式数据对象,指定别名“LightState”
    this.lightData = await this.dataManager.createDistributedDataObject<LightState>('LightState');
    // 初始化灯状态默认值
    if (!this.lightData.isOn) {
      this.lightData.isOn = false;
      this.lightData.brightness = 50;
      this.lightData.color = '#ffffff';
    }
  }

  // 发现分布式设备
  startDeviceDiscovery() {
    if (!this.ddm) {
      throw new Error('DeviceManager未初始化');
    }
    // 开始发现设备
    this.ddm.startDeviceDiscovery('ohos.distributed.device');
    // 监听设备发现事件
    this.ddm.on('deviceFound', (data) => {
      // 过滤掉本机设备
      if (data.deviceId !== this.ddm?.getLocalDeviceId()) {
        this.deviceList.push({
          deviceId: data.deviceId,
          deviceName: data.deviceName
        });
      }
    });
  }

  // 建立设备连接
  connectDevice(deviceId: string) {
    if (!this.ddm) {
      throw new Error('DeviceManager未初始化');
    }
    // 建立与目标设备的连接
    this.ddm.connectDevice(deviceId, (err) => {
      if (err) {
        console.error(`连接设备失败:${err.message}`);
      } else {
        console.log(`连接设备${deviceId}成功`);
      }
    });
  }

  // 更新灯状态
  updateLightState(state: Partial<LightState>) {
    if (!this.lightData) {
      throw new Error('分布式数据对象未初始化');
    }
    // 更新状态(分布式数据对象会自动同步到其他设备)
    Object.assign(this.lightData, state);
  }

  // 监听灯状态变化
  onLightStateChange(callback: (state: LightState) => void) {
    if (!this.lightData) {
      throw new Error('分布式数据对象未初始化');
    }
    // 监听分布式数据对象变化
    this.lightData.on('change', (data) => {
      callback(data as LightState);
    });
  }
}

4.3 业务逻辑层实现

创建“business”目录,封装灯控业务类“LightControlService.ets”:

import { DistributedService, LightState } from '../distributed/DistributedService';

export class LightControlService {
  private distributedService: DistributedService;

  constructor() {
    this.distributedService = new DistributedService();
  }

  // 初始化服务
  async init() {
    await this.distributedService.init();
  }

  // 开始发现设备
  startDiscoverDevice() {
    this.distributedService.startDeviceDiscovery();
  }

  // 获取设备列表
  getDeviceList() {
    return this.distributedService.deviceList;
  }

  // 连接设备
  connectDevice(deviceId: string) {
    this.distributedService.connectDevice(deviceId);
  }

  // 控制灯开关
  toggleLight(isOn: boolean) {
    this.distributedService.updateLightState({ isOn });
  }

  // 调节亮度
  adjustBrightness(brightness: number) {
    // 确保亮度在0-100范围内
    const validBrightness = Math.max(0, Math.min(100, brightness));
    this.distributedService.updateLightState({ brightness: validBrightness });
  }

  // 切换颜色
  changeColor(color: string) {
    this.distributedService.updateLightState({ color });
  }

  // 监听灯状态变化
  onLightStateChange(callback: (state: LightState) => void) {
    this.distributedService.onLightStateChange(callback);
  }
}

4.4 UI层实现(灯控主页面)

import { LightControlService } from '../business/LightControlService';

@Entry
@Component
struct LightControlPage {
  private lightService: LightControlService = new LightControlService();
  @State lightState: { isOn: boolean, brightness: number, color: string } = {
    isOn: false,
    brightness: 50,
    color: '#ffffff'
  };
  @State deviceList: Array<{ deviceId: string, deviceName: string }> = [];

  async aboutToAppear() {
    // 初始化服务
    await this.lightService.init();
    // 监听灯状态变化
    this.lightService.onLightStateChange((state) => {
      this.lightState = state;
    });
    // 开始发现设备
    this.lightService.startDiscoverDevice();
    // 定时获取设备列表(实际开发中可通过回调优化)
    setInterval(() => {
      this.deviceList = this.lightService.getDeviceList();
    }, 1000);
  }

  build() {
    Column({ space: 20 }) {
      // 设备选择区域
      Text('已发现设备')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .margin({ top: 30, left: 20 })

      List({ space: 10 }) {
        ForEach(this.deviceList, (device) => {
          ListItem() {
            Button(device.deviceName)
              .width('90%')
              .height(40)
              .onClick(() => {
                this.lightService.connectDevice(device.deviceId);
              })
          }
        }, (device) => device.deviceId)
      }
      .width('100%')

      // 灯状态展示
      Stack() {
        // 模拟灯的效果
        Circle()
          .width(this.lightState.isOn ? 200 : 180)
          .height(this.lightState.isOn ? 200 : 180)
          .fill(this.lightState.isOn ? this.lightState.color : '#eeeeee')
          .opacity(this.lightState.isOn ? this.lightState.brightness / 100 : 0.5)

        Text(this.lightState.isOn ? '灯已开启' : '灯已关闭')
          .fontSize(18)
          .fontColor('#333333')
      }
      .margin({ top: 20 })

      // 开关控制
      Button(this.lightState.isOn ? '关闭' : '开启')
        .width('30%')
        .height(40)
        .backgroundColor(this.lightState.isOn ? '#ff3b30' : '#007aff')
        .fontColor('#ffffff')
        .onClick(() => {
          this.lightService.toggleLight(!this.lightState.isOn);
        })

      // 亮度调节
      Column({ space: 10 }) {
        Text(`亮度:${this.lightState.brightness}%`)
          .fontSize(16)

        Slider({
          value: this.lightState.brightness,
          min: 0,
          max: 100,
          step: 1
        })
          .width('80%')
          .onChange((value) => {
            this.lightService.adjustBrightness(value);
          })
      }

      // 颜色选择
      Row({ space: 15 }) {
        this.ColorButton('#ff0000', '红色')
        this.ColorButton('#00ff00', '绿色')
        this.ColorButton('#0000ff', '蓝色')
        this.ColorButton('#ffff00', '黄色')
      }
    }
    .width('100%')
    .backgroundColor('#f5f5f5')
  }

  // 自定义颜色选择按钮组件
  @Builder
  ColorButton(color: string, text: string) {
    Column({ space: 5 }) {
      Circle()
        .width(40)
        .height(40)
        .fill(color)
        .border({ width: this.lightState.color === color ? 2 : 0, color: '#000000' })

      Text(text)
        .fontSize(14)
    }
    .onClick(() => {
      this.lightService.changeColor(color);
    })
  }
}

五、测试与验证

1. 设备准备:准备两部搭载HarmonyOS 4.0及以上的设备(如手机和平板),确保两部设备连接同一WiFi,登录同一华为账号。

2. 部署应用:将APP分别部署到两部设备上,打开APP后,设备会自动发现对方,点击设备名称建立连接。

3. 功能验证:在手机端点击“开启”按钮,平板端的灯状态会实时变为开启;调节手机端的亮度滑块或选择颜色,平板端的灯效果会同步变化,反之亦然,验证了分布式状态同步功能的有效性。

六、总结与优化方向

本文通过智能灯控APP实战,解析了鸿蒙分布式技术的核心应用场景,包括设备发现、连接建立和状态同步。项目采用分层架构设计,降低了各模块的耦合度,便于后续扩展。

后续优化方向:1. 增加设备认证功能,提升通信安全性;2. 支持离线状态缓存,设备重新连接后同步历史状态;3. 扩展控制场景,如定时开关、场景模式(如阅读模式、睡眠模式)。


©本站发布的所有内容,包括但不限于文字、图片、音频、视频、图表、标志、标识、广告、商标、商号、域名、软件、程序等,除特别标明外,均来源于网络或用户投稿,版权归原作者或原出处所有。我们致力于保护原作者版权,若涉及版权问题,请及时联系我们进行处理。
分类
HarmonyOS
地址:北京市朝阳区北三环东路三元桥曙光西里甲1号第三置业A座1508室 商务内容合作QQ:2291221 电话:13391790444或(010)62178877
版权所有:电脑商情信息服务集团 北京赢邦策略咨询有限责任公司
声明:本媒体部分图片、文章来源于网络,版权归原作者所有,我司致力于保护作者版权,如有侵权,请与我司联系删除
京ICP备:2022009079号-2
京公网安备:11010502051901号
ICP证:京B2-20230255