zoukankan      html  css  js  c++  java
  • Android 7.0 UICC 分析(一)

    UICC(Universal Intergrated Circuit Card) 框架

     * Following is class diagram for uicc classes:
     *
     *                       UiccController
     *                            #
     *                            |
     *                        UiccCard
     *                          #   #
     *                          |   ------------------
     *                    UiccCardApplication    CatService
     *                      #            #
     *                      |            |
     *                 IccRecords    IccFileHandler
     *                 ^ ^ ^           ^ ^ ^ ^ ^
     *    SIMRecords---- | |           | | | | ---SIMFileHandler
     *    RuimRecords----- |           | | | ----RuimFileHandler
     *    IsimUiccRecords---           | | -----UsimFileHandler
     *                                 | ------CsimFileHandler
     *                                 ----IsimFileHandler

    UiccController 类与RILJ 交互,实质是一个Handler,当SIM卡状态发生变化UICCController就会更新。

    其构造函数注册监听事件:

        private UiccController(Context c, CommandsInterface []ci) {
            if (DBG) log("Creating UiccController");
            mContext = c;
            mCis = ci;
            for (int i = 0; i < mCis.length; i++) {
                Integer index = new Integer(i);
                mCis[i].registerForIccStatusChanged(this, EVENT_ICC_STATUS_CHANGED, index);
                // TODO remove this once modem correctly notifies the unsols
                if (DECRYPT_STATE.equals(SystemProperties.get("vold.decrypt"))) {
                    mCis[i].registerForAvailable(this, EVENT_ICC_STATUS_CHANGED, index);
                } else {
                    mCis[i].registerForOn(this, EVENT_ICC_STATUS_CHANGED, index);
                }
                mCis[i].registerForNotAvailable(this, EVENT_RADIO_UNAVAILABLE, index);
                mCis[i].registerForIccRefresh(this, EVENT_SIM_REFRESH, index);
            }
        }

    CommandsInterface[] 数组对象的 i 对应的就是PhoneID;

    EVENT_ICC_STATUS_CHANGED 监听SIM卡的状态变化;

    当SIM卡状态变化,就有EVENT_ICC_STATUS_CHANGED 消息发出,此消息的处理如下:

        public void handleMessage (Message msg) {
            synchronized (mLock) {
                Integer index = getCiIndex(msg);
    
                if (index < 0 || index >= mCis.length) {
                    Rlog.e(LOG_TAG, "Invalid index : " + index + " received with event " + msg.what);
                    return;
                }
    
                AsyncResult ar = (AsyncResult)msg.obj;
                switch (msg.what) {
                    case EVENT_ICC_STATUS_CHANGED:
                        if (DBG) log("Received EVENT_ICC_STATUS_CHANGED, calling getIccCardStatus");
                        mCis[index].getIccCardStatus(obtainMessage(EVENT_GET_ICC_STATUS_DONE, index));
                        break;
                    .............
                    default:
                        Rlog.e(LOG_TAG, " Unknown Event " + msg.what);
                }
            }
        }    

    调用RILJ 的getIccCardStatus() 方法,参数是自定义的EVENT_GET_ICC_STATUS_DONE 消息Message对象,用于返回SIM卡状态信息;

    生成RIL_REQUEST_GET_SIM_STATUS RILRequest 请求下发RILC 层,获取SIM 卡状态信息:

        public void
        getIccCardStatus(Message result) {
            //Note: This RIL request has not been renamed to ICC,
            //       but this request is also valid for SIM and RUIM
            RILRequest rr = RILRequest.obtain(RIL_REQUEST_GET_SIM_STATUS, result);
    
            if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest));
    
            send(rr);
        }

    SIM 卡状态的信息通过 RILReceiver 类接收 RILC 层的返回,由ProcessSolicited() 方法处理;

    case RIL_REQUEST_GET_SIM_STATUS: ret =  responseIccCardStatus(p); break;

    responseIccCardStatus() 方法返回IccCardStatus 对象,保存着SIM卡的状态信息,上报UiccController EVENT_GET_ICC_STATUS_DONE 消息:

                    case EVENT_GET_ICC_STATUS_DONE:
                        if (DBG) log("Received EVENT_GET_ICC_STATUS_DONE");
                        onGetIccCardStatusDone(ar, index);
                        break;

    onGetIccCardStatusDone() 方法解析出IccCardStatue,如果没有SIM卡,则创建一个UiccCard,否则更新UiccCard 信息,一个UiccCard对象代表着一张SIM:

        private synchronized void onGetIccCardStatusDone(AsyncResult ar, Integer index) {       
            ......
            IccCardStatus status = (IccCardStatus)ar.result;
    
            if (mUiccCards[index] == null) {
                //Create new card
                mUiccCards[index] = new UiccCard(mContext, mCis[index], status, index);
            } else {
                //Update already existing card
                mUiccCards[index].update(mContext, mCis[index] , status);
            }
    
            if (DBG) log("Notifying IccChangedRegistrants");
            mIccChangedRegistrants.notifyRegistrants(new AsyncResult(null, index, null));
    
        }

    mIccChangedRigistrants 向监听者发出消息通知,监听者通过如下方法注册mIccChangedRigistrants :

        //Notifies when card status changes
        public void registerForIccChanged(Handler h, int what, Object obj) {
            synchronized (mLock) {
                Registrant r = new Registrant (h, what, obj);
                mIccChangedRegistrants.add(r);
                //Notify registrant right after registering, so that it will get the latest ICC status,
                //otherwise which may not happen until there is an actual change in ICC status.
                r.notifyRegistrant();
            }
        }

    监听者有如下:

    IccCardProxy、GsmSMSDispactcher、CatService、Phone、ServiceStateTracker、DcTracker

  • 相关阅读:
    swift对比object-c
    Swift : missing argument label 'xxx' in call
    Swift: missing argument label 'xxx' in call
    Swift 闭包(六)
    求教贴,一个可能很白痴的问题,有时间又很闲的大神给解决下
    Swift “ambiguous use of operator '>'”
    swift 之嵌套的理解 func chooseStepFunction(backwards: Bool) -> (Int) -> Int
    苹果新的编程语言 Swift 语言进阶(七)--枚举、结构、类
    苹果新的编程语言 Swift 语言进阶(六)--函数和闭包
    触摸板PCB制作-TM12
  • 原文地址:https://www.cnblogs.com/kaifyou/p/6169964.html
Copyright © 2011-2022 走看看