阅读IoTManagementService源码,理解HarmonyOS IPC框架 原创

谦程学步
发布于 2025-8-28 16:18
浏览
0收藏

HarmonyOS通用互联IPC框架实现分析

最近在阅读HarmonyOS通用互联中客户端与服务端源码,客户端源码在hsp实现,服务端在svc实现,hsptest涉及到业务的实践,现附上通用互联仓库地址:https://gitcode.com/ohos-oneconnect/IoTManagementService。

关于IPC的基础概念,网上已经有较多文章,这里就不再阐述,按我个人理解,实现IPC最主要目的是:在保证进程隔离的前提下,实现进程间的数据安全交互与服务调用。

在IPC框架中,最重要的是Proxy、Stub与IRemoteObject,IRemoteObject是客户端与服务端进行IPC通信的底层桥梁,是“服务端暴露的远程接口”,客户端通过封装IRemoteObject的Proxy类(如IoTConnectServiceProxy)实现远程服务调用。

接下来我将从几个方面对IPC框架实现进行自己的介绍:

1.服务端

主要任务是将自身服务注册到IPC框架,将自身的IRemoteObject暴露出来,后续其他进程客户端可绑定与访问服务,服务端通过onRemoteMessageRequest接口监听远程客户端发送过来的请求。

现在我们看一下服务端发布服务的源码,文件路径在:
iotmanagementsvc/entry/src/main/ets/ServiceExtAbility/IotConnectServiceExtAbility.ets,核心类定义如下:
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

该类IotConnectServiceExtAbility继承自ServiceExtensionAbility,重写连接服务的不同操作函数,在IPC框架中,我们重点看看onConnect函数的实现,因为涉及到客户端连接服务之后的一些逻辑实现,在这里返回了IotConnectOpenService的一个实例:
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

这个实例所属的类继承自rpc.RemoteObject,在这里我们将服务端的IRemoteObject通过这个实例暴露到框架,同时在这个实例中的onRemoteMessageRequest函数监听客户端发送的请求,进行InterfaceToken的校验与相关请求数据的获取。
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

2.客户端角度

是“请求的临时发起者”,客户端通过绑定服务获取远程服务的IRemoteObject,后续就可以通过这个对象向服务端发送请求。在hsp客户端代码:iotmanagementhsp/IoTmanagementKit/src/main/ets/openapi/manager/IoTConnectServiceManager.ets中定义了bindTargetService绑定服务函数,通过传递想要连接的服务端对应的Want参数以及common.ConnectOptions类型的回调函数,在这个回调函数里面当连接上服务端之后(onConnect)会返回已经注册到框架的服务端IRemoteObject
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

当我们拿到远程服务对象IRemoteObject之后,创建一个类IoTConnectServiceProxy来存放这个远程服务对象,这个类也是继承自rpc.RemoteObject,这样我们就可以在客户端通过这个对象的sendMessageRequest方法访问远程服务,发送客户端请求。在这个类里面对这个方法进行了进一步的封装,涉及到InterfaceToken的写入、传输数据的处理以及同步异步答复等,核心还是mProxy?.sendMessageRequest。
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

3.双向IPC

在客户端,异步通信时(isAsync=true),客户端需传递一个 object 参数,该参数是客户端自定义的 IRemoteObject 实例(如 RemoteDeviceScanCallback):
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

该类继承自rpc.RemoteObject,并重写了onRemoteMessageRequest方法。这种写法与服务端暴露 IRemoteObject 到框架的逻辑一致——在客户端定义一个继承自rpc.RemoteObject的类,将这个类进行实例化并通过ipc框架传递到服务端,服务端处理完请求后,可通过该实例反向向客户端发送响应。

由于客户端无法向框架注册服务,所以通过IPC向服务端传递自己的IRemoteObject,这样子服务端就可以通过解析这个传递过来的对象,向客户端发送请求信息,然后客户端重写onRemoteMessageRequest方法处理服务传递过来的信息即可。如下为客户端将自身的IRemoteObject写入传递给服务端的数据,还是在上述iotmanagementhsp/IoTmanagementKit/src/main/ets/openapi/manager/IoTConnectServiceManager.ets文件中:
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

在服务端iotmanagementsvc/entry/src/main/ets/idl/IotConnectOpenService.ets,我们对客户端传递过来的数据进行校验解析,同时根据是否为异步答复方式读取客户端传递过来的IRemoteObject:
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

之后调用相关的服务处理函数,处理完之后服务端再将结果通过IPC反向传输回客户端,相关的实现仍然在上述IotConnectOpenService.ets文件。
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

接下来我们重新看回客户端的代码,路径如下:iotmanagementhsp/IoTmanagementKit/src/main/ets/iotConnect/IoTConnectServiceProxy.ets,如果我们不使用双向IPC机制,而是等待IPC服务端单向通过框架返回结果,那我们只需获取远程服务的返回结果(promise方式返回rpc.RequestResult)然后进一步处理即可,如下:
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区
阅读IoTManagementService源码,理解HarmonyOS IPC框架-鸿蒙开发者社区

好了,以上就是本人关于Iot代码的一些分析,本人作为一名刚入职没多久的小白,也是第一次写博客文章,在技术知识与文章撰写方面肯定还存在很多不足及错误,望各位读者海涵。对于文章存在的不足或错误,也希望大家能提出宝贵意见,互相交流,谢谢!

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2025-8-28 16:31:02修改
2
收藏
回复
举报
回复
    相关推荐