1.概述

手机的飞行模式又叫航空模式、飞航模式,是在乘坐飞机时必须关掉手机或者开启手机自带的飞行模式切断所有通讯信号,以免手机信号的发射和接收对飞机飞行造成影响,现在智能手机里就自带了这个功能,关闭掉SIM卡的信号收发装置。开发者手机通过关闭sim protocol来实现。

2.实现原理

在用户态中,开启飞行模式,实际上是关闭sim协议栈,给modem发送AT+SFUN=5来实现;在用户态中关飞行模式,需要开启sim协议栈,给modem发送AT+SFUN=4来实现.

3.开启飞行模式代码流程

 

 modem侧,开启飞行模式关联的代码仓有:coreServer,cellularData,stateRegistry,rilAdapter. 在用户侧开启飞行模式后,setting会发布一个开启飞行模式的公共事件,coreServer有一个飞行模式监听AirplaneModeObserver,当飞行模式状态更变时,OnChange函数来响应,搜网处理类发送SettingEventCode::MSG_AUTO_AIRPLANE_MODE消息,然后消息处理函数解析到该事件后,调用回调函数OnChange(),给搜网处理发送MSG_AUTO_AIRPLANE_MODE消息,搜网处理函数调用RadioInfo::AirplaneModeChange处理飞行模式状态变化,如果有dataConnections,则清空data连接。通过NetworkSearchCallback->ClearCellularDataConnections 将状态转移到cellularData中去。

NetworkSearchHandler::memberFuncMap注册了回调函数

{ SettingEventCode::MSG_AUTO_AIRPLANE_MODE, &NetworkSearchHandler::AirplaneModeChange },

 

消息处理函数:

回调响应函数:

 

 

这里我们重点关注cellularData->ClearCellularDataConnections(slotId_);

这里分析cellularData的继承关系问题,清理具体的函数调用关系,这里涉及到多态。cellularData的类型为:sptr<NetWorkSearchCallBackBase>,NetWorkSearchCallBackBase类中有虚函数:ClearCellularDataConnectionsNetWorkSearchCallBackBase为父类,子类为:NetworkSearchCallbacknsm->GetCellularCallBack()返回子类NetworkSearchCallback。所以这里构成了多态,会调用子类的ClearCellularDataConnections

父类的虚函数:

子类继承父类:

子类的ClearCellularDataConnections

 

cellularData侧:

dataConnection清空在cellularData中完成,cellularDataController控制cellularDataHandler完成dataConnection清空,并将PROFILE_STATE_DISCONNECT消息通知到stateRegistry中,stateRegistry发布COMMON_EVENT_CELLULAR_DATA_STATE_CHANGED消息给公共事件。

通过slotId号找到std::map<int,CellularDataController>,然后调用cellularDataController中的ClearAllConnections();

遍历所有的APN,然后挨个ClearConnection();

给状态机发送MSG_SM_DISCONNECT;

处理MSG_SM_DISCONNECT消息

cellularDataStateMachine状态机让coreServer DeactivatePdpContext

适配管理层调用telRilManager_->DeactivePdpContext();

调用TaskSchedule(),TelRilData::DeactivatePdpContext创建任务调度;

适配层发送DeactivatePdpContext

rilAdapter层处理:

去激活:

发送AT+SFUN=5,关闭sim协议栈:

 

最后vendoer层会调用SendRilCommond 发送AT+SFUN=5 关闭sim协议栈

 

 

 

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