鸿蒙3.1 设备管理DeviceManager
介绍
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;//本地设备idstd::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;//tokenstd::string token;int32_t reason;std::vector<std::string> syncGroupList;
} DmAuthRequestContext;
RequestMessage
{"ITF_VER" : "1.1","MSG_TYPE": 100,"SLICE":
}
连接状态
typedef enum AuthState {//初始化阶段,完成后会转到negotiateAUTH_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相关文章:
鸿蒙3.1 设备管理DeviceManager
介绍 DeviceManager组件在OpenHarmony上提供账号无关的分布式设备的认证组网能力,并为开发者提供了一套用于分布式设备间监听、发现和认证的接口。 其组成及依赖如下所示: 总结 设备管理模块其实就是软总线的包皮服务。目前权限都是控制系统uid,但是根据官方介绍,后续可…...
Git 目录详解
一、Git目录详解 在使用Git时,有几个目录和文件在Git项目中扮演着重要的角色,下面详细介绍一下这些目录和文件的作用 1、.git目录 .git目录是Git项目的核心,包含了Git的版本库和元数据等重要信息。在该目录中,有一些重要的子目录和…...
基于springboot+vue的武汉旅游网(前后端分离)
博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...
步入React正殿 - React组件设计模式
目录 扩展学习资料 高阶组件 /src/components/hoc/withTooltip.js /src/components/hoc/itemA.jsx /src/components/hoc/itemB.jsx /src/App.js 函数作为子组件【Render pprops】 函数作为子组件 /src/components/rp/itemC.jsx【父组件】 /src/components/rp/withToo…...
Java 单例模式简单介绍
何为单例模式 所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 实现思路 如果我们要让类在一个虚拟机中只能产生一个对象,我们首先必…...
根据源码,模拟实现 RabbitMQ - 从需求分析到实现核心类(1)
目录 一、需求分析 1.1、对 Message Queue 的认识 1.2、消息队列核心概念 1.3、Broker Server 内部关键概念 1.4、Broker Server 核心 API (重点实现) 1.5、交换机类型 Direct 直接交换机 Fanout 扇出交换机 Topic 主题交换机 1.6、持久化 1.7…...
企业服务器数据库遭到malox勒索病毒攻击后如何解决,勒索病毒解密
网络技术的发展不仅为企业带来了更高的效率,还为企业带来信息安全威胁,其中较为常见的就是勒索病毒攻击。近期,我们公司收到很多企业的求助,企业的服务器数据库遭到了malox勒索病毒攻击,导致系统内部的许多重要数据被加…...
udp与can通信的选择与比较
UDP(用户数据报协议)和CAN(控制器局域网)是两种不同的通信协议,它们在实时传递性上有一些区别。 UDP是一种无连接的传输协议,它提供了简单的、不可靠的数据传输。UDP不提供可靠性保证、流控制或重传机制。…...
HoudiniVex笔记_P24_ForceBasics力基础
原视频:https://www.youtube.com/playlist?listPLzRzqTjuGIDhiXsP0hN3qBxAZ6lkVfGDI Bili:Houdini最强VEX算法教程 - VEX for Algorithmic Design_哔哩哔哩_bilibili Houdini版本:19.5 1、什么是Force 本章主要讲重力、弹力、速度与质量、…...
半导体退火那些事(1)
1.半导体退火的原理 半导体材料在晶体生长和制造过程中,由于各种原因会出现缺陷、杂质、位错等结构性缺陷,导致晶格不完整,施加电场后的电导率较低。通过退火处理,可以使材料得到修复,结晶体内部重新排列,…...
MapReduce介绍
目录 一、什么是MapReduce 二、MapReduce 的设计思想 2.1 分而治之 2.2 构建抽象模型:Map和Reduce 2.3 隐藏系统层细节 三、MapReduce 的框架原理 3.1 MRv1工作原理 3.1.1 MRv1架构工作原理图 3.1.1.1 流程说明 3.1.1.1.1 作业的提交 3.1.1.1.2 作业的初始化 3…...
Redis支持的主要数据结构操作命令有哪些?
Redis支持多种数据结构操作命令,包括以下主要命令: 字符串(Strings): SET:设置字符串键的值。GET:获取指定键的值。INCR/DECR:对存储整数的字符串执行加一或减一操作。APPEND&#x…...
环境与能源创新专题:地级市绿色创新、碳排放与环境规制数据
数据简介:推动绿色发展,促进人与自然和谐共生是重大战略举措。绿色发展强调“绿水青山就是金山银山”,人与自然和谐共生重在正确处理生态环境保护与经济发展的关系。在着力于实现绿色发展的过程中,绿色创新是绿色发展的重要驱动因…...
设计模式之门面模式(Facade)的C++实现
1、门面模式提出 在组件的开发过程中,某些接口之间的依赖是比较紧密的,如果某个接口发生变化,其他的接口也会跟着发生变化,这样的代码违背了代码的设计原则。门面设计模式是在外部客户程序和系统程序之间添加了一层中间接口&…...
【数理知识】向量与基的内积,Matlab 代码验证
序号内容1【数理知识】向量的坐标基表示法,Matlab 代码验证2【数理知识】向量与基的内积,Matlab 代码验证 文章目录 1. 向量与基的内积2. 二维平面向量举例3. 代码验证Ref 1. 向量与基的内积 假设存在一个二维平面内的向量 a ⃗ \vec{a} a ,…...
黑客入侵:福特汽车Sync3车机存在漏洞,黑客入侵可抹除系统数据
据福特汽车公告,他们发现部分2021年至2022年车型的Sync3车机存在Wi-Fi漏洞,该漏洞可能被黑客利用来入侵并抹除车机内的系统数据。这一漏洞源于福特车系中采用的WL18xx MCP驱动程序的内存缓冲区溢位漏洞,其漏洞编号为CVE-2023-29468。 这一发现…...
面试热题(单词搜索)
给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相…...
自定义表格组件:实现表格中有固定列的功能逻辑
目录 1,效果图2,实现思路3,实现方式 1,效果图 可以拖动纵向滑块,最左边一列固定住。 以同样的道理,可以在右面固定一列 2,实现思路 作为一个table组件,要接受父组件中的对table的…...
uni-app弹窗列表滚动, 弹框下面的内容也跟随滚动解决方案
滑动弹窗里的列表,弹框下面的内容也会跟着滑动,导致弹窗中的列表不能正常滚动 1.弹窗组件代码,需要在最外层的view中加入touchmove.stop.prevent"moveHandle",且弹窗中需要滚动的列表要使用scroll-view标签包裹起来&…...
Django操作cookie、Django操作session、Django中的Session配置、CBV添加装饰器、中间件、csrf跨站请求
一、Django操作cookie cookie的原理cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。1.设置cook…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
