OpenHarmony 分布式相机(中)

您所在的位置:网站首页 获取可信设备失败 OpenHarmony 分布式相机(中)

OpenHarmony 分布式相机(中)

2024-04-22 19:52| 来源: 网络整理| 查看: 265

作者:徐金生

接上一篇OpenHarmony 分布式相机(上),今天我们来说下如何实现分布式相机。

实现分布式相机其实很简单,正如官方介绍的一样,当被控端相机被连接成功后,可以像使用本地设备一样使用远程相机。

我们先看下效果

视频地址

OpenHarmony 分布式相机(中)-鸿蒙开发者社区

上一篇已经完整的介绍了如何开发一个本地相机,对于分布式相机我们需要完成以下几个步骤:

前置条件

1、两台带摄像头的设备 2、建议使用相同版本的OH系统,本案例使用OpenHarmony 3.2 beta5 3、连接在同一个网络

开发步骤

1、引入设备管理(@ohos.distributedHardware.deviceManager) 2、通过deviceManager发现周边设备 3、通过pin码完成设备认证 4、获取和展示可信设备 5、在可信设备直接选择切换不同设备的摄像头 6、在主控端查看被控端的摄像头图像

以上描述的功能在应用开发时可以使用一张草图来表示,草图中切换设备->弹窗显示设备列表的过程,草图如下: OpenHarmony 分布式相机(中)-鸿蒙开发者社区

代码 RemoteDeviceModel.ts

说明: 远程设备业务处理类,包括获取可信设备列表、获取周边设备列表、监听设备状态(上线、下线、状态变化)、监听设备连接失败、设备授信认证、卸载设备状态监听等

代码如下:

