欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Stk简介和核心类(android4.0 RIL Framework Java 部分)

程序员文章站 2022-03-03 11:49:12
...

 STK 或者 UTK 就是 Sim Tool Kit (sim卡工具包),定制了一系列与运营商相关的应用(查询天气,话费,彩铃等),可以理解为安装在SIM卡上的应用。目前对用户来说,基本上没有什么实际作用,google 自带了一个stk 应用。运营商将相关应用保存在SIM卡中,stk应用需要从SIM卡中读取相关应用信息,SIM卡也会向stk应用主动上报应用信息。
 Stk应用和SIM卡之间的通信主要通过RIL层来实现,相关消息有 
 unsolicited response message:
 RIL_UNSOL_STK_SESSION_END // 当前菜单项目 结束
 RIL_UNSOL_STK_PROACTIVE_COMMAND  // 显示菜单
 RIL_UNSOL_STK_EVENT_NOTIFY 
 RIL_UNSOL_STK_CALL_SETUP 
 solicited response message
 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
1.AppInterface
AppInterface 是一个 接口,主要用于 Stk应用和 stk telephony 之间的通信。catService.java,UiccManager.java 以及RIL.java 是stk telephony 的核心组件。
 <1>AppInterface 定义了stk应用里的所有命令。
   public static enum CommandType {
        DISPLAY_TEXT(0x21),
        GET_INKEY(0x22),
        GET_INPUT(0x23),
        LAUNCH_BROWSER(0x15),
        PLAY_TONE(0x20),
        REFRESH(0x01),
        SELECT_ITEM(0x24),
        SEND_SS(0x11),
        SEND_USSD(0x12),
        SEND_SMS(0x13),
        SEND_DTMF(0x14),
        SET_UP_EVENT_LIST(0x05),
        SET_UP_IDLE_MODE_TEXT(0x28),
        SET_UP_MENU(0x25),
        SET_UP_CALL(0x10),
        OPEN_CHANNEL(0x40),
        CLOSE_CHANNEL(0x41),
        RECEIVE_DATA(0x42),
        SEND_DATA(0x43),
        GET_CHANNEL_STATUS(0x44),
        PROVIDE_LOCAL_INFORMATION(0x26);
 <2> AppInterface定义了处理命令的方法,onCmdResponse 主要用于 stk应用向CatService 传递命令消息。
 <3> CatService 实现了AppInterface接口,在Stk应用的 StkAppService 中持有 AppInterface[] 对象,这个数组的大小和SIM卡的数量相等。
2.StkAppService
  StkAppService 是一个Service,stk应用中,所有的画面都会显示菜单,用户执行命令时,就是通过启动该Service,让Service 将用户的命令传递给CatService.
  StkAppService 持有 AppInterface[],AppInterface[] 从UiccManager 中获取,有几张SIM卡就有几个AppInterface,一张SIM卡对应一个 CatService,CatService 处于单独的HandlerThread中,(App->RIL)消息传递的路径就是这样的,StkMenuActivity->StkAppService->ServiceHandler->CatService,(RIL->App)消息传递路径就是这样的,CatService->StkAppService->ServiceHandler->StkMenuActivity.
3.UiccManager 
 UiccManager,本质上是一个Handler,它向RIL注册了一个卡状态变化的消息。
 for (int i = 0; i < mCi.length; i++) {
            Integer index = new Integer(i);
            mCi[i].registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, index);
            mCi[i].registerForNotAvailable(this, EVENT_RADIO_UNAVAILABLE, index);
            // TODO remove this once modem correctly notifies the unsols
            mCi[i].registerForOn(this, EVENT_ICC_STATUS_CHANGED, index);

        }
 当SIM卡的状态发生变化时,会主动上报消息,RIL 收到 RIL_UNSOL_RESPONSE_SIM_STATUS_CHANGED,UiccManager处理该消息。
     case EVENT_ICC_STATUS_CHANGED:
                Log.d(LOG_TAG, "Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus"
                       + " on index " + index);
                mCi[index].getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, index));
 向RIL请求获取 SIM卡状态,获取状态后,交给 UiccManager的 EVENT_GET_ICC_STATUS_DONE处理。
 case EVENT_GET_ICC_STATUS_DONE:
                Log.d(LOG_TAG, "Received EVENT_GET_ICC_STATUS_DONE on index " + index);
                AsyncResult ar = (AsyncResult)msg.obj;
                onGetIccCardStatusDone(ar, index);
                break;
 UiccManager 会将相关消息交给CatService.
 4.CatService 接收UiccManager 传递过来的消息,或者直接接收RIL 传递过来的信息,将信息传递到Stk 应用。Stk 应用也是通过 CatService 将相关动作发送给 stk telephony。
 不同于通话和网络模块的主动上报信息是交给TelephonyRegistry,Stk的主动上报信息是交给CatService 上报的。
 CatService 是在UiccManager 中初始化的,一张SIM卡对应一个CatService,Stk 应用也是通过 UiccManager 获取CatService 的。
 CatService 处理完主动上报的信息后,通过发送广播,将消息发送到Stk 应用。
 CatService 收到Stk应用发出的命令请求后,直接向RIl发送消息。
 5.RilMessageDecoder 
  RilMessageDecoder 是一个状态机,stk telephony 从SIM卡读取的信息是需要解码的,RilMessageDecoder可以看作是一个解码工具,解码完成后,它会将解码结果交给CatService.

相关标签: Android