当前位置: 首页 > 科技观察

OpenHarmony电话子系统Cellular_Data源码分析

时间:2023-03-14 22:30:02 科技观察

了解更多开源请访问:51CTO开源基础软件社区https://ost.51cto.com一、电话子系统概述电话各模块主要功能服务子系统如下:核心服务模块:主要功能是初始化RIL管理、SIM卡和网络搜索模块。数据服务模块:主要功能是实现数据上网和路由管理相关服务。呼叫管理模块:主要功能是管理CS(CircuitSwitch,电路交换)、IMS(IPMultimediaSubsystem,IP多媒体子系统)和OTT(overthetop,OTT解决方案)三种类型的呼叫。申请调用音视频资源,处理多路调用产生的各种冲突。蜂窝通话模块:主要功能是实现基于运营商网络的基本通话。短信和彩信模块:主要功能是收发短信和编解码彩信。状态注册模块:主要功能是为电话业务子系统的各种消息事件的订阅和取消订阅提供接口。1.Telephone子系统框架图2.Cellular_Data(数据服务模块)1.代码目录\base\telephony\cellular_data├─frameworks#napi接口存放目录├─interfaces#对外暴露接口├─services#服务内部代码│├─apn_manager#apn管理│├─state_machine#数据状态机│├─utils#通用逻辑│└─外部文件├─sa_profile#sa文件├─ohos.build#compilebuild└─test#测试相关2、流程图的过程APP调用数据服务会依次经过DataService、CoreService、RILAdapter/RILD,再通过AT命令的处理到达CP处理器。CP处理器处理完数据命令后,会将结果一一返回给DataService,最后将获取到的互联网相关数据,如ip、interface、gateway、dns等设置到netmanager/netd,最后在内核中配置它们。流程图如下:3.数据服务初始化流程数据服务初始化流程如下图所示:具体代码调用流程如下:\telephony\cellular_data\services\src\cellular_data_service.cpp等待CoreService在OnStart函数WaitCoreServiceToInit中启动成功,然后执行数据服务的init初始化过程。在初始化init过程中,会依次进行InitModule的初始化,主要是生成CellularDataController和netd相关对象的初始化。\telephony\cellular_data\services\src\cellular_data_controller.cpp在AsynchronousRegister函数中,初始化注册CellularDataController的顺序会进行监听事件和注册数据库监听器。还有CellularDataHandler的初始化。注册的监控事件包括网络状态监控、无线电状态监控、电话状态监控等,这些都会影响数据状态。在\telephony\cellular_data\services\src\cellular_data_handler.cppCellularDataHandler的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.cppn_manager负责管理所有apn,包括创建、查找和删除等操作。apn_holder是一个apn配置文件。4、数据服务创建流程数据服务创建流程如下图所示:具体代码调用流程如下:\telephony\core_service\interfaces\innerkits\cellular_data\cellular_data_manager.cpp\telephony\core_service\interfaces\innerkits\蜂窝数据\蜂窝数据服务。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_data是直接调用EnableCellularData。主要流程在cellular_data_handler中,具体讲解EstablishDataConnection过程中比较重要的流程,包括数据状态机EstablishDataConnection的创建和connect事件的发送:\telephony\cellular_data\services\src\state_machine\cellular_data_state_machine.cpp:createdefaultdata所需的状态机,同样,任何类型的数据都应该创建其对应的状态机:std::shared_ptr,shared_from_this(),GetEventRunner());if(cellularDataStateMachine==nullptr){TELEPHONY_LOGE("cellularDataStateMachine为空");返回空指针;}序列_++;intStateMachineMap_[sequence_]=cellularDataStateMachine;返回cellularDataStateMachine将进行下一步;数据状态机的init初始化操作会依次创建Active、Inactive等状态进入状态机,并设置初始状态为Active,为后续的数据连接做准备:voidCellularDataStateMachine::Init(){activeState_=std::make_unique<主动>(std::weak_ptr(shared_from_this()),"Active").release();inActiveState_=std::make_unique(std::weak_ptr(shared_from_this()),"Inactive").release();activatingState_=std::make_unique(std::weak_ptr(shared_from_this()),"Activating").release();disconnectingState_=std::make_unique(std::weak_ptr(shared_from_this()),"Disconnecting").release();defaultState_=std::make_unique(std::weak_ptr(shared_from_this()),"Default").release();netProviderInfo_=std::make_unique().release();netLinkInfo_=std::make_unique().release();如果(activeState_==nullptr||inActiveState_==nullptr||activatingState_==nullptr||disconnectingState_==nullptr||defaultState_==nullptr||netProviderInfo_==nullptr||netLinkInfo_==nullptr){TELEPHONY_LOGE("内存分配失败");返回;}activeState_->SetParentState(defaultState_);inActiveState_->SetParentState(defaultState_);activatingState_->SetParentState(defaultState_);disconnectingState_->SetParentState(defaultState_);StateMachine::SetOriginalState(inActiveState_);状态机::开始();数据请求:这个过程会根据状态机的当前状态来执行。它会先进入inactive状态,执行真正的DoConnect,并将状态切换到Activating。最后通过状态机的DoConnect建立数据:\telephony\cellular_data\services\src\state_machine\cellular_data_state_machine.cpp:接下来将创建数据的请求发送给core,最后发送给ril_adapter完成数据创建过程。了解更多开源信息,请访问:51CTO开源基础软件社区https://ost.51cto.com。