鸿蒙3.1 设备管理DeviceManager

news2024/11/24 2:53:02

介绍

DeviceManager组件在OpenHarmony上提供账号无关的分布式设备的认证组网能力,并为开发者提供了一套用于分布式设备间监听、发现和认证的接口。

其组成及依赖如下所示:

总结

设备管理模块其实就是软总线的包皮服务。目前权限都是控制系统uid,但是根据官方介绍,后续可能开放出去。所以大致的思路就是,设备管理模块代替软总线提供设备相关的能力,软总线只开放给系统服务使用。然后设备管理模块目前主要实现了就是自己的认证逻辑,这部分主要就是使用deviceauth模块,来进行图形化的认证能力。

目录

devicemanager

foundation/distributedhardware/devicemanager
├── common                        #公共能力头文件存放目录
│   └── include
│       └── ipc
│           └── model             #ipc功能模块头文件存放目录
├── display                       #DM显示hap代码
│   └── entry
│       └── src
│           └── main
│               ├── js            #DM PIN码显示FA相关JS代码
│               └── resources     #DM PIN码显示FA相关资源配置文件目录
├── figures
├── interfaces
│   ├── inner_kits                #内部接口及实现存放目录
│   │   └── native_cpp            #内部native接口及实现存放目录
│   │       ├── include
│   │       │   ├── ipc           #ipc头文件存放目录
│   │       │   │   ├── lite      #small
│   │       │   │   └── standard  #standard
│   │       │   └── notify        #ipc回调通知头文件目录
│   │       └── src
│   │           ├── ipc           #ipc功能代码
│   │           │   ├── lite      #small
│   │           │   └── standard  #standard
│   │           └── notify        ipc回调通知功能代码
│   └── kits                      #外接口及实现存放目录
│       └── js                    #外部JS接口及实现存放目录
│           ├── include           #外部JS接口及实现欧文件存放目录
│           └── src               #外部JS接口及实现代码
├── sa_profile
├── services
│   └── devicemanagerservice      #devicemanagerservice服务实现核心代码
│       ├── include
│       │   ├── ability           #与PIN码显示FA拉起管理相关头文件
│       │   ├── auth              #devie_auth交互相关头文件
│       │   ├── ipc               #进程间通信相关头文件
│       │   │   ├── lite          #small
│       │   │   └── standard      #standard
│       │   ├── message           #消息数据解析相关头文件
│       │   ├── requestauth       #设备认证功能相关头文件
│       │   ├── softbus           #软总线相关头文件
│       │   └── timer             #定时器处理相关头文件
│       └── src
│           ├── ability           #与PIN码显示FA拉起管理相关功能代码
│           │   ├── lite          #small
│           │   └── standard      #standard
│           ├── auth              #devie_auth交互相关核心代码
│           ├── ipc               #进程间通信相功能代码
│           │   ├── lite          #small
│           │   └── standard      #standard
│           ├── message           #消息数据解析相功能代码
│           ├── requestauth       #设备认证功能代码
│           ├── softbus           #通道建立功能核心代码
│           └── timer             #timer处理代码
└── utils                         #公共能力头文件存放目
    ├── include
    │   ├── cipher                #加解密功能相关头文件
    │   ├── ipc                   #ipc公共头文件存放目录
    │   │   ├── lite              #small
    │   │   └── standard          #standard
    │   └── log                   #log相关头文件存放目录
    └── src
        ├── cipher                #加解密功能代码
        ├── ipc                   #ipc公共功能代码
        │   ├── lite              #small
        │   └── standard          #standard
        └── log                   #log相关功能代码

接口说明

当前版本设备管理服务不具备权限管理的能力,接口中的system api仅供系统调用,后续版本会进行严格的权限管控。 接口参见interface_sdk-js仓库的 ohos.distributedHardware.deviceManager.d.ts

  • 公共接口:使用DeviceManager相关接口之前,需要通过createDeviceManager接口创建DeviceManager实例;不使用DeviceManager接口的时候需要释放对应的DeviceManager实例。

原型

描述

createDeviceManager(bundleName: string, callback: AsyncCallback): void;

以异步方法获取DeviceManager实例

release(): void;

