• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# **DeviceManager部件**
2
3## 简介
4
5DeviceManager组件在OpenHarmony上提供账号无关的分布式设备的认证组网能力,并为开发者提供了一套用于分布式设备间监听、发现和认证的接口。
6
7其组成及依赖如下所示:
8
9![](figures/devicemanager_zh.png)
10
11dsoftbus提供能力:
12    提供设备上下线通知及设备信息,设备认证通道和设备发现能力。
13deviceauth提供能力:
14    提供设备群组管理和群组认证能力。
15
16
17## 目录
18
19```
20foundation/distributedhardware/distributedhardware_device_manager
21├── common                        # 公共能力头文件存放目录
22│   ├── include
23│   │   ├── dfx                   # dfx功能头文件存放目录
24│   │   └── ipc                   # ipc功能头文件存放目录
25│   │       ├── lite              # small
26│   │       ├── model             # ipc功能模块头文件存放目录
27│   │       └── standard          # standard
28│   └── src
29│       ├── dfx                   # dfx功能实现相关代码
30│       └── ipc                   # ipc公共功能代码
31│           ├── lite              # small
32│           └── standard          # standard
33├── display                       # DM显示hap代码
34│   └── entry
35│       └── src
36│           └── main
37│               ├── js            # DM PIN码显示ServiceExtensionAbility相关JS代码
38│               └── resources     # DM PIN码显示ServiceExtensionAbility相关资源配置文件目录
39├── figures
40├── interfaces
41│   ├── inner_kits                # 内部接口及实现存放目录
42│   │   └── native_cpp            # 内部native接口及实现存放目录
43│   │       ├── include
44│   │       │   ├── ipc           # ipc头文件存放目录
45│   │       │   │   ├── lite      # small
46│   │       │   │   └── standard  # standard
47│   │       │   └── notify        # ipc回调通知头文件目录
48│   │       └── src
49│   │           ├── ipc           # ipc功能代码
50│   │           │   ├── lite      # small
51│   │           │   └── standard  # standard
52│   │           └── notify        # ipc回调通知功能代码
53│   └── kits                      # 外部接口及实现存放目录
54│       └── js                    # 外部JS接口及实现存放目录
55│           ├── include           # 外部JS接口及实现头文件存放目录
56│           └── src               # 外部JS接口及实现代码
57├── sa_profile                    # SA进程配置相关文件存放目录
58├── services
59│   ├── implementation            # devicemanagerservice服务实现核心代码
60│   │   ├── include
61│   │   │   ├── ability           # 与PIN码显示ServiceExtensionAbility拉起管理相关头文件
62│   │   │   ├── adapter           # DM适配扩展功能相关头文件
63│   │   │   ├── authentication    # device_auth交互相关头文件
64│   │   │   ├── config            # DM适配扩展相关配置功能头文件
65│   │   │   ├── credential        # 凭据管理功能相关头文件
66│   │   │   ├── dependency        # 外部依赖模块相关头文件
67│   │   │   │   ├── commonevent   # 事件处理功能相关头文件
68│   │   │   │   ├── hichain       # 与hichain功能交互相关头文件
69│   │   │   │   ├── mini          # mini
70│   │   │   │   ├── multipleuser  # 多用户功能相关头文件
71│   │   │   │   ├── softbus       # 与软总线功能交互相关头文件
72│   │   │   │   └── timer         # 定时器处理相关头文件
73│   │   │   ├── devicestate       # 设备状态管理功能相关头文件
74│   │   │   ├── discovery         # 设备发现功能相关头文件
75│   │   │   ├── dispath           # L0上功能实现相关头文件
76│   │   │   └── publish           # 设备主动发现功能相关头文件
77│   │   └── src
78│   │       ├── ability           # 与PIN码显示ServiceExtensionAbility拉起管理相关功能代码
79│   │       ├── adapter           # DM适配扩展功能代码
80│   │       ├── authentication    # device_auth交互相关核心代码
81│   │       ├── config            # DM适配扩展相关配置功能代码
82│   │       ├── credential        # 凭据管理功能代码
83│   │       ├── dependency        # 外部依赖模块功能代码
84│   │       │   ├── commonevent   # 事件处理功能代码
85│   │       │   ├── hichain       # 与hichain功能交互代码
86│   │       │   ├── mini          # mini
87│   │       │   ├── multipleuser  # 多用户功能代码
88│   │       │   ├── softbus       # 与软总线功能交互代码
89│   │       │   └── timer         # 定时器处理相关功能代码
90│   │       ├── devicestate       # 设备状态管理功能代码
91│   │       ├── discovery         # 设备发现功能代码
92│   │       ├── dispath           # mini上功能实现代码
93│   │       └── publish           # 设备主动发现功能
94│   └── service                   # devicemanagerservice服务实现核心代码
95│       ├── include
96│       │   ├── ipc               # 进程间通信相关头文件
97│       │   │   ├── lite          # small
98│       │   │   └── standard      # standard
99│       │   └── softbus           # 软总线相关头文件
100│       └── src
101│           ├── ipc               # 进程间通信相关功能代码
102│           │   ├── lite          # small
103│           │   └── standard      # standard
104│           └── softbus           # 通道建立功能核心代码
105└── utils                         # 公共能力头文件存放目录
106    ├── include
107    │   ├── fwkload               # 拉起其他sa功能相关头文件
108    │   └── permission            # 权限校验相关头文件存放目录
109    └── src
110        ├── fwkload               # 拉起其他sa功能相关功能代码
111        └── permission            # 权限校验相关功能代码
112```
113
114## 约束
115
116- 开发语言:JS、C++
117- 适用于Hi3516DV300单板等OpenHarmony设备
118
119
120## 接口说明
121
122当前版本设备管理服务不具备权限管理的能力,接口中的system api仅供系统调用,后续版本会进行严格的权限管控。
123接口参见[**interface_sdk-js仓库的**](https://gitee.com/openharmony/interface_sdk-js/) *ohos.distributedHardware.deviceManager.d.ts*
124
125- 公共接口:
126
127  使用DeviceManager相关接口之前,需要通过createDeviceManager接口创建DeviceManager实例;
128
129  不使用DeviceManager接口的时候需要释放对应的DeviceManager实例。
130
131| 原型                                                         | 描述                            |
132| ------------------------------------------------------------ | ------------------------------- |
133| createDeviceManager(bundleName: string, callback: AsyncCallback<DeviceManager>): void; | 以异步方法获取DeviceManager实例 |
134| release(): void;                                             | 释放DeviceManager实例           |
135
136
137- 系统能力接口:
138
139  提供可信设备列表获取、可信设备状态监听、周边设备发现、设备认证等相关接口,该部分作为系统能力接口,仅供系统应用调用。
140
141  开始设备发现、停止发现设备接口要配对使用,使用同一个subscribeId。
142
143| 原型                                                         | 描述                 |
144| ------------------------------------------------------------ | -------------------- |
145| getTrustedDeviceListSync(): Array<DeviceInfo>;                                                                                            | 获取信任设备列表 |
146| on(type: 'deviceStateChange', callback: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void;                         | 设备状态变更回调 |
147| off(type: 'deviceStateChange', callback?: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void;                       | 取消设备状态变更回调 |
148| on(type: 'serviceDie', callback: () => void): void;                                                                                       | 服务错误回调 |
149| off(type: 'serviceDie', callback?: () => void): void;                                                                                     | 取消服务错误回调 |
150| startDeviceDiscovery(subscribeInfo: SubscribeInfo): void;    | 开始设备发现         |
151| stopDeviceDiscovery(subscribeId: number): void;              | 停止发现设备         |
152| authenticateDevice(deviceInfo: DeviceInfo, authparam: AuthParam, callback: AsyncCallback<{deviceId: string, pinTone ?: number}>): void; | 设备认证接口         |
153| setUserOperation(operateAction: number, params: string): void;    | 设置用户ui操作行为         |
154| verifyAuthInfo(authInfo: AuthInfo, callback: AsyncCallback<{deviceId: string, level: number}>): void; | 设备认证信息校验     |
155| on(type: 'deviceFound', callback: Callback<{ subscribeId: number, device: DeviceInfo }>): void; | 发现设备列表回调     |
156| off(type: 'deviceFound', callback?: Callback<{ subscribeId: number, device: DeviceInfo }>): void; | 取消发现设备列表回调 |
157| on(type: 'discoverFail', callback: Callback<{ subscribeId: number, reason: number }>): void; | 发现设备失败回调     |
158| off(type: 'discoverFail', callback?: Callback<{ subscribeId: number, reason: number }>): void; | 取消发现设备失败回调 |
159| on(type: 'publishSuccess', callback: Callback<{ publishId: number }>): void; | 发布设备成功回调     |
160| off(type: 'publishSuccess', callback?: Callback<{ publishId: number }>): void; | 取消发布设备成功回调 |
161| on(type: 'publishFail', callback: Callback<{ publishId: number, reason: number }>): void; | 发布设备失败回调     |
162| off(type: 'publishFail', callback?: Callback<{ publishId: number, reason: number  }>): void; | 取消发布设备失败回调 |
163| on(type: 'uiStateChange', callback: Callback<{ param: string}>): void; | ui状态变更回调     |
164| off(type: 'uiStateChange', callback?: Callback<{ param: string}>): void; | 取消ui状态变更回调     |
165- 示例如下:
166
167```js
168// 创建DeviceManager实例:
169deviceManager.createDeviceManager('com.ohos.xxxx', (err, dm) => {
170    this.log("createDeviceManager err:" + JSON.stringify(err) + '  --success:' + JSON.stringify(dm))
171    if (err) return;
172    dmClass = dm;
173    dmClass.on('serviceDie', data => this.log("serviceDie on:" + JSON.stringify(data)))
174});
175
176// 注册/去注册设备上下线监听
177dmClass.on('deviceStateChange', (data) => {
178    this.log("deviceStateChange on:" + JSON.stringify(data));
179    switch (data.action) {
180      case ONLINE:
181        // 设备物理上线状态
182        break;
183      case READY:
184        // 设备可用状态,表示设备间信息已在分布式数据中同步完成,可以运行分布式业务
185        break;
186      case OFFLINE:
187        // 设备物理下线状态
188        break;
189      case CHANGE:
190        // 设备信息变更
191        break;
192      default:
193        break;
194    }
195});
196dmClass.off('deviceStateChange')
197
198// 查询可信设备列表
199var array = dmClass.getTrustedDeviceListSync();
200
201// 获取本地设备信息
202var localDeviceInfo = dmClass.getLocalDeviceInfoSync();
203
204// 开始设备发现(发现周边不可信设备)
205var subscribeId = 0;
206dmClass.on('deviceFound', (data) => {
207    if (data == null) {
208        this.log("deviceFound error data=null")
209        return;
210    }
211    this.logList.push("deviceFound:" + JSON.stringify(data));
212});
213dmClass.on('discoverFail', (data) => {
214    this.log("discoverFail on:" + JSON.stringify(data));
215});
216subscribeId = Math.floor(Math.random() * 10000 + 1000)
217var info = {
218    "subscribeId": subscribeId,
219    "mode": 0xAA,
220    "medium": 0,
221    "freq": 2,
222    "isSameAccount": false,
223    "isWakeRemote": true,
224    "capability": 0
225};
226var filterOptions = {
227    "filter_op": "OR", //可选,默认"OR"
228    "filters": [
229        {
230            "type": "range",
231            "value": 50 // 需要过滤发现设备的距离,单位(cm)
232        }
233    ]
234};
235dmClass.startDeviceDiscovery(info, JSON.stringify(filterOptions));
236
237// 停止设备发现(需要和startDeviceDiscovery接口配对使用)
238dmClass.stopDeviceDiscovery(subscribeId);
239
240// 开始发布设备发现
241var publishId = 0;
242dmClass.on('publishSuccess', (data) => {
243    if (data == null) {
244        this.log("publishSuccess error data=null")
245        return;
246    }
247    this.logList.push("publishSuccess:" + JSON.stringify(data));
248});
249dmClass.on('publishFailed', (data) => {
250    this.log("publishFailed on:" + JSON.stringify(data));
251});
252publishId = Math.floor(Math.random() * 10000 + 1000)
253var info = {
254    "publishId": publishId,
255    "mode": 0xAA,
256    "freq": 2,
257    "ranging": 1
258};
259dmClass.publishDeviceDiscovery(info);
260
261// 停止发布设备发现(需要和publishDeviceDiscovery接口配对使用)
262dmClass.unPublishDeviceDiscovery(publishId);
263
264// 设置用户ui操作行为
265/*  operateAction = 0 - 允许授权
266    operateAction = 1 - 取消授权
267    operateAction = 2 - 授权框用户操作超时
268    operateAction = 3 - 取消pin码框展示
269    operateAction = 4 - 取消pin码输入框展示
270    operateAction = 5 - pin码输入框确定操作
271*/
272dmClass.setUserOperation(operation, "extra")
273dmClass.on('uiStateChange', (data) => {
274    console.log("uiStateChange executed, dialog closed" + JSON.stringify(data))
275    var tmpStr = JSON.parse(data.param)
276    this.isShow = tmpStr.verifyFailed
277    console.log("uiStateChange executed, dialog closed" + this.isShow)
278    if (!this.isShow) {
279        this.destruction()
280    }
281});
282dmClass.off('uiStateChange')
283
284// 设备认证
285var deviceInfo ={
286    "deviceId": "XXXXXXXX",
287    "deviceName": "",
288    deviceType: 0
289};
290let extraInfo = {
291    "appIcon": new Uint8Array(), // app图标,可选参数,可不填
292    "appThumbnail": new Uint8Array(), // app缩略图,可选参数,可不填
293    "appName": "xxxxxxxx", // 对端设备应用名称
294    "appDescription": "xxxxxxxx", // app描述
295    "business": '0',
296    "displayOwner": 0,
297}
298let authParam = {
299    "authType": 1,
300    "extraInfo": extraInfo
301}
302dmClass.authenticateDevice(this.deviceInfo, authParam, (err, data) => {
303    if (err) {
304        this.logList.push("authenticateDevice err:" + JSON.stringify(err));
305        console.info(TAG + "authenticateDevice err:" + JSON.stringify(err));
306        return;
307    }
308    this.logList.push("authenticateDevice result:" + JSON.stringify(data));
309    console.info(TAG + "authenticateDevice result:" + JSON.stringify(data));
310    token = data.pinToken;
311});
312
313// 设备取消认证
314dmClass.unAuthenticateDevice(this.deviceInfo);
315```
316## 系统弹框ServiceExtensionAbility
317
318当前版本只支持PIN码认证,需要提供PIN码认证的授权提示界面、PIN码显示界面、PIN码输入界面;
319
320当前,由于系统通过native层直接进行弹窗的能力尚不具备,这里使用ServiceExtensionAbility来进行对应界面的弹窗。
321
322该ServiceExtensionAbility为:DeviceManager_UI.hap,作为系统应用进行预置。
323
324- 编译运行:
325
326devicemanager/display工程导入DevEco Studio 2.2 Beta1,复制display目录下的@ohos.distributedHardware.deviceManager.d.ts文件到Sdk\js\2.2.0.1\api\common目录下,进行编译构建及运行调试.
327
328- 编译环境依赖:IDE 2.2 SDK6
329
330- DeviceManager_UI.hap包源码存放位置:[device_manager仓库](https://gitee.com/openharmony/distributedhardware_device_manager/tree/master/display)
331
332- UI显示:
333
334  DeviceManager作为认证被控端,授权提示界面、PIN码显示界面由DeviceManager_UI ServiceExtensionAbility默认进行显示;
335
336  DeviceManager作为认证发起端,PIN码输入界面可以选择由DeviceManager_UI ServiceExtensionAbility进行显示,还是由开发者自行显示。开发者如需自己定制PIN码输入界面,需要在authenticateDevice接口的认证参数AuthParam中,extraInfo属性里面指定displayOwner参数为1。
337
338## 相关仓
339****
340
341[**interface_sdk-js**](https://gitee.com/openharmony/interface_sdk-js/)
342
343[**applications_hap**](https://gitee.com/openharmony/applications_hap)
344