关于Android6.0系统信号强度上报以及处理流程

关于Android6.0系统信号强度上报以及处理流程,+CSQ

1.RIL模块函数onUnsolicited收到主动上报+CIEV时,当检测到第一个参数为2时(指示为signal),添加ril event并注册callback函数unsolgetSignalStrength;定时器超时后调用回调函数unsolgetSignalStrength,内部发送AT+CSQ给Modem查询信号强度,从返回结果中解析出信号强度和ErrorbitRate存放在buffer中,然后往上层传;

RIL_onUnsolicitedResponse (RIL_UNSOL_SIGNAL_STRENGTH,response, sizeof(response));

 

2. RIL_onUnsolicitedResponse功能分析

利用Parcel机制组装Parcel消息(如下语句指示这是一条信号强度数据主动上报的消息)

    p.writeInt32 (RESPONSE_UNSOLICITED);

    p.writeInt32 (uRIL_UNSOL_SIGNAL_STRENGTH);

然后根据RIL_UNSOL_SIGNAL_STRENGTH找到主动上报分发结构体数组s_unsolResponses[RIL_UNSOL_SIGNAL_STRENGTH],找到信号强度分发函数responseRilSignalStrength,函数responseRilSignalStrength内部用结构体RIL_SignalStrength_v10强转输入参数response指针,把各种接入技术的信号强度添加至Parcel消息中,如下代码均是用于组装Parcel消息;

        p.writeInt32(p_cur->GW_SignalStrength.signalStrength);

        p.writeInt32(p_cur->GW_SignalStrength.bitErrorRate);

        p.writeInt32(p_cur->CDMA_SignalStrength.dbm);

        p.writeInt32(p_cur->CDMA_SignalStrength.ecio);

        p.writeInt32(p_cur->EVDO_SignalStrength.dbm);

        p.writeInt32(p_cur->EVDO_SignalStrength.ecio);

        p.writeInt32(p_cur->EVDO_SignalStrength.signalNoiseRatio);

        p.writeInt32(p_cur->LTE_SignalStrength.signalStrength);

        p.writeInt32(p_cur->LTE_SignalStrength.rsrp);

        p.writeInt32(p_cur->LTE_SignalStrength.rsrq);

        p.writeInt32(p_cur->LTE_SignalStrength.rssnr);

        p.writeInt32(p_cur->LTE_SignalStrength.cqi);

           

最后调用sendResponse通过socket把Parce消息的数据开始地址以及数据长度发送给RILJ

sendResponseRaw(p.data(), p.dataSize());

 

3. RILJ模块收到消息后的处理流程

涉及文件framework/opt/telephony/src/java/com/android/internal/telephony/RIL.java

类RILReceiver成员run函数内部存在一个死循环for(;;),用于从socket读取数据

length = readRilMessage(is, buffer);

当socket上有可读数据时,调用Parcel.obtain()去除Parcel消息,然后从buffer清空Parcel消息;

   p = Parcel.obtain();

   p.unmarshall(buffer, 0, length);

   p.setDataPosition(0);

调用processResponse处理取出来的Parcel消息

   processResponse(p);

4. processResponse函数分析

调用p.readInt()获取信息的类型,依次判断这条消息是Solicited消息还是UnSolicited消息;分别调用各自的处理哈数;

Solicited消息处理函数:processSolicited

UnSolicited消息处理函数:processUnsolicited

由于信号强度为主动上报数据(UnSolicited)因此调用processUnsolicited函数,内部首先从Parcel消息体中获取主动上报消息ID,根据主动上报消息ID(RIL_UNSOL_SIGNAL_STRENGTH)调用处理函数responseSignalStrength

responseSignalStrength-->SignalStrength.makeSignalStrengthFromRilParcel(p)本地为信号强度分配结构体,并根据Parcel消息对信号强度结构体的赋值,然后把信号强度结构体作为返回值返回至responseSignalStrength,接着调用函数mSignalStrengthRegistrant.notifyRegistrant(new AsyncResult (null, ret, null))把填充完成的信号强度结构体添加至消息队列;

函数handleMessage收到消息后,根据消息ID:EVENT_GET_SIGNAL_STRENGTH调用onSignalStrengthResult实现为信号强度赋值,最后通知UI信号强度有变化;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值