释放DeviceManager实例

  • 系统能力接口:提供可信设备列表获取、可信设备状态监听、周边设备发现、设备认证等相关接口,该部分作为系统能力接口,仅供系统应用调用。开始设备发现、停止发现设备接口要配对使用,使用同一个subscribeId。

原型

描述

getTrustedDeviceListSync(): Array;

获取信任设备列表

on(type: 'deviceStateChange', callback: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void;

设备状态变更回调

off(type: 'deviceStateChange', callback?: Callback<{ action: DeviceStateChangeAction, device: DeviceInfo }>): void;

取消设备状态变更回调

on(type: 'serviceDie', callback: () => void): void;

服务错误回调

off(type: 'serviceDie', callback?: () => void): void;

取消服务错误回调

startDeviceDiscovery(subscribeInfo: SubscribeInfo): void;

开始设备发现

stopDeviceDiscovery(subscribeId: number): void;

停止发现设备

authenticateDevice(deviceInfo: DeviceInfo, authparam: AuthParam, callback: AsyncCallback<{deviceId: string, pinTone ?: number}>): void;

设备认证接口

verifyAuthInfo(authInfo: AuthInfo, callback: AsyncCallback<{deviceId: string, level: number}>): void;

设备认证信息校验

on(type: 'deviceFound', callback: Callback<{ subscribeId: number, device: DeviceInfo }>): void;

发现设备列表回调

off(type: 'deviceFound', callback?: Callback<{ subscribeId: number, device: DeviceInfo }>): void;

取消发现设备列表回调

on(type: 'discoverFail', callback: Callback<{ subscribeId: number, reason: number }>): void;

发现设备失败回调

off(type: 'discoverFail', callback?: Callback<{ subscribeId: number, reason: number }>): void;

取消发现设备失败回调

deviceauth

/base/security/deviceauth
├── frameworks                   # 设备互信认证IPC代码
├── interfaces                   # 对外接口目录
├── test                         # 设备互信认证的接口测试用例
├── common_lib                   # C语言公共基础库
├── deps_adapter                 # 依赖组件适配器代码
│   ├── key_management_adapter   # 秘钥及算法适配层
│   └── os_adapter               # 系统能力适配层
└── services                     # 设备互信认证服务层代码
    ├── frameworks               # 设备互信认证框架层代码
    ├── data_manager             # 设备互信群组信息管理模块
    ├── group_auth               # 设备群组认证服务
    ├── group_manager            # 设备群组管理服务
    ├── authenticators           # 认证执行模块(包括帐号无关点对点认证器)
    └── protocol                 # 认证协议库


接口说明

设备互信认证组件中,设备群组管理服务负责将不同业务建立的设备间可信关系抽象成一个个可信群组,对外提供统一的接口,包含群组创建、删除、查询等功能;设备群组认证服务基于已经建立过可信关系的设备群组,提供设备可信认证与端到端会话密钥协商功能。

表 1 设备群组管理服务提供的API接口(DeviceGroupManager)功能介绍

接口名

描述

const DeviceGroupManager *GetGmInstance()

获取设备群组管理的实例。

int32_t RegCallback(const char *appId, const DeviceAuthCallback *callback)

注册业务的监听回调。

int32_t CreateGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *createParams)

创建一个可信设备群组。

int32_t DeleteGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *disbandParams)

删除一个可信设备群组。

int32_t AddMemberToGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *addParams)

添加成员到指定群组ID的可信设备群组。

int32_t DeleteMemberFromGroup(int32_t osAccountId, int64_t requestId, const char *appId, const char *deleteParams);

从指定可信设备群组里删除可信成员。

int32_t ProcessData(int64_t requestId, const uint8_t *data, uint32_t dataLen)

处理绑定或者解绑的数据。

int32_t GetGroupInfo(int32_t osAccountId, const char *appId, const char *queryParams, char **returnGroupVec, uint32_t *groupNum)

查询可信设备群组信息。

表 2 设备群组认证模块提供的API接口(GroupAuthManager)功能介绍

接口名

描述

const GroupAuthManager *GetGaInstance()

获取设备群组认证的实例。

int32_t AuthDevice(int32_t osAccountId, int64_t authReqId, const char *authParams, const DeviceAuthCallback *gaCallback)

