短信接收流程分析

5,短信接收

如果有信息,RIL层会主动上报消息,RIL.java 的processUnsolicited方法会进行分发,根据网络制式,信息分为GSM和CDMA,

在此就以GSM信息为例论述, processUnsolicited方法对RIL_UNSOL_RESPONSE_NEW_SMS消息处理逻辑如下,

1,调用responseString方法从ril层读取消息内容,

case RIL_UNSOL_RESPONSE_NEW_SMS: ret =  responseString(p); break;

responseString方法如下,

private ObjectresponseString(Parcel p) {String response;response = p.readString();return response;
}

2,将消息转为SmsMessage对象,然后发送出去,

case RIL_UNSOL_RESPONSE_NEW_SMS: {if (RILJ_LOGD) unsljLog(response);// FIXME this should move up a layerString a[] = new String[2];a[1] = (String)ret;SmsMessage sms;sms = SmsMessage.newFromCMT(a);if (mGsmSmsRegistrant != null) {mGsmSmsRegistrant.notifyRegistrant(new AsyncResult(null, sms, null));}

那么,谁会对该消息进行处理呢? 谁注册谁处理。

在RIL的父类BaseCommands的setOnNewGsmSms方法中,

public void setOnNewGsmSms(Handler h, int what, Object obj) {mGsmSmsRegistrant = new Registrant (h, what, obj);
}

并且在GsmInboundSmsHandler的构造方法中,调用了setOnNewGsmSms方法,

private GsmInboundSmsHandler(Context context, SmsStorageMonitor storageMonitor,PhoneBase phone) {super("GsmInboundSmsHandler", context, storageMonitor, phone,GsmCellBroadcastHandler.makeGsmCellBroadcastHandler(context, phone));phone.mCi.setOnNewGsmSms(getHandler(), EVENT_NEW_SMS, null);mDataDownloadHandler = new UsimDataDownloadHandler(phone.mCi);
}

因此,当RIL上报消息时,会向GsmInboundSmsHandler发送EVENT_NEW_SMS消息。

在父类InboundSmsHandler中处理, InboundSmsHandler是一个状态机,

public abstract class InboundSmsHandler extends StateMachine {

并且DeliveringState状态会对EVENT_NEW_SMS消息进行处理,处理流程图如下,


DeliveringState的processMessage对EVENT_NEW_SMS消息处理如下,

case EVENT_NEW_SMS:// handle new SMS from RILhandleNewSms((AsyncResult) msg.obj);sendMessage(EVENT_RETURN_TO_IDLE);return HANDLED;

handleNewSms方法主要是调用dispatchMessage方法分发消息,

SmsMessage sms = (SmsMessage) ar.result;
result = dispatchMessage(sms.mWrappedSmsMessage);

dispatchMessage方法处理逻辑如下,

if (mSmsReceiveDisabled) {// Device doesn't support receiving SMS,log("Received short message on device which doesn't support "+ "receiving SMS. Ignored.");return Intents.RESULT_SMS_HANDLED;
}return dispatchMessageRadioSpecific(smsb);

dispatchMessageRadioSpecific是一个抽象的方法,在具体的子类中实现,

在InboundSmsHandler的dispatchNormalMessage方法主要逻辑如下,

1,将普通短信PDU解析封装成InboundSmsTracker对象,

if ((smsHeader == null) || (smsHeader.concatRef == null)) {// Message is not concatenated.int destPort = -1;if (smsHeader != null && smsHeader.portAddrs != null) {// The message was sent to a port.destPort = smsHeader.portAddrs.destPort;if (DBG) log("destination port: " + destPort);}
tracker = new InboundSmsTracker(sms.getPdu(), sms.getTimestampMillis(), destPort,is3gpp2(), false);

2,如果是长短信,将长短信PDU解析封装成InboundSmsTracker对象,

SmsHeader.ConcatRef concatRef = smsHeader.concatRef;
SmsHeader.PortAddrs portAddrs = smsHeader.portAddrs;
int destPort = (portAddrs != null ? portAddrs.destPort : -1);tracker = new InboundSmsTracker(sms.getPdu(), sms.getTimestampMillis(), destPort,is3gpp2(), sms.getOriginatingAddress(), concatRef.refNumber,concatRef.seqNumber, concatRef.msgCount, false);

3,调用addTrackerToRawTableAndSendMessage方法发送消息,

return addTrackerToRawTableAndSendMessage(tracker);

addTrackerToRawTableAndSendMessage方法中会发送EVENT_BROADCAST_SMS消息,

sendMessage(EVENT_BROADCAST_SMS, tracker);

DeliveringState对EVENT_BROADCAST_SMS消息处理如下,

case EVENT_BROADCAST_SMS:// if any broadcasts were sent, transition to waiting stateInboundSmsTracker inboundSmsTracker = (InboundSmsTracker) msg.obj;if (processMessagePart(inboundSmsTracker)) {transitionTo(mWaitingState);•••

调用processMessagePart方法进行处理, InboundSmsHandler 的processMessagePart方法如下,

int messageCount = tracker.getMessageCount();
byte[][] pdus;
int destPort = tracker.getDestPort();if (messageCount == 1) {//普通短信// single-part messagepdus = new byte[][]{tracker.getPdu()};
else { //长短信
•••
String address = tracker.getAddress();
String refNumber = Integer.toString(tracker.getReferenceNumber());
String count = Integer.toString(tracker.getMessageCount());
•••
dispatchSmsDeliveryIntent(pdus, tracker.getFormat(), destPort, resultReceiver);

最后调用dispatchSmsDeliveryIntent方法进行处理,该方法如下,

Intent intent = new Intent();
intent.putExtra("pdus", pdus);
intent.putExtra("format", format);
•••
intent.setAction(Intents.DATA_SMS_RECEIVED_ACTION);
Uri uri = Uri.parse("sms://localhost:" + destPort);
intent.setData(uri);
intent.setComponent(null);
•••
dispatchIntent(intent, android.Manifest.permission.RECEIVE_SMS,AppOpsManager.OP_RECEIVE_SMS, options, resultReceiver, UserHandle.OWNER);

最后调用dispatchIntent方法发送广播,

dispatchIntent方法如最后会调用sendOrderedBroadcastAsUser发送广播。

这样, 在应用层注册这些广播就可以处理收到的信息。Mms中对接收短信的处理在此就不论述了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/43562.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 发送短信

一、发送短信的方法 使用 Intent 隐式调用系统短信应用进行发送 Uri uri Uri.parse("smsto:10086");Intent it new Intent(Intent.ACTION_SENDTO, uri);it.putExtra("sms_body", "Hello World!");startActivity(it); 使…

量化策略和level2行情数据股票市场需求大吗?

国内量化交易起步较晚,大约15年开始,20年开始爆发,21年量化私募规模飙升。由于容量过大,出现了一个头部量化私募中性策略导致大幅回调的问题。对于a股来说,量化交易仍然是一种相对较新的投资方式。自20年以来&#xff…

DFQ量化论文阅读

Data-Free Quantization Through Weight Equalization and Bias Correction 高通的训练后量化,提高性能 量化的不同水平 水平1:无需数据和反向传播 水平2:需要数据但不需要反向传播,例如IAO的校准 水平3:需要数据也…

【vn.py】量化策略历史回测(基于本地csv数据)

文章目录 写在前面获取数据csv数据导入历史回测写在后面REF 写在前面 策略研发之后,为了检测我们策略的效果,不可能一上来就接入实盘,所以需要的就是通过历史数据对我们的策略进行检验,也就是历史回测。vn.py也有推出历史回测的教…

「量化技术」Inv_Strategy 胜率76%的趋势反转策略

0 简介 Inv_Strategy为自研的趋势反转策略,能够有效识别到时间序列的趋势拐点,能辅助进行交易决策,规避风险、降低持仓成本。策略基于深度神经网络技术,利用前2个月的量价关系进行inference(推理)&#xf…

基于BigQuant的量化策略实现

文章目录 一、BigQuant的重要模块说明 1.回测模块 二、基于技术指标的策略实现 1.库函数导入与全局变量初始化 2.每日逻辑函数编写 策略1: MACD金叉MA多头买入 策略2: 利用MA指标进行择股 3.策略结果展示 策略1: MACD金叉MA多头买入 策略2: MA择股 三、基于QP优化的策略实现 …

【定量分析、量化金融与统计学】纵向数据分析(1)——截面数据、时间序列数据和纵向数据

一、截面数据(Cross-sectional Data) 截面数据就是固定时间来分析其他变量同一时间内的关系。 例如:比较2022年的全国20个省市的GDP与人口,那么我们就是限定了2022年,去找GDP和人口的可能关系。 再例如:…

gdp数据分析

1 概述 本文主要分析china,usa,king,japan,russia5个国家的gdp,时间从1800-2040,后面的数据为预测数据,不准确。 2 绘制折线图 import pandas as pd import matplotlib.pyplot as pltdata pd.read_csv("line_animation.csv") x…

Python量化策略入门1-如何利用聚宽(JoinQuant)下载金融数据

[TOC]量化策略入门1-如何利用聚宽(JoinQuant)下载金融数据 前言 量化策略入门系列文章是本人学习股票量化笔记,最终输出结果希望是一个可在本地运行的回测框架,包含数据获取,数据处理,策略回测等。 本文主要为了介绍如何利用聚…

金 融 量 化 分 析 • 外 篇 • 绘 制 行 情 数 据 数 据 图

文章目录 前言一、k 线 图 是 什 么 ?二、K 线 图 结 构(1) 影 线 和 实 体(2) 十 字 线 四、 双 均 线 策 略(一)、金叉(二)、死叉(三)、均 线 策…

老板,摊牌了,不装了,pyechart高端实现我国GDP大数据图

pyechart实现我国GDP大屏展示图 from typing import Listimport pyecharts.options as opts from pyecharts.globals import ThemeType from pyecharts.commons.utils import JsCode from pyecharts.charts import Timeline, Grid, Bar, Map, Pie, Linedata [{"time"…

将《2020中国统计年鉴》中的GDP数据换算成不变GDP数据

文章目录 前言一、数据来源二、计算步骤1.理解一下公式和不同的指数国内生产总值指数(上一年100)国内生产总值指数(1978年100)现价GDP: 即当年价GDP,也叫名义GDP,包含价格浮动因素,不可比不变价…

【qstock量化】数据篇之宏观指标和财经新闻文本

qstock简介 qstock由“Python金融量化”公众号开发,试图打造成个人量化投研分析开源库,目前包括数据获取(data)、可视化(plot)、选股(stock)和量化回测(backtest)四个模块。其中数据模块(data&a…

使用Postman模拟发送get、post、delete、put请求

使用Postman模拟发送get、post、delete、put请求 现在的模拟发送请求插件很多,包括在idea上都自带了Test restful web service来模拟请求,但亲测postman更好用一些 今天来分享如何使用postman发送各种请求 1.下载 postman是谷歌的一款插件&#xff0…

使用hutool发送POST请求

之前使用Java程序发送请求都是使用的HttpURLConnection&#xff0c;不太方便&#xff0c;可以使用hutool封装好的方法。 引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.0.M4</…

10小时训练数据打造多语种语音识别新高度

本文联合撰写&#xff1a; 腾讯&#xff1a;吕志强&#xff0c;颜京豪&#xff0c;胡鹏飞&#xff0c;康健&#xff0c;阿敏巴雅尔 导语&#xff5c;在刚刚结束的NIST OPENASR评测中&#xff0c;TEG AI语音联合清华大学&#xff0c;刷新世界小语种语音识别比赛6项第一。从2000年…

Python开发智能语音机器人——小O同学

本篇代码存在部分错误 &#xff0c;现已经更新 &#xff08;https://blog.csdn.net/aqqwvfbukn/article/details/131277668&#xff09; 这次项目开发能按部就班顺利完成&#xff0c;主要是靠队友成功在软件的前期设计阶段&#xff0c;需求分析和用例设计起到了重要的作用。当…

微信小程序实现图林机器人聊天和百度AI语音识别的简单人工客服

用微信小程序实现简单的人工客服 最近在做软件工程的课程设计&#xff0c;选择性的做了微信小程序的简单的人工客服。在这里对该课程设计的原理和实现进行一个讲解&#xff0c;也算做一个总结和笔记&#xff0c;方便自己以后查看、复习和帮助大家的学习。 工具&#xff1a;微信…

Python实现语音识别(基于百度语音识别)

我是一名2016级电子信息工程的学生&#xff0c;这是第一次发博客&#xff0c;因为经常在这里查资料 &#xff0c;自己也应该贡献一点经验吧&#xff0c;也可以当是记录自己学习的过程吧。 最近在自学python&#xff0c;然后18年9月份正好python加入计算机二级&#xff0c;再然…

玩转百度语音识别,就是这么简单

http://www.cnblogs.com/bigdataZJ/p/SpeechRecognition.html 明后两天就是公司一年一度的Fedex Day了。我的理解就是技术界的头脑风暴&#xff0c;idea喷如泉涌的盛大节日。 对于这次活动每个人或者两三个人一组需要有个idea&#xff0c;针对当前的产品现状&#xff0c;提出自…