OpenHarmony 分布式相机(中) |
您所在的位置:网站首页 › 获取可信设备失败 › OpenHarmony 分布式相机(中) |
作者:徐金生 接上一篇OpenHarmony 分布式相机(上),今天我们来说下如何实现分布式相机。 实现分布式相机其实很简单,正如官方介绍的一样,当被控端相机被连接成功后,可以像使用本地设备一样使用远程相机。 我们先看下效果视频地址 上一篇已经完整的介绍了如何开发一个本地相机,对于分布式相机我们需要完成以下几个步骤: 前置条件1、两台带摄像头的设备 2、建议使用相同版本的OH系统,本案例使用OpenHarmony 3.2 beta5 3、连接在同一个网络 开发步骤1、引入设备管理(@ohos.distributedHardware.deviceManager) 2、通过deviceManager发现周边设备 3、通过pin码完成设备认证 4、获取和展示可信设备 5、在可信设备直接选择切换不同设备的摄像头 6、在主控端查看被控端的摄像头图像 以上描述的功能在应用开发时可以使用一张草图来表示,草图中切换设备->弹窗显示设备列表的过程,草图如下:
说明: 远程设备业务处理类,包括获取可信设备列表、获取周边设备列表、监听设备状态(上线、下线、状态变化)、监听设备连接失败、设备授信认证、卸载设备状态监听等 代码如下: 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 |