认证可信设备。

int32_t ProcessData(int64_t authReqId, const uint8_t *data, uint32_t dataLen, const DeviceAuthCallback *gaCallback)

处理认证的数据。

数据结构

设备信息

这个设备信息是从软总线中NodeBasicInfo获取到的

软总线结构

typedef struct {
    char networkId[NETWORK_ID_BUF_LEN];    /**< Device ID */
    char deviceName[DEVICE_NAME_BUF_LEN];  /**< Device name */
    uint16_t deviceTypeId;
} NodeBasicInfo;

/**
 * @brief Defines the device information returned by <b>IDiscoveryCallback</b>.
 *
 */
typedef struct {
    /** Device ID. Its maximum length is specified by {@link DISC_MAX_DEVICE_ID_LEN}. */
    char devId[DISC_MAX_DEVICE_ID_LEN];
    /** Account hash code. Its maximum length is specified by {@link MAX_ACCOUNT_HASH_LEN}. */
    char accountHash[MAX_ACCOUNT_HASH_LEN];
    /** Device type. For details, see {@link DeviceType}. */
    DeviceType devType;
    /** Device name. Its maximum length is specified by {@link DISC_MAX_DEVICE_NAME_LEN}. */
    char devName[DISC_MAX_DEVICE_NAME_LEN];
    /** Number of available connections */
    unsigned int addrNum;
    /** Connection information. For details, see {@link ConnectAddr}. */
    /** 可能是蓝牙地址,也可能是ip地址,或者br地址*/
    ConnectionAddr addr[CONNECTION_ADDR_MAX];
    /** Number of capabilities */
    unsigned int capabilityBitmapNum;
    /** Device capability bitmap.
     * The maximum number of capabilities in the bitmap is specified by {@link DISC_MAX_CAPABILITY_NUM}.
     */
    unsigned int capabilityBitmap[DISC_MAX_CAPABILITY_NUM];
    /** Custom data. Its length is specified by {@link DISC_MAX_CUST_DATA_LEN}. */
    char custData[DISC_MAX_CUST_DATA_LEN];
} DeviceInfo;

设备管理内部结构

typedef struct DmDeviceInfo {
    char deviceId[DM_MAX_DEVICE_ID_LEN];
    char deviceName[DM_MAX_DEVICE_NAME_LEN];
    uint16_t deviceTypeId;
    char networkId[DM_MAX_DEVICE_ID_LEN];
} DmDeviceInfo;

部分逻辑

启动过程

设备管理启动过程中,首先注册了设备上下线的一些回调到软总线中,用来监听设备节点上下线的状态变更。

然后加载自己的插件:目前提供的插件有

adaptor插件

插件名

文件名

crypto_adapter

libdevicemanager_crypto_adapter.z.so

device_profile

libdevicemanagerext_profile.z.so

device_decision

libdevicemanagerext_decision.z.so

auth插件

插件名

文件名

pin_auth

libdevicemanagerext_pin_auth.z.so

QRcode_auth

libdevicemanager_qrcodeauth.z.so

nfc_auth

libdevicemanager_nfcauth.z.so

设备发现

认证逻辑

设备认证,目前分为账号相关和账号不相关。两套使用了不同的认证逻辑。

入口

设备管理对外提供了设备认证的入口

int32_t DeviceManagerService::AuthenticateDevice(const std::string &pkgName, int32_t authType,
                                                 const std::string &deviceId, const std::string &extra)

握手过程

数据结构

DmAuthRequestContext

/**
 * @brief request context
 * 
 */
typedef struct DmAuthRequestContext {
    //认证类型
    int32_t authType;
    //本地设备id
    std::string localDeviceId;
    std::string deviceId;
    std::string deviceName;
    std::string deviceTypeId;
    int32_t sessionId;
    int32_t groupVisibility;
    bool cryptoSupport;
    std::string cryptoName;
    std::string cryptoVer;
    std::string hostPkgName;
    std::string targetPkgName;
    std::string appName;
    //描述
    std::string appDesc;
    //图标
    std::string appIcon;
    //app缩略图
    std::string appThumbnail;
    //token
    std::string token;
    int32_t reason;
    std::vector<std::string> syncGroupList;
} DmAuthRequestContext;

