OpenHarmony源码解析之RIL Adapter 原创 精华
作者:杨金壮
1 简介
RIL(Radio Interface Layer)是Telephony和Modem之间的抽象层,用于实现Telephony和Modem之间的通信转换。Modem厂商有高通、mtk、海思、展讯等,不同的Modem在接口、内部机制、实现方式等方面都有不同。RIL Adapter屏蔽不同Modem厂商硬件差异,为上层提供统一的接口。
1.1 OpenHarmony 架构图
RIL Adapter在OpenHarmony 架构中属于电话子系统,如下图所示。
图1 OpenHarmony架构图
1.2 电话子系统
电话子系统属于基础软件服务子系统集,在其核心服务模块core_service中,初始化RIL管理以及获取RIL
Adapter服务,通过注册回调服务,实现与RIL Adapter进行通信。代码目录如下:
/base/telphony/core_service
\|── interfaces # 接口目录
│ \|── innerkits # 部件间的内部接口
│ \|── kits # 对应用提供的接口(例如JS接口)
\|── services # 核心服务实现代码目录
\|── etc # 核心服务的驱动脚本目录
\|── sa_profile # 核心服务的启动文件目录
\|── tel_ril # 核心服务与RIL Adapter通信代码目录
\|── network_search # 搜网服务代码目录
\|── sim # SIM卡服务代码目录
└── common
RIL Adapter不对外暴露接口,可通过核心服务调用,并且需要与Telephony核心服务配合使用,需要Modem厂商库实现接口。
硬件上,需要搭载的设备支持以下硬件:可以进行独立蜂窝通信的Modem。
2 基础知识
RIL Adapter模块的主要功能是转换业务请求为AT命令,监听、解析、上送Modem的response及notification信息。
RIL Adapter可以简单细化为hril层和vendorlib层,为了实现充分解耦,各厂商AT指令等差异化的功能都放在vendorlib层,hril层主要是向上通信,vendorlib层主要是向下和Modem通信。RIL Adapter通过注册HDF服务与上层通讯。RIL Adapter和Modem之间的通信方式常见的有AT命令和QMI两种。
图2 RIL Adapter模块架构图
2.1 AT命令
AT命令是Hayes公司为了控制Modem发明的控制协议,AT命令集是从终端设备(Terminal Equipment,TE)或数据终端设备(Data Terminal Equipment,DTE)向终端适配器(Terminal Adapter,TA)或数据电路终端设备(Data Circuit Terminal Equipment,DCE)发送的。通过AT命令可以进行呼叫、短信、电话本、数据业务、传真等方面的控制,并且采用标准串口来收发AT命令。
所有的AT命令行都由前缀“AT”开始,以回车符<CR>结束。中间是一个或者多个AT命令。AT命令包括:基本命令和扩展命令。扩展命令以字符“+”为前缀,并需要使用分号“;”与前面的命令分隔开。
图3 AT命令格式图
2.2 QMI
QMI(Qualcomm Modem Interface)是高通提供的与Modem交互的接口。QMI框架包括client部分和server部分,其中QMI client运行在RIL Adapter,采用dlopen方式打开,QMI server运行在Modem,client和server之间使用socket方式通讯。
3 代码解析
3.1 代码目录
base/telephony/ril_adapter
├─ hril # hril层的各个业务模块接口实现
├─ hril_hdf # 注册HDF服务,注册向上通信接口
├─ include # 头文件存放目录
├─ interfaces # 对应提供上层各业务内部接口
│ └─ innerkits
├─ test # 单元测试相关代码
│ ├─ mock
│ └─ unittest # 单元测试代码
└─ vendor # 厂商库代码:各业务AT指令
│ └─ include
3.2 代码流程
RIL Adapter除了主线程之外,还会拉起event处理线程和Modem消息处理线程。
**eventLoop:**打开AT通道,完成Modem初始设置,组合AT命令发送到Modem,等待response,并将response上送;
**readLoop :**解析从Modem发过来的消息,notification和response分开处理。
3.3 相关仓
-
注册服务 :https://gitee.com/openharmony/telephony_state_registry
-
riladapter:https://gitee.com/openharmony/telephony_ril_adapter
-
网络管理 :https://gitee.com/openharmony/communication_netmanager_standard
4 核心功能解析
RIL Adapter核心的处理包括厂商库加载,业务接口实现以及Modem消息处理。
4.1 厂商库加载
RIL Adapter是通过dlopen()函数加载厂商so文件,然后调用so文件的RilInitOps()函数,该函数的作用是使得RIL Adapter和so文件互相注册回调函数,把HRilReport注册给so,同时返回HRilOps,RIL Adapter得到一组函数指针。
HRilReport数据结构如下:
HRilOps 数据结构如下:
4.2 业务接口实现
1、注册各业务回调处理函数;
2、目前RIL Adapter支持call、sim、sms、data、modem、network六种业务,下面以call为例介绍业务接口实现;
call业务请求注册:
call业务请求队列:
打电话请求(Dial)处理函数举例:
打电话请求(Dial)response处理:
4.3 Modem消息处理
read Loop监听到Modem上送信息,处理流程如下:
1、首先处理Error、Success简单应答信息,再处理短信业务(因为短信业务信息的文本格式非常固定,共有两行line1和line2,所以做优先特殊处理),其它业务统一处理;
2、解析消息,匹配调用对应业务处理函数;
3、以call业务为例,OnCallReport分开处理response和notification消息;
4、response消息处理;
如果匹配为Dial应答消息,封装处理后上送给业务。
5、notification消息处理,匹配后封装上送给业务。
5 总结
本文档对电话子系统中的RIL Adapter功能、架构、核心源码流程做了简单介绍,目前该模块正在不断开源更新中,该文中涉及代码部分不一定是最新的。
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,共建鸿蒙生态,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
开鸿老师总结的太全面了,必须好好学习一下。