?

一種手機卡槽與網絡信號識別的Android 實現

2023-10-09 09:31夏龍根
順德職業技術學院學報 2023年3期
關鍵詞:卡槽鄰區信號強度

夏龍根

(中國移動通信集團廣東有限公司佛山分公司,廣東 佛山 528000)

目前市面上大多數手機具有兩個或兩個以上卡槽。DSDS(Dual SIM Dual Standby)雙卡雙待幾乎是現在市面上手機的標配,雙卡雙待指手機可以插入兩張手機卡,而且能同時待機。其中一張卡用于通話,一張卡用于上網?;蛘叩疆惖厣蠈W或者調任,新辦一張當地的卡,而不想放棄原先的號碼[1]。

由于一臺手機有兩張卡或者多張卡同時在線,不同的卡用途有區別,有時需要辨識不同卡槽號碼的網絡信號,如卡槽1 是語音功能,質量不好;而卡槽2 是數據功能,質量尚可。這就需要識別兩張卡所使用的網絡信息。Cellular-Z 是常用的識別網絡信號的APP[2]。但這是一款網絡優化專業工具,一般用戶使用存在難度。為此,本文從Xamarin.Android開發的角度,提出一種卡槽信號識別的實現方法。

1 Android 實現的基本原理

最初的Android 系統不支持雙卡雙待功能,Android SDK 也沒有提供相應的API。Android6.0 以后增加了相關的API,可以利用反射獲取副卡等相關信息。但這種反射的方法實現起來較為繁瑣,且芯片商不一樣,實現方案也不一樣。如部分廠商直接在TelephonyManager 類中重載可以得到simid,而華為高端機型使用了自身的芯片,第二張sim 卡的相關API封裝在Android.Telephony.MSimTelephonyManager 這個類[3]。因此,現有的反射法,難以做到代碼通用。

1.1 基本原理介紹

在Android 系統中,有slotid 和subid 兩個概念。其中slotid 是指卡槽,雙卡機器的卡槽1 值為0,卡槽2 值為1,依次類推;subid(Subscription Identifier)是數據庫telephony.db(在"/data/user_de/0/com.android.providers.telephony/databases"目錄下)的表siminfo 的主鍵遞增項,subid 的值從1 開始,每插入一個新卡,subId 的值就會加1。簡言之,slotid 區分卡槽,subid 區分卡槽內的卡[4]。

每一張SIM 卡都對應一個Subscription,其 中Android.Telephony.SubscriptionManager.ActiveSubscriptionInfoList 是SIM卡的信息接口函數,包含如ICCID、MNC、MCC 等信息,ActiveSubscriptionInfo 中有記錄用于語音的默認SIM 卡信息DefaultVoiceSubscription、短信默認卡信息DefaultSmsSubscription、數據業務默認卡信息DefaultDataSubscription 等等[5],如圖1 所示。

圖1 SIM 卡及卡槽相關接口方法和字段的邏輯層級關系

1.2 接口函數介紹

本文基于Android 10 以上的信號監聽Android.Telephony.SignalStrength 類及 Android.Telephony.ServiceState 類,通過識別不同卡槽的信號強度和小區占用信息[6],并關聯小區的CGI 及鄰區信息,實現對不同卡槽的網絡信號識別和代碼實現。

1)獲取注冊小區信息。

ServiceState 類中的NetworkRegistrationInfo 方法可以獲取收集的小區注冊信息,包括網絡類型transportType(其中WLAN 表示wifi,WWAN 表示移動網絡)、注冊狀態registrationState(HOME 表示已注冊)、網絡類型accessNetworkTechnology(GSM/LTE/NR 等),以及小區可提供的服務availableServices(如語音、短息或者數據業務)。

通過CellIdentity 方法可以獲取小區的位置區碼TAC、小區國家識別碼MCC、頻點、頻段、全球識別碼CGI(或者NCI),確定占用的小區。

2)獲取小區信號強度。

SignalStrength 類中的CellSignalStrengths 方 法可以獲取手機收集的服務小區信號強度,并通過GetType()得到該服務小區的網絡制式:如占用的是GSM 小區,則通過可將CellSignalStrengths 強制轉化為CellSignalStrengthGsm 來讀取GSM 小區的信號強度;如占用的是LTE 小區,則通過可將CellSignalStrengths 強制轉化為CellSignalStrengthLte 來讀取LTE 小區的信號強度。如下代碼所示:

3)獲取鄰區信息。

Android.Telephony.NeighboringCellInfo 類是獲取手機占用小區的相鄰小區信息接口,但該方法返回數據為空,方法在android 系統中已被棄用??梢酝ㄟ^使用Android.Telephony.AllCellInfo 的方法將結果輸出,并通過注冊狀態IsRegistered 決定哪個是鄰居,其中值NO 表示鄰區、YES 表示服務小區[7]。

