STK这个应用,源码比较少,但理解起来并太容易懂,理解这一部分代码,需要对Java的消息机制非常熟悉,它在底层的流程,基本上都是收发消息的处理,而上层的UI很简单,只有两种UI:Dialog和Menu,所有的Dialog都是在StkDialogActivity显示出来的,List都是在StkMenuActivity中显示,具体显示什么内容和哪种UI,上层主要是通过对底层上报上来的消息类型来处理的,在上层所有的UI是没有这些固定内容的,需要根据Modem临时上报上来的内容进行显示,不同的SIM卡具有不同的UI,下面就对每一层的源码进行详细分析
STK 应用层:
BootCompletedReceiver:继承了 BroadcastReceiver,它是一个广播接收类,它只负责接收一个广播,Intent.ACTION_BOOT_COMPLETED,即开机启动完成的广播,当接收到开机启动完成后,开启服务StkAppService,传递参数StkAppService.OPCODE,为StkAppService.OP_BOOT_COMPLETED。
StkCmdReceiver:继承BroadcastReceiver,广播接收类,主要接收来自framework层的StkService发送的针对RIL层上报上来的处理结果的响应信息(详见StkService的handleProactiveCommand()方法),它接收两种广播:
一种是AppInterface.STK_CMD_ACTION:处理从StkService服务上报上来的cmd回复信息,调用handleCommandMessage()方法,该方法中新建一个启动StkAppService服务的Intent,intent中装载参数StkAppService.OPCODE为StkAppService.OP_CMD,OP_CMD所作的具体处理详见StkAppService的onStart()方法。
另一种是AppInterface.STK_SESSION_END_ACTION:处理从RIL层上报上来的cmd回复信息,调用handleSessionEnd()方法,与handleCommandMessage()方法作用相同,启动StkAppService服务,但是Intent对象传递的参数StkAppService.OPCODE为StkAppService.OP_END_SESSION ,结束会话的响应信息,上层具体操作详见StkAppService的onStart()方法。
StkAppService:继承自Service实现了Runnable接口,由开机后通过开机广播接收器第一次启动该服务(详见BootCompletedReceiver类说明)。
onCreate()方法:通过调用StkService.getInstance()获取了StkService的实例(该 实例的创建详见StkService类说明);
onStart()方法:对接收到得intent传递的参数进行解析,通过mServiceHandler.obtainMessage()创建一个消息msg,匹配intent传递的参数OPCODE的值,对每一种值进行相应的处理,然后通过mServiceHandler.sendMessage(msg)发送(传递)消息,进行处理响应;
ServiceHandler类:是一个Handle类,处理onStart()方法传递过来的消息,
OP_LAUNCH_APP:传递menu消息,将menu装载到Intent里,启动StkMenuActivity
OP_CMD:来自底层AT指令响应后的处理,消息来自于StkCmdReceiver发送的上报信息,创建一个StkCmdMessage 消息,调用handleCmd方法(详见handleCmd方法的说明)
OP_RESPONSE:处理上层的请求,主要来自于ToneDialog、StkInputActivity、StkMenuActivity的操作请求,然后调用handleCmdResponse方法(详见该方法说明)
OP_END_SESSION:处理会话结束,调用handleSessionEnd()方法(详见该方法说明)
OP_BOOT_COMPLETED:处理开机启动完成消息,通过调mStkService.stkResponse()给StkService发响应通知。StkService中会给Ril层下发一个请求RIL_REQUEST_STK_RESPONSE,告诉modem已经开机并要求启动STK,没有返回的响应信息。
OP_DELAYED_MSG:处理延时消息,调用handleDelayedCmd()
handleCmd()方法:这个方法主要通过对底层上报上来的消息的处理,在应用层执行相应的UI显示,获取的StkCmdMessage消息,根据不同的type的响应操作:
DISPLAY_TEXT:在屏幕上显示文字或图片,文字编码有三种格式
SELECT_ITEM:启动StkMenuActivity
SET_UP_MENU:建立一个菜单
GET_INPUT:
GET_INKEY:
SET_UP_IDLE_MODE_TEXT:
SEND_DTMF:
SEND_SMS:
SEND_SS:发送补充业务
SEND_USSD:发送USSD
LAUNCH_BROWSER:启动StkDialogActivity,显示一个确认Dialog
SET_UP_CALL:
PLAY_TONE:播放一个audio tone
handleCmdResponse()方法:这个方法,是对上层的请求的下发处理,根据接收到得消息,创建新的响应信息StkResponseMessage,通过mStkService.onCmdResponse(resMsg)下发消息到StkService,被StkService的handleMessage接收消息,调用handleCmdResponse((StkResponseMessage) msg.obj)处理响应(详见StkService的 handleCmdResponse()方法说明)。
StkMenuActivity:主要是装载title、ListView、dialog
StkMenuActivity中下边的每一个视图的装载,都是通过在onCreate()中向StkAppService发Intent,StkAppService接收到StkMenuActivity发送过来的Intent,Intent中绑定了Bundle对象,通过Bundle对象中的OPCODE值,决定需要装载哪个ListView的数据。装载数据成功后,StkMenuActivity中的onResume()获取StkAppService中的Menu数据,并通过适配器显示出来。
STK framework层:
StkService:extends Handler implements AppInterface,通过AppInterface这个接口,使STK的应用层和framework层有一个很好的交互。
getInstance()方法:遵循单例模式的原则创建创建StckService实例,如果该实例没有被初始化,则初始化,否则直接返回。此方法在GSMPhone的构造函数中被初始调用进行创建实例,在StkAppService的onCreate()方法中调用的StkService.getInstance()获取了已经初始化了的StkService实例。
StkService()方法:StkeService的构造方法,在getInstance()初始化StkService实例时被调用,new StkService(ci, sr, context, fh, sc); 同时获取RilMessageDecoder传来的处理消息,然后通过CommandsInterface的接口对象注册对RIL事件的处理,这些注册方法是在BaseCommands类中实现,注册后,能接收到来自RIL层的通知,详见RIL类的说明,注册的事件包括:
MSG_ID_SESSION_END,
MSG_ID_PROACTIVE_COMMAND,
MSG_ID_EVENT_NOTIFY,
MSG_ID_CALL_SETUP,
然后调用函数reportStkServiceIsRunning函数通知RIL层(详见RIL类说明),StkService服务已经启动。
handleMessage():StkService接收RIL层上报信息的重要消息处理方法,它接收的消息种类有:
MSG_ID_SESSION_END:此消息在StkService()构造函数中注册,当RIL层接收到上报消息RIL_UNSOL_STK_SESSION_END时,通知发送此消息,通知StkService会话结束
MSG_ID_PROACTIVE_COMMAND:此消息在StkService()构造函数中注册,当RIL层接收到上报消息RIL_UNSOL_STK_PROACTIVE_COMMAND时,通知发送此消息,发送来自modem的主动上报
MSG_ID_EVENT_NOTIFY:此消息在StkService()构造函数中注册,当RIL层接收到上报消息RIL_UNSOL_STK_EVENT_NOTIFY时,通知发送此消息,
MSG_ID_REFRESH:
MSG_ID_CALL_SETUP:此消息在StkService()构造函数中注册,当RIL层接收到上报消息RIL_UNSOL_STK_CALL_SETUP时,通知发送此消息,发送来自modem的拨打电话的主动上报消息
MSG_ID_SIM_LOADED:此消息在StkService()构造函数中注册,当Sim卡loaded完成,在SimRecords.java中会通知发送此消息,具体详见SimRecords.java中的onAllRecordsLoaded()方法
MSG_ID_RIL_MSG_DECODED:在RilMessageDecoder.java中对Ril上报消息进行解析后,将解析后的结果通过此消息发送回来,被StkService接收执行处理,接收此消息后,调用handleRilMsg((RilMessage) msg.obj)处理消息,详见handleRilMsg()方法说明
MSG_ID_RESPONSE:处理上层发过来的请求消息,调用handleCmdResponse((StkResponseMessage) msg.obj),详见handleCmdResponse()方法说明
handleRilMsg()方法:对各种消息进行解析处理后,调用此方法,具体处理各种消息:
MSG_ID_EVENT_NOTIFY:调用handleProactiveCommand()方法,详见handleProactiveCommand()方法说明
MSG_ID_PROACTIVE_COMMAND:调用handleProactiveCommand()方法,详见handleProactiveCommand()方法说明
MSG_ID_REFRESH:调用handleProactiveCommand()方法,详见handleProactiveCommand()方法说明
MSG_ID_SESSION_END:结束会话,调用handleSessionEnd()方法,创建一个Intent发送会话结束广播AppInterface.STK_SESSION_END_ACTION,此广播会被上层的StkCmdReceiver广播接收器接收,详见StkCmdReceiver类说明
MSG_ID_CALL_SETUP:
handleCmdResponse()方法:接收来自上层的处理要求,往RIL下发终端请求,除几种特殊请求外,最终均调用sendTerminalResponse()方法,在该方法中通过调用CommandsInterface的sendTerminalResponse()方法,将请求下发到RIL层,Ril实现了接口CommandsInterface,的类,sendTerminalResponse()的具体实现,详见Ril.java,其中文件请求类型有:
HELP_INFO_REQUIRED:
OK:
PRFRMD_WITH_PARTIAL_COMPREHENSION:
PRFRMD_WITH_MISSING_INFO:
PRFRMD_WITH_ADDITIONAL_EFS_READ:
PRFRMD_ICON_NOT_DISPLAYED:
PRFRMD_MODIFIED_BY_NAA:
PRFRMD_LIMITED_SERVICE:
PRFRMD_WITH_MODIFICATION:
PRFRMD_NAA_NOT_ACTIVE:
PRFRMD_TONE_NOT_PLAYED:根据请求类型,做往RIL发相应的请求,请求类型有:
SET_UP_MENU:装载menu的请求,调用sendMenuSelection()方法,将请求信息创 建为ByteArrayOutputStream字节数组输出流,通过调用CommandsInterface的sendEnvelope()方法,将请求下发到RIL层,RIL类是实现了CommandsInterface的类,sendEnvelope()的具体实现,详见RIL.java文件。
SELECT_ITEM:选中item的请求
GET_INPUT:在屏幕上显示文字或图片,文字编码有三种格式,并获取用户输入的字符串
GET_INKEY:在屏幕上显示文字或图片,文字编码有三种格式,并获取用户输入的一个字符
DISPLAY_TEXT:
LAUNCH_BROWSER:
SET_UP_CALL:打电话的请求,通过调用CommandsInterface的handleCallSetupRequestFromSim()方法,将请求下发到RIL层,RIL类是实现了CommandsInterface的类,handleCallSetupRequestFromSim()的具体实现,详见RIL.java文件
DISPLAY_TEXT:
LAUNCH_BROWSER
SET_UP_CALL
NO_RESPONSE_FROM_USER
UICC_SESSION_TERM_BY_USER
BACKWARD_MOVE_BY_USER
handleProactiveCommand()方法:在这个方法中,处理一批请求,请求的处理均是调用sendTerminalResponse()终端响应方法,sendTerminalResponse()的说明详见handleCmdResponse()方法,最后创建一个Intent,发一条广播:AppInterface.STK_CMD_ACTION到上层, AppInterface.STK_CMD_ACTION的处理详见StkCmdReceiver类的说明。
sendTerminalResponse()方法:此方法在StkService接收到底层上报上来的消息时,会被调用,往RIL层下发请求,告诉modem终端已响应,modem稍后会主动上报会话结束通知回来,同时,StkService会启动上层的StkAppService去处理UI显示。
RIL层:
reportStkServiceIsRunning()方法:通知modem请求,StkService已经启动,转换为一条REQUEST: RIL_REQUEST_REPORT_STK_SERVICE_IS_RUNNING ,无响应返回信息
stkRefresh()方法:通知modem请求刷新,转换为一条REQUEST: RIL_REQUEST_STK_REFRESH,无返回响应信息
stkResponse()方法:通知modem,开机完成,启动Stk工具包,转换为一条REQUEST: RIL_REQUEST_STK_RESPONSE ,无返回响应信息
sendTerminalResponse()方法:处理StkService发过来的终端操作的响应请求,转换为一条REQUEST: RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE,具体AT指令详见reference-sc8800s.c文件说明,无返回的响应信息,在processSolicited()方法中有相应的处理
sendEnvelope()方法:处理StkService发过来的
handleCallSetupRequestFromSim()方法:处理Stk拨打电话请求,转换为REQUEST: RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM, 具体AT指令详见reference-sc8800s.c文件说明,返回的响应信息,在processSolicited()方法中有相应的处理
processUnsolicited()方法:stk请求modem未响应处理,通知StkService
RIL_UNSOL_STK_SESSION_END:
RIL_UNSOL_STK_PROACTIVE_COMMAND
RIL_UNSOL_STK_EVENT_NOTIFY
RIL_UNSOL_STK_CALL_SETUP
RIL的处理:
********************上报************************
RIL_UNSOL_STK_SESSION_END
RIL_UNSOL_STK_PROACTIVE_COMMAND
RIL_UNSOL_STK_EVENT_NOTIFY
RIL_UNSOL_STK_CALL_SETUP
RIL_UNSOL_SIM_REFRESH
********************命令************************
RIL_REQUEST_STK_GET_PROFILE
RIL_REQUEST_STK_SET_PROFILE
RIL_REQUEST_STK_SEND_ENVELOPE_COMMAND
RIL_REQUEST_STK_SEND_TERMINAL_RESPONSE
RIL_REQUEST_STK_HANDLE_CALL_SETUP_REQUESTED_FROM_SIM
相关推荐
有了stk命令解析工具,再也不用查3gpp卡协议
Android STK 服务解析
本文将详细介绍STK与C#的互联技术,并提供相关的实例源码,帮助开发者理解如何在C#环境中集成和操作STK。 首先,STK提供了丰富的API接口,使得开发人员可以通过编程来控制STK的运行,实现自定义的功能。这些API接口...
STK(System Tool Kit)是由AGI(Analytical Graphics, Inc.)开发的一款强大的空间建模和仿真软件,广泛应用于航天、国防、通信等领域。MATLAB则是MathWorks公司推出的一种高级编程环境,专用于数值计算、符号计算...
标题中的“IRIDIUM.zip_STK_STK iridium_STK 铱星_iridium_铱星 stk”提到了几个关键元素,主要是“IRIDIUM”、“STK”以及“铱星(iridium)”。这里的“STK”通常指的是Satellite Tool Kit,这是一个强大的航天...
此外,它还会指导用户如何运行仿真并解析结果,以帮助初学者快速熟悉软件。 2. **STK基础教程**: 基础教程进一步深入STK的功能,包括但不限于几何对象的创建、天线和传感器建模、信号传播分析、轨道动力学计算等...
1. **STK命令和事件处理**:STK通过AT命令与SIM卡通信,源码中会包含解析和发送这些命令的逻辑。 2. **广播接收器(BroadcastReceiver)**:当SIM卡发送事件时,Android系统会通过广播通知STK服务,源码中会有关于...
数据通常以二进制格式传输,需要进行解析和解码。 5. **运动检测**:除了基本的加速度数据,STK8312可能还集成了运动事件检测功能,如点击检测(tap detection)、敲击检测(shock detection)和自由落体检测(free...
AGI Systems Tool Kit简称stk,是行业内专业的卫星工具套件,最新版本stk 11.2.stk软件使工程师能够同时分析地面,海洋,航空,航天等。该软件的主要应用是分析和解决卫星在地球周围的旋转问题。该软件现在用于航空...
主要是STK 的破解方法介绍以及 STK常用资料的帮助文档,可以帮助初学者学习STK的好资料!!
STK(System Tool Kit)是由AGI(Analytical Graphics, Inc.)开发的一款强大的空间建模和仿真软件,常用于天文学、地球科学、航空航天等领域。这篇“STK X教程—C++/CLI源代码”显然是针对那些希望通过编程接口...
读者可以从中了解到STK 8的界面操作、数据输入方法、结果解析等方面的知识,同时获取解决常见问题的技巧和策略。 再者,"STK 9.0.pdf"这本书,针对STK 9.0版本,可能会更深入地探讨一些高级功能,如大气效应建模、...
- **错误处理**:在集成过程中,要确保正确处理可能出现的异常和错误,如STK接口调用失败、数据解析错误等。 - **性能优化**:根据需求,可能需要考虑如何优化Java与STK的交互,减少不必要的数据转换和通信开销。 ...
STK(System Tool Kit)中文帮助手册是一份用于指导用户理解和操作STK的详细文档,由Xi'an Jiaotong University的appe1943翻译自STK 8.1.1英文版。手册旨在帮助用户快速掌握STK的基础功能和高级特性,包括创建和管理...
标题中的“e_.e+stk_STK_STKMatlab_STKmatlab联合仿真_”表明这是一个关于使用STK(Satellite Tool Kit)与MATLAB进行联合仿真的教程,重点在于如何处理以“.e”为扩展名的文件。描述中提到的“STK和matlab联合编程...
1.1STK软件简介 卫星工具软件STK(Satellite Tool Kit,STK)是航天领域中先进的系统分析软件,由美国分析图形有限公司(Analytical Graphics Inc, AGI)研制,用于分析复杂的陆地、海洋、航空及航天任务。它可提供逼真...
STK(Satellite Tool Kit)是一款由美国Analytical Graphics公司开发的专业航天分析软件,广泛应用于航空航天、国防、通信、遥感等行业。STK软件以其强大的功能和精确的分析能力而著称,能够支持各类航天任务的规划...
### STK Scheduler 使用向导详解 #### 一、引言 本教程旨在引导您熟悉 **STK (System Tool Kit)/Scheduler** 的基本功能与特性。通过本教程的学习,您将能够启动 STK/Scheduler 模块,指定规划周期,定义各种任务...
STK 专业版(顶级航天、卫星仿真): STK的全称是Satellite Tool Kit(卫星工具箱),STK/Pro 于2005年4月初最新出品,解压后为583M,是由Analytical Graphics公司开发的一款在航天工业领域中处于绝对领先地位的商品化...