import deviceManager from '@ohos.distributedHardware.deviceManager' import Logger from './util/Logger' const TAG: string = 'RemoteDeviceModel' let subscribeId: number = -1 export class RemoteDeviceModel {     private deviceList: Array = []     private discoverList: Array = []     private callback: () => void     private authCallback: () => void     private deviceManager: deviceManager.DeviceManager     constructor() {     }     public registerDeviceListCallback(bundleName : string, callback) {         if (typeof (this.deviceManager) !== 'undefined') {             this.registerDeviceListCallbackImplement(callback)             return         }         Logger.info(TAG, `deviceManager.createDeviceManager begin`)         try {             deviceManager.createDeviceManager(bundleName, (error, value) => {                 if (error) {                     Logger.info(TAG, `createDeviceManager failed.`)                     return                 }                 this.deviceManager = value                 this.registerDeviceListCallbackImplement(callback)                 Logger.info(TAG, `createDeviceManager callback returned, error= ${error},value= ${value}`)             })         } catch (err) {             Logger.error(TAG, `createDeviceManager failed, code is ${err.code}, message is ${err.message}`)         }         Logger.info(TAG, `deviceManager.createDeviceManager end`)     }     private deviceStateChangeActionOffline(device) {         if (this.deviceList.length  {             if (data === null) {                 return             }             Logger.info(TAG, `deviceFound data= ${JSON.stringify(data)}`)             this.deviceFound(data)         })         this.deviceManager.on('discoverFail', (data) => {             Logger.info(TAG, `discoverFail data= ${JSON.stringify(data)}`)         })         this.deviceManager.on('serviceDie', () => {             Logger.info(TAG, `serviceDie`)         })         this.startDeviceDiscovery()     }     private deviceFound(data) {         for (var i = 0;i = 0) {             Logger.info(TAG, `started DeviceDiscovery`)             return         }         subscribeId = Math.floor(65536 * Math.random())         let info = {             subscribeId: subscribeId,             mode: deviceManager.DiscoverMode.DISCOVER_MODE_ACTIVE,             medium: deviceManager.ExchangeMedium.COAP,             freq: deviceManager.ExchangeFreq.HIGH,             isSameAccount: false,             isWakeRemote: true,             capability: deviceManager.SubscribeCap.SUBSCRIBE_CAPABILITY_DDMP         }         Logger.info(TAG, `startDeviceDiscovery ${subscribeId}`)         try {             // todo 多次启动发现周边设备有什么影响吗?             this.deviceManager.startDeviceDiscovery(info)         } catch (err) {             Logger.error(TAG, `startDeviceDiscovery failed, code is ${err.code}, message is ${err.message}`)         }     }     public unregisterDeviceListCallback() {         Logger.info(TAG, `stopDeviceDiscovery $subscribeId}`)         this.deviceList = []         this.discoverList = []         try {             this.deviceManager.stopDeviceDiscovery(subscribeId)         } catch (err) {             Logger.error(TAG, `stopDeviceDiscovery failed, code is ${err.code}, message is ${err.message}`)         }         this.deviceManager.off('deviceStateChange')         this.deviceManager.off('deviceFound')         this.deviceManager.off('discoverFail')         this.deviceManager.off('serviceDie')     }     public authenticateDevice(device, extraInfo, callBack) {         Logger.info(TAG, `authenticateDevice ${JSON.stringify(device)}`)         for (let i = 0; i  {                     if (err) {                         Logger.error(TAG, `authenticateDevice error: ${JSON.stringify(err)}`)                         this.authCallback = null                         return                     }                     Logger.info(TAG, `authenticateDevice succeed: ${JSON.stringify(data)}`)                     this.authCallback = callBack                 })             } catch (err) {                 Logger.error(TAG, `authenticateDevice failed, code is ${err.code}, message is ${err.message}`)             }         }     }     /**      * 已认证设备列表      */     public getDeviceList(): Array {         return this.deviceList     }     /**      * 发现设备列表      */     public getDiscoverList(): Array {         return this.discoverList     } } getDeviceList() : 获取已认证的设备列表 getDiscoverList :发现周边设备的列表 DeviceDialog.ets

说明: 通过RemoteDeviceModel.getDiscoverList()和通过RemoteDeviceModel.getDeviceList()获取到所有周边设备列表,用户通过点击"切换设备"按钮弹窗显示所有设备列表信息。

import deviceManager from '@ohos.distributedHardware.deviceManager'; const TAG = 'DeviceDialog' // 分布式设备选择弹窗 @CustomDialog export struct DeviceDialog {   private controller?: CustomDialogController // 弹窗控制器   @Link deviceList: Array // 设备列表   @Link selectIndex: number // 选中的标签   build() {     Column() {       List() {         ForEach(this.deviceList, (item: deviceManager.DeviceInfo, index) => {           ListItem() {             Row() {               Text(item.deviceName)                 .fontSize(22)                 .width(350)                 .fontColor(Color.Black)               Image(index === this.selectIndex ? $r('app.media.checked') : $r('app.media.uncheck'))                 .width(35)                 .objectFit(ImageFit.Contain)             }             .height(55)             .onClick(() => {               console.info(`${TAG} select device ${item.deviceId}`)               if (index === this.selectIndex) {                 console.info(`${TAG} device not change`)               } else {                 this.selectIndex = index               }               this.controller.close()             })           }         }, item => item.deviceName)       }       .width('100%')       .height(150)       Button() {         Text($r('app.string.cancel'))           .width('100%')           .height(45)           .fontSize(18)           .fontColor(Color.White)           .textAlign(TextAlign.Center)       }.onClick(() => {         this.controller.close()       })       .backgroundColor('#ed3c13')     }     .width('100%')     .padding(20)     .backgroundColor(Color.White)     .border({       color: Color.White,       radius: 20     })   } } 打开设备列表弹窗

说明: 在index.ets页面中,点击“切换设备”按钮即可以开启设备列表弹窗,通过@Watch(‘selectedIndexChange’)监听用户选择的设备标签,在devices中获取到具体的DeviceInfo对象。 代码如下:

  @State @Watch('selectedIndexChange') selectIndex: number = 0   // 设备列表   @State devices: Array = []   // 设备选择弹窗   private dialogController: CustomDialogController = new CustomDialogController({     builder: DeviceDialog({       deviceList: $devices,       selectIndex: $selectIndex,     }),     autoCancel: true,     alignment: DialogAlignment.Center   })  showDialog() {     console.info(`${TAG} RegisterDeviceListCallback begin`)     distributed.registerDeviceListCallback(BUNDLE_NAME, () => {       console.info(`${TAG} RegisterDeviceListCallback callback entered`)       this.devices = []       // 添加本地设备       this.devices.push({         deviceId: Constant.LOCAL_DEVICE_ID,         deviceName: Constant.LOCAL_DEVICE_NAME,         deviceType: 0,         networkId: '',         range: 1 // 发现设备的距离       })       let discoverList = distributed.getDiscoverList()       let deviceList = distributed.getDeviceList()       let discoveredDeviceSize = discoverList.length       let deviceSize = deviceList.length       console.info(`${TAG} discoveredDeviceSize:${discoveredDeviceSize} deviceSize:${deviceSize}`)       let deviceTemp = discoveredDeviceSize > 0 ? discoverList : deviceList       for (let index = 0; index 


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3