RequestMessage

{
  "ITF_VER" : "1.1",
  "MSG_TYPE": 100,
  "SLICE": 
}

连接状态

typedef enum AuthState {
    //初始化阶段,完成后会转到negotiate
    AUTH_REQUEST_INIT = 1,
    AUTH_REQUEST_NEGOTIATE,
    AUTH_REQUEST_NEGOTIATE_DONE,
    AUTH_REQUEST_REPLY,
    AUTH_REQUEST_INPUT,
    AUTH_REQUEST_JOIN,
    AUTH_REQUEST_NETWORK,
    AUTH_REQUEST_FINISH,
    AUTH_RESPONSE_INIT = 20,
    AUTH_RESPONSE_NEGOTIATE,
    AUTH_RESPONSE_CONFIRM,
    AUTH_RESPONSE_GROUP,
    AUTH_RESPONSE_SHOW,
    AUTH_RESPONSE_FINISH,
} AuthState;

client的状态转换

首先的状态是init,

从软总线中opensession之后,如果获取sessionid失败的化状态会转为AUTH_REQUEST_NEGOTIATE,并结束掉整个认证过程。

如果opensession触发成功,软总线会调用对应的OnSessionOpened回调函数,来进行进一步的处理

OnSessionOpened这里主要分了两部分,一部分是服务端的处理,另一部分是client的处理,服务端就是需要认证的远端设备

