首页 > 技术文章 > 移动4G插卡注网

kaifyou 2017-01-13 13:45 原文

本文根据插入移动4G单卡到注册4G网络过程的mtklog分析。

插卡动作:

 

从以上信息无法区分单卡还是双卡,通过ATR参数判断:

 

注网流程,此过程未开启4G数据连接:

[MS->NW] ESM_MSG_PDN_CONNECTIVITY_REQUEST (PTI:5, EBI:0)

 

[MS->NW] EMM_Attach_Request(EPS attach type="EMM_ATTACH_TYPE_COMBINED_ATTACH")

 

[NW->MS] ESM_MSG_ESM_INFORMATION_REQUEST (PTI:5, EBI:0)

 

[MS->NW] ESM_MSG_ESM_INFORMATION_RESPONSE (PTI:5, EBI:0)

 

[NW->MS] EMM_Attach_Accept(EPS attach result="EMM_ATTACH_RESULT_COMBINED_ATTACHED")

 

[NW->MS] ESM_MSG_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_REQUEST (PTI:5, EBI:5)

 

[MS->NW] ESM_MSG_ACTIVATE_DEFAULT_EPS_BEARER_CONTEXT_ACCEPT (PTI:0, EBI:5)

 

[MS->NW] EMM_Attach_Complete

 

上报信号强度事件(Ril.cpp):

 

 

RILJ 的处理函数(Ril.java):

 

 

mSignalStrengthRegistrant 对象的创建(BaseCommands.java):

 

 

setOnSignalStrengthUp() 函数在ServiceStateTracker 类的构造函数中调用:

 

 

通过传入this,EVENT_SIGNAL_STRENGTH_UPDATE消息由该类或其子类处理,该处理函数在GSMServiceStateTracker 类中:

 

 

mSignalStrengthChangedRegistrants 通知者对象的初始化:

 

 

向该通知者添加监听对象方法:

 

 

分析该方法暂未被调用,所以没有需通知的监听对象。

继续分析onSignalStrengthResult() 函数处理上报的信号:

 

 

setGsm() 设置phone标识;isGsm = true,代表Gsm、Lte;否则代表Cdma

函数validateInput() 对信号区间做一个判断:

 

 

notifySignalStrength() 更新信号强度:

 

 

判断当前信号强度与上次保留的信号强度值,获取信号强度等级:

 

继续分析PhoneBase 类的 notifySignalStrength() 函数:

 

 

mNotifer 是 PhoneNotifer 接口的对象,notifySignalStrength() 方法的实现在 DefaultPhoneNotifier 类中:

 

 

方法如下:

 

 

mRegistry 对象的创建:

 

 

类TelephonyRegistry 继承自 ITelephonyRegistry.Stub,作为Service运行在system_server进程中,它会通知注册者。

上面的DefaultPhoneNotifier运行在com.Android.phone进程中,当信号强度值变化时,通过Service进行通知(service被感兴趣的注册者调用了listen,添加了回调函数。

 

 

通知上层信号强度变化。

可参考:http://blog.csdn.net/feitian_666/article/details/52879929

 

推荐阅读