社区编辑申请
注册/登录
OpenHarmony 电话子系统源码解析之Cellular_Data
系统 OpenHarmony
APP调用数据业务的流程会依次经过Data Service,Core Service,RIL Adapter/RILD,再经过AT命令的处理到达CP处理器。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​

一、电话子系统概述

电话服务子系统各个模块主要作用如下:

核心服务模块:主要功能是初始化RIL管理、SIM卡和搜网模块。

数据服务模块:主要功能是实现数据上网和路由管理相关的业务。

通话管理模块:主要功能是管理CS(Circuit Switch,电路交换)、IMS(IP Multimedia Subsystem,IP多媒体子系统)和OTT(over the top,OTT解决方案)三种类型的通话,申请通话所需要的音视频资源,处理多路通话时产生的各种冲突。

蜂窝通话模块:主要功能是实现基于运营商网络的基础通话。

短彩信模块:主要功能是短信收发和彩信编解码。

状态注册模块:主要功能是提供电话服务子系统各种消息事件的订阅以及取消订阅的API。

1、 电话子系统框架图

二、 Cellular_Data(数据服务模块)

1、 代码目录

\base\telephony\ cellular_data
├─ frameworks # napi接口存放目录
├─ interfaces # 对外部暴露的接口
├─ services # 服务内部代码
├─ apn_manager # apn管理
├─ state_machine # data 状态机
├─ utils # 通用逻辑
└─ 外部files
├─ sa_profile # sa文件
├─ ohos.build # 编译build
└─ test # 测试相关

2、 流程图

APP调用数据业务的流程会依次经过Data Service,Core Service,RIL Adapter/RILD,再经过AT命令的处理到达CP处理器。

CP处理器处理完数据命令后,会依次将结果再返回,到达Data Service,最终将获得的上网相关数据,如ip,interface,gateway,dns等设置到netmanager/netd,最终配置到kernel中。

流程图如下:

3、data service初始化流程

Data service的初始化流程如下图所示:

具体的代码调用流程如下:

\telephony\cellular_data\services\src\cellular_data_service.cpp

在OnStart函数中先等待CoreService启动成功WaitCoreServiceToInit,然后进行data service的init初始化流程。

在初始化init流程中,会依次进行InitModule的初始化,主要是生成CellularDataController和netd相关的对象的初始化.

\telephony\cellular_data\services\src\cellular_data_controller.cpp

在AsynchronousRegister函数中,会依次进行CellularDataController的初始化、注册监听事件、注册database监听。还有要进行CellularDataHandler的初始化。

注册的监听事件包括了网络状态的监听、radio状态的监听和电话状态的监听等,这些都会对数据的状态产生影响。

\telephony\cellular_data\services\src\cellular_data_handler.cpp

CellularDataHandler的Init函数中,主要是对apn管理相关的模块进行初始化,包含ApnManager和ApnHolder等。

\telephony\cellular_data\services\src\apn_manager\ apn_manager.cpp
\telephony\cellular_data\services\src\apn_manager\ apn_holder.cpp.cpp
\telephony\cellular_data\services\src\apn_manager\ apn_item.cpp

apn_manager负责对所有apn进行管理,包括创建、查找和删除等操作。

apn_holder就是一个apn profile。

4、data service建立流程

Data service的建立流程如下图所示:

具体的代码调用流程如下:

\telephony\core_service\interfaces\innerkits\cellular_data\ 
cellular_data_manager.cpp
\telephony\core_service\interfaces\innerkits\cellular_data\
cellular_data_service.cpp
\telephony\core_service\interfaces\innerkits\cellular_data\
cellular_data_controller.cpp
\telephony\core_service\interfaces\innerkits\cellular_data\
cellular_data_handler.cpp

按照上面的时序图可以看出,从cellular_data_manager->cellular_data_service-> cellular_data_controller->cellular_data_handler,是直接调用Enable CellularData。主要的流程在cellular_data_handler中,具体说明EstablishDataConnection过程中比较重要的流程,其中包含了data状态机的创建EstablishDataConnection和connect event的发送:

\telephony\cellular_data\services\src\state_machine\ cellular_data_state_machine.cpp:

创建default data所需要的状态机,类似的,任何类型的数据,应该都会创建其所对应的状态机:

std::shared_ptr<CellularDataStateMachine> CellularDataHandler::CreateCellularDataConnect()  
{
auto cellularDataStateMachine =
std::make_shared<CellularDataStateMachine>(connectionManager_, shared_from_this(), GetEventRunner());
if (cellularDataStateMachine == nullptr) {
TELEPHONY_LOGE("cellularDataStateMachine is null");
return nullptr;
}
sequence_++;
intStateMachineMap_[sequence_] = cellularDataStateMachine;
return cellularDataStateMachine;
}

