《OpenHarmony 3GPP协议开发深度剖析》之--PLMN业务源码解读 原创 精华
接续上一篇<<搜网流程之PLMN选择>>
搜网流程可以简单概括为PLMN选择、小区搜索、网络注册,而PLMN选择主要在cp侧完成,而PLMN在OpenHarmony源码中(即AP侧)主要涉及到的业务就是搜网模块中的运营商相关信息获取的业务,比如我们常见的手机状态栏上的运营商名称显示。
下面来针对AP侧中搜网相关的PLMN业务解读下源码流程。
Ril架构回顾
在进行代码解读之前,还是对电话子系统的架构再讲解下,如下图
modem厂商针对OpenHarmony定制自己的lib库,lib库里面主要就是一些AT指令操作,在hril层会根据当前设备的modem指定加载modem对应的厂商库,从而屏蔽直接与modem打交道。而hril层通过HDF驱动框架与tel_ril层进行通信,tel_ril层以上就是AP侧的具体业务逻辑处理了,再往上走就是tel framework层了,该层和tel_ril层主要通过proxy-stub架构进行通信,再framework层就可以定义一些上层api提供给上层应用调用,比如说定义一个api为getOperatorName提供给上层app获取运营商的名称,然后在systemui中调用该api就可以获取到运营商名称并且更新手机状态栏上的运营商名称显示,比如显示“中国移动”。
1.完成Modem初始化,并创建监听modem业务事件监听。
首先从modem侧出发,modem会对电话子系统相关业务事件进行主动上报。
在ril的驱动初始化的时候会加载modem厂商库,见hri_hdf.c中的代码,如下:
在LoadVendor中调用了RilInitOps接口,modem厂商库运行的入口在vendor_adapter.c文件中的const HRilOps *RilInitOps(const struct HRilReport * reportOps)接口,代码如下:
在创建g_eventListeners线程传入的EventListeners里面有如下核心代码:
ATStartReadLoop的代码如下:
ModemInit函数的代码如下:
从代码可以看出,这里初始化就是发出一些列AT指令给modem。
2.modem上报业务事件的回调函数
其中请求参数reportOps为RIL Adapter传入的事件回调函数指针,这个函数回调指针在hri_hdc.c中进行定义,如下:
在hril.h中定义了结构体HRilReport,代码如下:
其中OnNetworkReport就是我们要研究的搜网相关业务,而PLMN业务就包含在其中。
在Modem设备节点读取线程g_reader里调用OnNotifyOps()解析具体的Modem上报事件,判断AT命令类型,并调用OnXxxReport()把解析得到的各模块事件上报给hril业务层。
在vendor_report.c中的OnNotifyOps接口代码如下:
继续分析OnNotifyNetWorksOps的代码,如下
此时会发现里面也是对AT命令进行判断,比如这个OnCsRegStatusNotify就是CS域注册状态通知,继续看OnCsRegStatusNotify的代码,如下
从上面代码发现有一个上报事件的业务标识符HNOTI_NETWORK_CS_REG_STATUS_UPDATED。
3. hril层通过HDF框架与tel_rel层
继续去追踪这个标识符的代码,就可以定位到tel_ril层了。
在hril_network.cpp中有如下代码:
这里将HNOTI_NETWORK_CS_REG_STATUS_UPDATED的回调交由HRilNetwork::NetworkCsRegStatusUpdated来处理,下面继续追此代码,如下
从上面代码,可以看出通过HDF驱动发送HNOTI_NETWORK_CS_REG_STATUS_UPDATED消息给tel_ril层,下面就可以看tel_rel层与hril_network.cpp所对应的文件tel_ril_network.cpp的代码,有如下关键代码:
这样,上报的cs域状态更新的业务就由NetworkCsRegStatusUpdated函数来处理。
4. 通过观察者模式监听RadioEvent,NetworkSearchHandler进行搜网业务处理
继续阅读上面提到的NetworkCsRegStatusUpdated的代码,如下:
关键代码observerHandler_->NotifyObserver(RadioEvent::RADIO_NETWORK_STATE, regStatusInfo);
这里会使用观察者模式,监听RadioEvent::RADIO_NETWORK_STATE事件。
而对该事件的观察者就是NetworkSearchHandler,下面追踪NetworkSearchHandler的代码,在network_search_handler.cpp中有如下代码
监听到RadioEvent::RADIO_NETWORK_STATE事件,会由GetNetworkStateInfo回调处理,继续追踪GetNetworkStateInfo代码,有如下关键代码:
其中RadioOnState函数里面会调用如下代码:
最终继续去追踪GetRilOperatorInfo这个函数,就会发现可以读取到RIL侧上报过来的PLMN数据,这里就不继续追了。
最后附上上述流程的时序图。
赞,跟着夏老师学源码
跟着夏老师学技术
夏老师加油
感谢夏老师分享