通過AllCellInfo 方法還可以獲取鄰區的小區注冊信息CellIdentity 以及信號強度CellSignalStrength。并且,可以通過mTimeStamp 獲取小區的時間戳。對于4/5 G 小區,由于采用GPS 同步,通過該字段可以獲得精準的時間信息。

2 Android 實現方法邏輯

基于Android 10 以上的通用API 接口類,實現分卡槽的注冊小區信息、信號強度以及對應的鄰區信息。Xamarin.Android 提供類似于Android 的接口函數,并且可以在微軟Visual Studio 開發環境完成代碼及編譯。

通過ActiveSubscriptionInfoList 獲取手機的可用卡槽列表,再根據每個卡槽的ServiceState 和SignalStrength 方法獲取注冊小區及信號強度信息,并根據AllCellInfo 查找屬于該卡槽注冊小區的相鄰小區信息,所述的Android 實現流程如圖2 所示。

圖2 分卡槽獲取網絡信息的Android 實現流程

1)注冊小區的讀取方法。

服務小區ServiceState.NetworkRegistrationInfoList返回的是一個ILIST 列表,說明手機可能占用多個小區;小區信號強度SignalStrength.CellSignalStrengths也是一個ILIST 列表。這就涉及到多個小區和多個信號強度的匹配問題。

從實踐看,一般可根據兩個ILIST 的順序匹配,即第一個注冊小區對應第一個信號強度,最后一個注冊小區對應最后一個信號強度。從程序實現上,也可以通過一些限制條件校驗,通過判斷NetworkRegistrationInfoList 中的accessNetworkTechnology與CellSignalStrengths 中的GetType()是否對應。即若accessNetworkTechnology 值為NR,則CellSignalStrengths中的GetType()對應typeof(CellSignalStrengthNr);若accessNetworkTechnology 值為LTE,則對應typeof(CellSignalStrengthLte)。

另一個校驗方法是通過NetworkRegistrationInfoList中的availableServices,判斷注冊小區可提供的服務是否與ActiveSubscriptionInfo 中的默認SIM 卡信息匹配。若SIM 卡默認為語音卡DefaultVoiceSubscriptionId,則availableServices 中應包含VOICE;若默認為數據卡DefaultDataSubscription,則availableServices 中應包含DATA。

對于占用服務小區數量超過1 的情況,即ILIST列表長度大于1,一般為終端占用了5 G NSA 小區,這種情況下一個服務小區是NR,一個是LTE。

2)相鄰小區讀取方法。

由于NeighboringCellInfo 類已被棄用,通過使用AllCellInfo 獲取相鄰小區信息。但AllCellInfo 類提供了所有小區的匯總,包括所有卡槽的服務小區和鄰小區。如前所述,服務小區和鄰小區通過注冊狀態IsRegistered 區別,卡槽的區分沒有明顯的特征,但可以通過順序方法讀取。

寫一個簡單的AllCellInfo 信息打印程序,輸出所有小區信息列表,就可以發現Android 的AllCellInfo是按照卡槽的順序排列的,同一卡槽的小區依次排列,首先是mRegistered=YES 的服務小區,接下來是mRegistered=NO 的鄰區。當該卡槽小區信息(包括服務小區和鄰區)輸出完以后,再輸出下一個卡槽信息,AllCellInfo 打印信息如下:

所以,在讀物卡槽對應鄰區時,可以先從AllCellInfo 獲取所有小區列表,并按順序保存,從頭到尾一次讀取。當讀取到mRegistered=YES,且對應的mCi 和對應服務小區的CGI 相等時,后續的鄰區就是該卡槽所占用服務小區的鄰區列表;當讀到列表末尾,或者下一條mRegistered=YES,且對應的mCi 和對應服務小區的CGI 不相等時,讀取動作停止,最終得到卡槽對應的鄰區列表。

3 結語

通過現有Android 系統的公開接口函數方法,實現多卡槽環境下的網絡信息匹配識別,解決了Android 系統是不支持雙卡雙待功能。期間還提供了基于Xamarin.Android 的實現方法流程及關鍵代碼。相比較常見的反射法獲取占用小區信息,本文所述方法是基于公開的接口函數,具有更強的通用性,不因手機終端芯片不同而出現較大區別,可以部署于大多數Android 手機。

猜你喜歡
卡槽鄰區信號強度
自動鄰區優化技術共享網絡中應用研究
光學相干斷層成像不同掃描信號強度對視盤RNFL厚度分析的影響
室內定位信號強度—距離關系模型構建與分析
一種側向插裝型車牌架
電池拉環
WiFi信號強度空間分辨率的研究分析
小震調制比在寧夏及鄰區映震能力的研究
基于改進接收信號強度指示的四面體模型井下定位研究
從中國西南及鄰區看亞洲形成過程
WCDMA鄰區優化策略研究
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合