介绍
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