流程分成3个部分:
1.RIL的实现流程;
2. 自动上报的信号强度如何实现在屏幕上的刷新;
3.信号强度的主动读取流程;
其一,RIL实现流程,这个在去年有抽一点点时间看过,不过当时因为时间和心情的关系没有看明白,感觉是一头雾水。这一次算是把整体的ril梳理了一下。这里仅仅描述大概的流程:
1.首先了解串口数据的接收和处理
动态加载ril库,取出ril_INIT函数-》创建mainloop线程-》创建readerlooper线程,readerlooper线程主要用于处理串口的数据,先读取串口的数据然后对数据进行解析,分为两种:自动上报的AT数据,AT的反馈数据【主动发送的AT数据,然后接收到modem的返回】。
主动发送的AT分为如下类型:
->NO RESULT------无返回
->SIGNALLINE----返回为单条命令
->NUMBERIC----数字(基本没有用到)
->MUTILINE----返回为多行命令
->SMS---短信PDU
因为每个AT的发送都会收到OK或者非OK的返回,主要是用于验证通讯是否正常。返回ok也仅仅表示发送的at modem已经成功收到。针对返回的是ok还是非ok来填充respone结构体中的success变量。然后根据当前AT指令发送的类型进行解析,把返回的值填到respone里面。
2.AT的发送
AT发送会调用writeline函数将数据写到串口,然后阻塞该线程,等待返回。等待的条件是接收函数processline处理后释放的。在android的代码中是无限等待的,没有做超时处理。
当接收到返回值后根据返回值进行消息的发放。
4.这里要提一下RIL CLASS。要清楚熟悉该class的所有方法。该class继承了basecommands父类,并实现了commandinterface中的方法。还需要注意到RILsender和RILreceiver以及readRilmessgae。
接下来我们来观察如果modem自动上报一个信号强度的AT指令FW如何处理。
先注意:
static CommandInfo s_commands[] = {
#include "ril_commands.h" //返回的AT处理函数注册
};
static UnsolResponseInfo s_unsolResponses[] = {
#include "ril_unsol_commands.h" //自动上报的AT处理函数注册
};
首先会不断从串口读取数据,当收到的数据属于自动上报型的AT的时候用函数onUnsolicited处理。我现在的代码是没有处理自动上报的信号强度AT的,需要我们自己在这个函数中添加。RIL_onUnsolicitedResponse处理接收到的自动上报数据,根据s_unsolResponses里面的对应处理调用相应函数:
ret = s_unsolResponses[unsolResponseIndex]
.responseFunction(p, data, datalen);
之后用函数sendResponse将数据写入文件。
Ril class中的rilreceiver class执行run方法readRilMessage读取数据,然后调用processrespone函数中processUnsolicited实现自动上报AT的解析和处理。
RIL_UNSOL_SIGNAL_STRENGTH为respone值。会执行
if (mSignalStrengthRegistrant != null) {
mSignalStrengthRegistrant.notifyRegistrant(
new AsyncResult (null, ret, null));
}
其中mSignalStrengthRegistrant是ServiceStateTracker CLASS在析构函数中创建的对象:
cm.setOnSignalStrengthUpdate(this, EVENT_SIGNAL_STRENGTH_UPDATE, null);
上面所说的mSignalStrengthRegistrant.notifyRegistrant。执行的是Registrant CLASS 中方法notifyRegistrant。该方法把EVENT_SIGNAL_STRENGTH_UPDATE的notify用message发送出去。
接下来会是ServiceStateTracker CLASS中的handleMessage方法对该event进行处理:
case EVENT_SIGNAL_STRENGTH_UPDATE:
// This is a notification from
// CommandsInterface.setOnSignalStrengthUpdate
ar = (AsyncResult) msg.obj;
// The radio is telling us about signal strength changes
// we don't have to ask it
dontPollSignalStrength = true;
onSignalStrengthResult(ar);
break;
onSignalStrengthResult函数会把返回值进行解析放到变量RSSI里面。如果返回的rssi值与当前的值不一样则调用phone.notifySignalStrength();通知信号发生变化。调用DefaultPhoneNotifier CLASS中notifySignalStrength方法,先把当前rssi值作为mRegistry.notifySignalStrength(sender.getSignalStrengthASU())函数的形参传递过去。执行的是TelephonyRegistry CLASS中notifySignalStrength方法。该方法调用broadcastSignalStrengthChanged(signalStrengthASU);将ACTION_SIGNAL_STRENGTH_CHANGED作为intent发送给android的框架。之后PhoneStateIntentReceiver CLASS会收到并用onReceive对其进行处理:
if (TelephonyIntents.ACTION_SIGNAL_STRENGTH_CHANGED.equals(action)) {
mAsu = intent.getIntExtra(INTENT_KEY_ASU, mAsu);
if (DBG) Log.d(LOG_TAG, "onReceiveIntent: set asu=" + mAsu);
if (mTarget != null && getNotifySignalStrength()) {
Message message = Message.obtain(mTarget, mAsuEventWhat);
mTarget.sendMessage(message);
}
}
其中mAsuEventWhat 为EVENT_SIGNAL_STRENGTH_CHANGED。在RadioInfo ativity中设置:
mPhoneStateReceiver.notifySignalStrength(EVENT_SIGNAL_STRENGTH_CHANGED);
事件EVENT_SIGNAL_STRENGTH_CHANGED会被RadioInfo CLASS的mHandler处理:
case EVENT_SIGNAL_STRENGTH_CHANGED:
updateSignalStrength();
break;
其中updateSignalStrength实现了信号的更新。至此,处理信号的强度流程完毕。
下面我们再来看下主动读取信号强度的流程:
当ServiceStateTracker收到EVENT_SIM_READY的消息的时候,调用handleMessage处理:
其中调用 queueNextSignalStrengthPoll();延时2s后发送EVENT_POLL_SIGNAL_STRENGTH消息,处理为:
case EVENT_POLL_SIGNAL_STRENGTH:
// Just poll signal strength...not part of pollState()
cm.getSignalStrength(obtainMessage(EVENT_GET_SIGNAL_STRENGTH));
break;
getSignalStrength在ril中定义:
getSignalStrength (Message result)
{
RILRequest rr
= RILRequest.obtain(RIL_REQUEST_SIGNAL_STRENGTH, result);
if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
send(rr);
}
其中send发送EVENT_SEND信息,由rilsender处理。建立SocketOutputStream对象,存放数据。这些数据有谁来处理呢?其实register函数里面会先注册:
ril_event_set (&s_listen_event, s_fdListen, false,
listenCallback, NULL);
RIL_startEventLoop(void)函数创建了一个线程eventLoop用于处理ril event。firePending函数最终会调用listenCallback-》processCommandBuffer调用s_commands对应的dispatchFunction函数执行,该函数会执行onrequest。
之后onRequest函数处理:
case RIL_REQUEST_SIGNAL_STRENGTH:
requestSignalStrength(data, datalen, t);
break;
requestSignalStrength给串口发送AT+CSQ,等待返回。返回后调用RIL_onRequestComplete处理:调用sendResponseRaw将数据写到文件中。
RILReceiver会调用readRilMessage不断去读取返回的数据。processResponse处理数据,processSolicited处理等待返回的数据:将其发送出去。
if (rr.mResult != null) {
AsyncResult.forMessage(rr.mResult, null, tr);
rr.mResult.sendToTarget();
}
ServiceStateTracker收到并做如下处理:
case EVENT_GET_SIGNAL_STRENGTH:
// This callback is called when signal strength is polled
// all by itself
if (!(cm.getRadioState().isOn())) {
// Polling will continue when radio turns back on
return;
}
ar = (AsyncResult) msg.obj;
onSignalStrengthResult(ar); //通知已经改变了值
queueNextSignalStrengthPoll();//继续读取值
break;
分享到:
相关推荐
- **外置天线**:若设备支持,可以考虑使用外接GPS天线,以增强接收信号的能力。 - **屏蔽干扰**:检查设备附近是否存在电子设备或金属物体,这些都可能干扰GPS信号。 3. **软件设置调整** - **开启高精度模式**...
雷达阵列天线信号的波达方向估计是利用天线阵列的特性来确定信号的到达方向(Direction of Arrival,简称DOA)。随着雷达技术的发展,信号处理技术也在不断进步,MUSIC(Multiple Signal Classification)算法就是在...
标题中的"method_CA_2D.rar_radar_信号 地波雷达_天线_阵列信号处理_阵列天线信号"揭示了本主题的核心内容,主要涉及雷达信号处理,特别是针对地波雷达(EWR)的二维协方差矩阵(CA)方法。地波雷达是一种利用地表...
阵列天线设计流程与高级培训是针对阵列天线设计与仿真的一份综合性教材,它详细介绍了阵列天线设计中涉及的关键步骤和高级技术。从背景知识到具体的仿真技术、从系统集成化设计到实际的物理应用,本培训资料提供了...
在电子设备中,天线是不可或缺的组成部分,用于接收和发送无线信号。FPC(Flexible Printed Circuit,柔性印制电路)天线因其轻薄、可弯曲的特性,在现代电子设备中广泛应用,特别是在移动通信设备如手机、平板电脑...
在存在干扰波的情况下,智能天线能够有效地抑制干扰,增强信号质量,从而实现更好的通信效果。本知识点将深入探讨四阵元智能天线在特定条件下接收信号波形的特点和处理策略。 首先,我们要理解智能天线的基本原理。...
- **软件流程**:软件设计涵盖了对硬件模块的管理,包括天线转速的测量、数据采集和处理,以及与上位机的通讯,确保了整个测试过程的准确性和实时性。 4. **系统优势与应用** - **高精度**:通过调整采样频率,...
在IT领域,无线通信是至关重要的一部分,而本文将围绕"giuqang.zip"压缩包中的主题展开,涉及的关键知识点包括:CPM(连续相位调制)解调、切比雪夫加权以及相控阵天线信号的产生。 首先,让我们详细探讨CPM...
雷达天线方位角信号模拟系统的设计与实现,是为了在雷达天线单元离线的状态下,对雷达信号处理机进行性能测试。这种模拟系统的开发具有重要的意义,因为它可以提供与实际天线信号属性一致的数据输入,便于雷达信号...
无线路由器的天线不仅是信号发射和接收的媒介,还直接影响着网络的速率和覆盖范围。天线的性能与路由器的协议、无线模块芯片等因素同样关键。 天线的增益是衡量其性能的重要指标,增益越高,信号放大倍数越大,传输...
阵列天线设计流程和高级培训主要涵盖了从基础理论到实际应用的全方位知识,这通常包括了天线理论、建模技术、仿真流程以及与实际应用场景相结合的深入知识。 在设计阵列天线时,首先需要考虑的是阵面设计,也就是...
说明:该文件是MATLAB的实时脚本文件,有很好的人机...1、发射信号产生并发射(构造发射机,发射天线) 2、接收信号生成(构造接收天线、接收机) 3、脉冲压缩处理 4、MTD处理 5、恒虚警处理 6、测角 7、PPI动态扫描
智能天线,也称为自适应天线或阵列天线,其基本思想是利用多个天线单元来形成空间滤波,实现对特定方向信号的增强和非期望方向信号的抑制。这种技术可以显著提高信号质量,降低干扰,增加系统容量,并支持多用户...
### 无线信号增强天线制作相关知识点 #### 一、无线信号增强原理 无线信号增强主要是通过对天线的设计和配置来进行的。天线是无线通信系统中的关键组件之一,其主要功能是转换导波(传输线上的电信号)与自由空间...
手机信号的接收和发射流程是通信技术中的核心环节,尤其在移动通信系统中,这个过程更为复杂。本文将深入解析手机接收与发射信号时涉及的关键器件及其功能。 首先,我们来看信号接收流程: 1. **天线接收**:天线...
在现代无线通信系统中,智能天线技术被广泛应用于提高信号传输效率、降低干扰以及增强通信系统的性能。本资料包包含了有关智能天线MATLAB仿真的精华内容,对学习和研究该领域的人来说极具价值。 首先,我们来深入...
把你的android手机变成一个Wi-Fi分析仪。它可以显示你周围的Wi-Fi信道使用情况,帮助你为你的无线路由选择一个相对空闲的信道以提高连接质量。支持多视图分析,各视图之间只需滑动屏幕即可切换,有快速设置通道,在...
为了增强无线路由器的信号,一种常见的方法是通过自制天线来提升其发射和接收能力。本篇文章将探讨无线路由信号增强天线的制作方法,以及几种不同类型的天线设计。 首先,商业级的天线如24 dBi/27 dBi的天线,适用...
《北斗卫星导航系统民用全球信号多模多频高精度天线产品技术要求和测试方法》是针对北斗导航系统中的一款重要设备——高精度天线所制定的技术规范。这份文档由中国卫星导航系统管理办公室于2021年发布,旨在确保北斗...