//session建立后的回调
void DmAuthManager::OnSessionOpened(int32_t sessionId, int32_t sessionSide, int32_t result) } else {
      LOGI("DmAuthManager::OnSessionOp

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/891393.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

webservice请求数据时找不到类com/sun/tools/internal/xjc/api/XJC

错误信息描述&#xff1a; java.lang.IllegalStateException: Unable to create schema compilerat org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompilerWithDefaultAllocator(JAXBUtils.java:744)at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createSch…

Spring 自定义命名空间并解析 NameSpaceHandler

Spring 自定义命名空间解析器 1.主要步骤 主要有以下四步&#xff1a; 编写Schema文件自定义NameSpaceHandler 绑定命令空间自定义 BeanDefinitionParse 解析XML作为bd的配置元信息命名空间映射XML 2.代码实现 需要注意的时&#xff0c;把 spring.handlers 文件与 spring.s…

分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测&#xff0c;运行环境Matlab2023b及以上…

实例039 始终在最上面的窗体

实例说明 Windows桌面上允许多个窗体同时显示&#xff0c;但是只有一个窗体能够得到焦点&#xff0c;当一个窗体得到焦点后在其上面的窗体会被得到焦点的窗体遮挡&#xff0c;得到焦点的窗体会显示在最上层&#xff0c;这样被覆盖的窗体就不能完全的显示给用户&#xff0c;如果…

Resolver error: Error: Connecting with SSH timed out

别忘了配置部门内部ip&#xff0c;才能访问服务器 windows卸载重装openssh 参考链接&#xff1a;安装 OpenSSH | Microsoft Learn

PHP自己的框架实现config配置层级存取(完善篇二)

1、实现效果 config(include_once $coreConfig); //加载配置文件config() //获取所有配置 config(DB_HOST) 获取配置 2、按层级配置文件加载&#xff0c;存取配置项 config,function.php function config($varNULL,$valueNULL){static $configarray();if(is_array($var)){…

阻塞IO、非阻塞IO和IO多路复用

文章目录 用户态和内核态操作系统角度的IOIO模型阻塞IO非阻塞IO&#xff08;NIO&#xff09;IO多路复用select 、poll和epoll 用户态和内核态 用户态也叫用户空间&#xff0c;内核态也叫内核空间。 操作系统为了保护系统的安全&#xff0c;都会划分出内核空间和用户空间。简单…

seata 的部署和集成

文章目录 seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 TODO三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos…

PHP加密与安全的最佳实践

PHP加密与安全的最佳实践 概述 在当今信息时代&#xff0c;数据安全是非常重要的。对于开发人员而言&#xff0c;掌握加密和安全的最佳实践是必不可少的。PHP作为一种常用的后端开发语言&#xff0c;提供了许多功能强大且易于使用的加密和安全性相关函数和类。本文将介绍一些P…

vue动态修改audio地址

问题&#xff1a;点击后替换url地址&#xff0c;实现了&#xff0c;但是播放器依旧没有反应。 解决&#xff1a;vue中动态替换只是替换了地址&#xff0c;并没有告诉audio标签是否要执行&#xff0c;执行什么操作。要load后才能让它知道&#xff0c;是在喊他&#xff0c;他需求…

geacon_pro配合catcs4.5上线Mac、Linux

我的个人博客: xzajyjs.cn 一些链接 Try师傅的catcs4.5项目: https://github.com/TryGOTry/CobaltStrike_Cat_4.5&#xff0c;最新版解压密码见&#xff1a;https://www.nctry.com/2708.html geacon_pro: https://github.com/testxxxzzz/geacon_pro BeaconTool.jar: https:/…

工业用故障电弧探测器的设计与应用

安科瑞虞佳豪 壹捌柒陆壹伍玖玖零玖叁 故障电弧产生的原因---绝缘破损 原因二&#xff1a;线路绝缘破损&#xff0c;导致相间并联故障电弧及对地故障电弧 (1)电气线路施工时未按规范使用套管等保护措施&#xff1b; (2)野蛮施工等施工不当导致线路绝缘皮破损&#xff1b; …

基于web的人力资源管理系统/基于java的OA系统

摘 要 人力资源管理系统是现代企业的核心内容。随着计算机信息技术的高速发展电子商务模式的空前盛行&#xff0c;企业之间的竞争也从有形的经济市场转向了网络。开发以计算机技术、网络技术、信息技术支持的现代人力资源管理系统&#xff0c;既能提高人力资源管理的技术含量和…

云上社群学习系统部分接口设计详解与测试

目录 一、项目简介 1. 使用统一返回格式&#xff0b;全局错误信息定义处理前后端交互时的返回结果 2&#xff0e;使用ControllerAdviceExceptionHandler实现全局异常处理 3&#xff0e;使用拦截器实现用户登录校验 4. 使用MybatisGeneratorConfig生成常的增删改查方法 5. …

.net core发布到IIS上出现 HTTP 错误 500.19

1.检查.net core 环境运行环境是否安装完成&#xff0c;类似如下环境 2.IIS是否安装全 本次原因就是IIS未安装全导致的 按照网上说的手动重启iis&#xff08;iisreset&#xff09;也不行

无涯教程-Perl - telldir函数

描述 此函数返回DIRHANDLE引用的目录列表中读指针的当前位置。此返回值可以由seekdir()函数使用。 语法 以下是此函数的简单语法- telldir DIRHANDLE返回值 此函数返回目录中的当前位置。 例 以下是显示其基本用法的示例代码,/tmp目录中只有两个文件- #!/usr/bin/perl …

Vue用JSEncrypt对长文本json加密以及发现解密失败

哈喽 大家好啊&#xff0c;最近发现进行加密后 超长文本后端解密失败&#xff0c;经过看其他博主修改 JSEncrypt原生代码如下&#xff1a; // 分段加密&#xff0c;支持中文JSEncrypt.prototype.encryptUnicodeLong function (string) {var k this.getKey();//根据key所能编…

由小波变换模极大值重建信号

给定信号&#xff0c; 令小波变换的尺度 则x(t)的二进小波变换为 令为取模极大值时的横坐标&#xff0c;那么就是模极大值。 目标是由坐标、模极大值及最后一级的低频分量重建信号x(t) 为了重建x(t)&#xff0c;假定有一信号集合h(t)&#xff0c;该集合中信号的小波变换和x(…

JavaScript请求数据的4种方法总结(Ajax、fetch、jQuery、axios)

JavaScript请求数据有4种主流方式&#xff0c;分别是Ajax、fetch、jQuery和axios。 一、Ajax、fetch、jQuery和axios的详细解释&#xff1a; 1、 Ajax Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种使用JavaScript在用户的浏览器上发送请求的技术&…

分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测

分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 目录 分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.分类预测 | MATLAB实现GAPSO-LSSVM多输入分类预测 2.代码说明&#xff1a;要求于Matlab 2021版及以上版本。 程序…