HarmonyOS 5.0.0 或以上:设备发现与连接(分布式协同基础能力)


📌 场景介绍

在分布式系统中,第一步是发现并连接附近设备,这是实现:

  • 跨设备文件发送

  • 多屏协同、远程操控

  • 任务迁移、音视频串流

的基础。本篇实现:

  • 启动本地设备监听与广播

  • 发现局域网内可协同设备

  • 展示设备 ID、名称等基础信息

  • 支持发起连接(为后续协同打基础)


🧱 项目结构

/entry/src/main/ets
  └── pages/
       └── DeviceDiscoveryDemo.ets     // 分布式设备发现与连接页面

🧩 DeviceDiscoveryDemo.ets 示例页面

import distributedHardware from '@ohos.distributedHardware.deviceManager'

@Entry
@Component
struct DeviceDiscoveryDemo {
  @State deviceList: Array<{ name: string; id: string }> = []
  @State status: string = '未开始发现'
  private dm?: distributedHardware.DeviceManager
  private subscriptionId: string = 'demoSubscribe'

  aboutToAppear() {
    this.initDeviceManager()
  }

  private async initDeviceManager() {
    distributedHardware.createDeviceManager('com.example.harmony', async (err, manager) => {
      if (err) {
        this.status = '❌ 初始化失败'
        console.error('DeviceManager error:', err)
        return
      }

      this.dm = manager
      this.status = '✅ DeviceManager 初始化成功'

      manager.on('deviceStateChange', (data) => {
        console.info('Device state changed:', data)
      })

      manager.on('deviceFound', (device) => {
        const id = device.deviceId
        const name = device.deviceName
        if (!this.deviceList.some(d => d.id === id)) {
          this.deviceList.push({ id, name })
        }
      })

      manager.on('discoverFail', (error) => {
        this.status = '❌ 发现失败:' + error.reason
      })

      this.startDiscovery()
    })
  }

  private async startDiscovery() {
    if (!this.dm) return
    this.status = '📡 正在搜索附近设备...'

    const info = {
      subscribeId: this.subscriptionId,
      mode: 0, // 发现模式,可设为 0=默认
      medium: 1, // Medium = 1: AUTO
      freq: 1, // Discover频率 0=low,1=mid,2=high
      isSameAccount: false,
      isWakeRemote: true,
      capability: 'dvkit' // 默认能力标识
    }

    this.dm.startDeviceDiscovery(info)
  }

  private async stopDiscovery() {
    if (this.dm) {
      this.dm.stopDeviceDiscovery(this.subscriptionId)
      this.status = '⏹️ 已停止搜索'
    }
  }

  build() {
    Column() {
      Text("🌐 分布式设备发现").fontSize(22).margin(20)

      Button("开始发现设备").onClick(() => this.startDiscovery()).margin(6)
      Button("停止发现设备").onClick(() => this.stopDiscovery()).margin(6)

      Text(`状态:${this.status}`).fontSize(14).fontColor('#666').margin(10)

      ForEach(this.deviceList, (d, index) => {
        Column()
          .backgroundColor('#f6f6f6')
          .padding(10)
          .borderRadius(8)
          .margin({ top: 8 }) {
            Text(`📱 设备名:${d.name}`).fontSize(16)
            Text(`🆔 ID:${d.id}`).fontSize(12).fontColor('#999')
        }
      })
    }
    .padding(20)
    .height('100%')
    .scrollable(true)
  }
}

✅ 效果说明

  • 启动分布式设备发现服务,展示局域网中发现的设备

  • 获取设备名、设备 ID,可用于后续连接与协同

  • 支持开始/停止搜索,避免后台资源占用


🔧 拓展建议

  • 支持点击某设备发起连接并跳转任务迁移页面

  • 标记“当前设备”与“远程设备”身份

  • 后续实现远程文件发送、远程 UI 显示、协同播放等高级协同能力

  • 使用 startDeviceManagerFa 快速唤起设备配对界面

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