接下来会进行data状态机的init初始化操作,会依次创建Active、Inactive等状态到状态机中,并设置初始状态为Active,为后续的data connect做好准备:

void CellularDataStateMachine::Init()  
{
activeState_ = std::make_unique<Active>(
std::weak_ptr<CellularDataStateMachine>(shared_from_this()), "Active").release();
inActiveState_ = std::make_unique<Inactive>(
std::weak_ptr<CellularDataStateMachine>(shared_from_this()), "Inactive").release();
activatingState_ = std::make_unique<Activating>(
std::weak_ptr<CellularDataStateMachine>(shared_from_this()), "Activating").release();
disconnectingState_ = std::make_unique<Disconnecting>(
std::weak_ptr<CellularDataStateMachine>(shared_from_this()), "Disconnecting").release();
defaultState_ = std::make_unique<Default>(
std::weak_ptr<CellularDataStateMachine>(shared_from_this()), "Default").release();
netProviderInfo_ = std::make_unique<NetProviderInfo>().release();
netLinkInfo_ = std::make_unique<NetLinkInfo>().release();
if (activeState_ == nullptr || inActiveState_ == nullptr || activatingState_ == nullptr ||
disconnectingState_ == nullptr || defaultState_ == nullptr || netProviderInfo_ == nullptr ||
netLinkInfo_ == nullptr) {
TELEPHONY_LOGE("memory allocation failed");
return;
}
activeState_->SetParentState(defaultState_);
inActiveState_->SetParentState(defaultState_);
activatingState_->SetParentState(defaultState_);
disconnectingState_->SetParentState(defaultState_);
StateMachine::SetOriginalState(inActiveState_);
StateMachine::Start();
}

在上面状态机创建的过程中,最后会建立数据请求:

这个流程会按照状态机当前的状态来执行,会先走到inactive状态中,执行真正的DoConnect,并转换状态到Activating。

最终是通过状态机的DoConnect来建立数据的:

\telephony\cellular_data\services\src\state_machine\ cellular_data_state_machine.cpp:

接下来就会将建立数据的请求发送给core,最终发送给ril_adapter,完成数据建立的流程。

​想了解更多关于开源的内容,请访问:​

​51CTO 开源基础软件社区​

​https://ost.51cto.com​​。

责任编辑:jianghua 来源: 鸿蒙社区
相关推荐

2022-04-02 20:45:04

Hi3516开发板操作系统鸿蒙

2022-04-15 14:31:02

鸿蒙操作系统

2022-05-11 15:08:52

驱动开发系统移植

2022-04-20 20:28:40

HDF 驱动框架鸿蒙操作系统

2022-04-19 11:23:26

release3.1子系统鸿蒙

2022-04-01 15:18:04

HarmonyHDF 驱动鸿蒙

2022-04-07 14:33:31

操作系统鸿蒙HarmonyOS

2021-12-06 06:19:03

2022-04-07 15:28:16

HarmonyOS鸿蒙操作系统

2022-05-09 15:08:56

存储厂商NFV领域华为

2022-04-15 14:57:57

Flex布局鸿蒙操作系统

2022-03-18 16:07:04

Graphic子系统鸿蒙

2021-12-14 10:16:00

2022-05-16 10:36:08

GitHub开源项目

2022-04-01 15:26:06

Harmony操作系统鸿蒙

2022-04-06 11:27:05

harmonyeTS 开发NAPI开发

2022-04-07 14:17:15

Harmonytoast组件鸿蒙

2022-04-26 23:42:08

Windows 10微软升级

2022-03-07 15:22:16

classHarmony鸿蒙

2022-04-21 14:05:21

开发者论坛

同话题下的热门内容

HarmonyOS Connect设备开发--抛除束缚,自定义设备UIOpenEuler-22.03-LTS+UKUI如何快速在AARCH64架构运行与体验OpenHarmony—分区切换之Reboot源码解析HarmonyOS Connect设备开发之南北打通-碰一碰互动OpenHarmony驱动框架HDF中设备管理服务构建过程详解之一如何在DAYU200上安装浏览器-基于OpenHarmony 3.1 Release版本HarmonyOS - Java与Js的混合使用与交互OpenHarmony啃论文计划--一文遍历主要的物联网通信协议

编辑推荐

HarmonyOS 2.0鸿蒙第二期开发者Beta公测申请指南HarmonyOS LYEVK-3861开发板播放《蜜雪冰城》鸿蒙HarmonyOS分布式软总线:构建低时延、高带宽的多设备虚拟网络华为HarmonyOS的强势突围: 直面物联网迷宫的蓄力进击鸿蒙HarmonyOS2.0发布会现场回忆录
我收藏的内容
点赞
收藏

51CTO技术栈公众号