SIM显示字 SPN,PLMN ,MCC,MNC
SPN,PLMN ,MCC,MNC名詞 解釋:
遇到一個(gè)SIM字串顯示的問(wèn)題,此前一直認(rèn)為SIM顯示字串就是網(wǎng)絡(luò)運(yùn)營(yíng)商,即對(duì)應(yīng)PLMN(MCC,MNC)的名稱(chēng),但實(shí)際并非如此簡(jiǎn)單,分析解決的過(guò)程如下:
問(wèn)題描述:
放入4G ?sim卡,搜索顯示的網(wǎng)絡(luò)名稱(chēng)為英文CMCC,并非所期望的“中國(guó)移動(dòng)“或”中國(guó)移動(dòng)3G“字樣。
問(wèn)題分析:
1,第一反應(yīng),懷疑字串錯(cuò)誤,或者4G的PLMN對(duì)應(yīng)的TXT名不正確,查看代碼以及TRACE后確認(rèn)對(duì)應(yīng)的PLMN及TXT正常;
2,從調(diào)用TXT字串處向上層邏輯查看,調(diào)用的邏輯從上至下依次為
OutputIdleWinNetworkName -> MMIPHONE_GetSimAndServiceString -> MMIPHONE_GenPLMNDisplay -> MMIPHONE_GetNetWorkNameId
并和正常顯示字串的trace對(duì)比,發(fā)現(xiàn)異常出現(xiàn)在無(wú)法調(diào)用到MMIPHONE_GenPLMNDisplay,因此查看MMIPHONE_GetSimAndServiceString函數(shù)的實(shí)現(xiàn),發(fā)現(xiàn)這里判斷SPN及OPN的狀態(tài),這是新名詞,我并不熟悉,求教度娘,解釋如下:
OPN 是指此SIM卡的提供商名稱(chēng);
SPN 服務(wù)提供商名稱(chēng);
PLMN 當(dāng)前注冊(cè)的網(wǎng)絡(luò)提供商名稱(chēng);
OPN和SPN都是提前預(yù)置在SIM卡中的;網(wǎng)絡(luò)提供商和服務(wù)提供商可能不是同一個(gè)企業(yè),所以有時(shí)需要單獨(dú)顯示SPN。
至此,猜測(cè)這里顯示的是OPN或SPN字串,而非一般所認(rèn)知的PLMN字串,檢查MMIPHONE_GetSimAndServiceString函數(shù)中獲取的OPN及SPN的顯示標(biāo)志及獲取的字串,證實(shí)了猜測(cè),故障所報(bào)的英文CMCC字串正是SPN字串,這里的邏輯是:檢查SIM中OPN及SPN狀態(tài),若無(wú)需獲取或獲取不到字串,則調(diào)用MMIPHONE_GenPLMNDisplay根據(jù)PLMN表獲取網(wǎng)絡(luò)運(yùn)營(yíng)商名稱(chēng),即,字串的顯示是存在優(yōu)先級(jí)關(guān)系的,代碼示例如下:
? ? ? ? ? ? ? ? MMI_STRING_T aci_string = {0};?
? ? ? ? ? ? ? ? MMI_STRING_T opn_string = {0};
? ? ? ? ? ? ? ? MMI_STRING_T spn_string = {0};
? ? ? ? ? ? ? ? wchar aci[MAX_ACI_INFO_LEN + 1] = {0};
? ? ? ? ? ? ? ? wchar opn[MAX_ONSHORTFORM_LEN + 1] = {0};
? ? ? ? ? ? ? ? wchar spn[MN_SPN_ID_NUM_LEN + 1] = {0};
? ? ? ? ? ? ? ? //get aci string
? ? ? ? ? ? ? ? if(g_service_status[dual_sys].is_add_ci)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? aci_string.wstr_ptr = (wchar *)aci;
? ? ? ? ? ? ? ? ? ? GetAciString(&g_service_status[dual_sys], &aci_string, MAX_ACI_INFO_LEN);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //get opn string
? ? ? ? ? ? ? ? if (g_service_status[dual_sys].is_opn_need)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? opn_string.wstr_ptr = (wchar *)opn;
? ? ? ? ? ? ? ? ? ? GetOpnString(&g_service_status[dual_sys], &opn_string, MAX_ONSHORTFORM_LEN);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? //get spn string
? ? ? ? ? ? ? ? if (g_service_status[dual_sys].is_spn_need)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? spn_string.wstr_ptr = (wchar *)spn;
? ? ? ? ? ? ? ? ? ? GetSpnString(&g_service_status[dual_sys], &spn_string, MN_SPN_ID_NUM_LEN);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? CatAciOpnSpnString(&aci_string, &opn_string, &spn_string, network_str_ptr);
? ? ? ? ? ? ? ? if (0 == network_str_ptr->wstr_len)?
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? network_str_ptr->wstr_len = MMIPHONE_MAX_OPER_NAME_LEN;
? ? ? ? ? ? ? ? ? ? MMIPHONE_GenPLMNDisplay(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MMIAPIGET_SpecSim_TDOrGsm(dual_sys),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &g_service_status[dual_sys].plmn,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? network_str_ptr->wstr_ptr,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &network_str_ptr->wstr_len,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FALSE);
? ? ? ? ? ? ? ? }
由此想到的,目前正在推廣虛擬運(yùn)營(yíng)商,根據(jù)一則新聞報(bào)道的數(shù)據(jù):
”上海有12家虛擬運(yùn)營(yíng)商備案,包括京東通信、蘇寧互聯(lián)等在內(nèi),工信部已經(jīng)為這些虛擬運(yùn)營(yíng)商發(fā)放了客服號(hào)碼,他們的客服電話也與電信運(yùn)營(yíng)商相似,是以100開(kāi)頭的五位數(shù)號(hào)碼。盡管虛擬運(yùn)營(yíng)商已經(jīng)陸續(xù)開(kāi)始發(fā)放專(zhuān)屬的170號(hào)段,但整體還是處于用戶(hù)體驗(yàn)、內(nèi)部網(wǎng)絡(luò)測(cè)試時(shí)期,每家虛擬運(yùn)營(yíng)商大約僅有約1000名體驗(yàn)者,預(yù)計(jì)到2014年10月,才會(huì)大面積正式商用“。
手機(jī)上對(duì)運(yùn)營(yíng)商名字的顯示完全可以做為一個(gè)運(yùn)營(yíng)商的品牌宣傳手段。特別是虛擬運(yùn)營(yíng)商,并不希望出現(xiàn)合作伙伴,同時(shí)也是競(jìng)爭(zhēng)對(duì)手的名字。在這種情況下,手機(jī)是如何決定顯示哪些內(nèi)容,需要一個(gè)標(biāo)準(zhǔn),查詢(xún)資料,根據(jù)TS 22.101,手機(jī)在顯示運(yùn)營(yíng)商信息時(shí),一共有三個(gè)選擇,優(yōu)先級(jí)從高到低排列(如下TS 22.101介紹為轉(zhuǎn)載):
1. (U)SIM卡中存放的PLMN和PNN內(nèi)容。具體顯示哪個(gè)內(nèi)容根據(jù)SPN文件設(shè)置以及當(dāng)前登陸網(wǎng)絡(luò)決定。
2. 網(wǎng)絡(luò)下發(fā)MM中的數(shù)據(jù)
3. ME制造時(shí)預(yù)置的PLMN以及對(duì)應(yīng)的顯示名稱(chēng)
事實(shí)上,還有第四種顯示方式,就是直接顯示MCC+MNC。例如中國(guó)移動(dòng)前幾年剛啟用460 02的時(shí)候,很多手機(jī)不能識(shí)別,就直接把這個(gè)組合顯示出來(lái)。
注:手機(jī)在注冊(cè)的時(shí)候,網(wǎng)絡(luò)下發(fā)給手機(jī)的MM信息(Miscellaneous Messages):
Full name for network
Short name for network
Local time zone
Universal time and local time zone
LSA Identity
Network Daylight Saving Time
(U)SIM相關(guān)文件的作用如下
1. EF_6F46_SPN
b1=0: 當(dāng)注冊(cè)PLMN為HPLMN或者EF_SPDI所存PLMN時(shí),不顯示PNN
b1=1: 當(dāng)注冊(cè)PLMN為HPLMN或者EF_SPDI所存PLMN時(shí),顯示PNN
b2=0: 當(dāng)注冊(cè)PLMN既不是HPLMN也不是EF_SPDI所存PLMN時(shí),顯示SPN
b2=1: 當(dāng)注冊(cè)PLMN既不是HPLMN也不是EF_SPDI所存PLMN時(shí),顯示SPN
其他:RFU
前提:根據(jù)ETSI規(guī)范,
在HPLMN時(shí),默認(rèn)需要顯示SPN;?
在VPLMN時(shí),默認(rèn)需要顯示PNN
2. EF_6FCD_SPDI
? ? ? 此文件中存放的PLMN手機(jī)進(jìn)行顯示時(shí),等效視為HPLMN
3. EF_6FC5_PNN
用于存放Full Name和Short Name以替換手機(jī)內(nèi)存所存或者網(wǎng)絡(luò)下發(fā)的對(duì)應(yīng)值。
4. EF_6FC6_OPL
如果卡內(nèi)不存在此文件,則以6FC5的第一條記錄替換HPLMN或者EPLMN的內(nèi)容。
如果此文件存在,則以Byte 1-7指示PLMN, Byte 8指示對(duì)應(yīng)的Full Name/Short Name。
其他
新增兩個(gè)文件EF_6FDE_SPNI和EF_6FDF_PNNI,可以支持圖標(biāo)顯示。
實(shí)用舉例
Q: 如果有一個(gè)虛擬運(yùn)營(yíng)商,它在自己的國(guó)家X省使用自己的網(wǎng)絡(luò)(MCC=123,MNC=01),在其他地方租用別的運(yùn)營(yíng)商的網(wǎng)絡(luò)。在Y省租用MNOY(MCC=123,MNC=02)的網(wǎng)絡(luò),在Z省租用MNOZ的網(wǎng)絡(luò)(MCC=123,MNC=03)。它要求在XY省只顯示MVNO A,在Z省顯示MVNO A和MVNO A+,漫游出國(guó)的時(shí)候顯示MVNO A和漫游伙伴的名字。請(qǐng)問(wèn),我們?cè)赨SIM卡中應(yīng)該如何設(shè)置(假設(shè)手機(jī)能夠完美的支持SPDI和PNN的要求)?
A:
1. 將SPN的第一個(gè)字節(jié)設(shè)置為00
2. 將PLMN Y(MCC=123, MNC=02)放入EF_6FCD_SPDI文件
3. 在EF_6FC5_PNN中存入MVNO A+
4. 將PLMN Z(MCC=123, MNC = 03)放入EF_6FC6_OPL,并指向PNN文件的對(duì)應(yīng)記錄
參考規(guī)范:
ETSI TS 124.008 V7.4.0
ETSI TS 122.101 V9.11.0
ETSI TS 131.102 V10.3.0
當(dāng)然,這里OPN或SPN的獲取,并不只能從sim ef文件中獲取,也有可能,比如Android智能機(jī),獲取的方式是不同的,存放在\system\etc下的spn-conf.xml文件中,打開(kāi)spn-conf.xml可以看到如下代碼:?
<?xml version="1.0" encoding="utf-8"?>
<spnOverrides>
<!--
@Author: HTC Shawn Ku
@Date: 2010/02/23
This is a list for operator specific SPNs.
We will use below SPN for instead if numeric is matched.
Format is listed as below:
<spnOverrides
numeric="MCC+MNC"
spn="SPN Name"/>
-->
<spnOverride
numeric="44020"
spn="SoftBank"/>?
</spnOverrides>
<spnOverride
numeric="46000"
spn="中國(guó)移動(dòng)"/>?
如上所示,可根據(jù)所希望顯示的PLMN,修改對(duì)應(yīng)字串,某些用戶(hù)有愛(ài)的顯示為中國(guó)移不動(dòng)或者用戶(hù)自己的姓名等等,類(lèi)似的道理。
問(wèn)題解決:
這個(gè)問(wèn)題,本身嚴(yán)格來(lái)說(shuō)不是故障,因?yàn)榇a的編寫(xiě)符合標(biāo)準(zhǔn)要求,由于2G和3G SIM未啟用OPN和SPN,因此獲取的字串為空,直接走到了獲取PLMN邏輯,4G SIM中網(wǎng)絡(luò)運(yùn)營(yíng)商預(yù)留了默認(rèn)的英文字串,原則上也并無(wú)不妥,但欠完美。作為研發(fā),我個(gè)人建議不必修改,但此處體現(xiàn)了我的局限,產(chǎn)品經(jīng)理堅(jiān)持修改,并建議保留優(yōu)先級(jí)邏輯,但若顯示為英文字串,則修改為中文,但我認(rèn)為這樣的修改可實(shí)現(xiàn)卻并不合標(biāo)準(zhǔn),且手邊并無(wú)聯(lián)通4G SIM,無(wú)從得知聯(lián)通SIM狀況,幾番討論后,由于客戶(hù)投訴,堅(jiān)持修改,因此,針對(duì)移動(dòng)SIM,增加臨時(shí)性patch,修改獲取PLMN條件,若為英文CMCC,則轉(zhuǎn)入PLMN邏輯,如下:
? ? ? ? ? ? ? ? if ((0 == network_str_ptr->wstr_len)?
|| (0 == MMIAPICOM_WstrStrncmp((const wchar*)network_str_ptr->wstr_ptr, (const uint8*)"CMCC", 4)))
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? network_str_ptr->wstr_len = MMIPHONE_MAX_OPER_NAME_LEN;
? ? ? ? ? ? ? ? ? ? MMIPHONE_GenPLMNDisplay(
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? MMIAPIGET_SpecSim_TDOrGsm(dual_sys),
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &g_service_status[dual_sys].plmn,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? network_str_ptr->wstr_ptr,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? &network_str_ptr->wstr_len,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? FALSE);
? ? ? ? ? ? ? ? }
問(wèn)題總結(jié):
從問(wèn)題中,獲取到新的SIM知識(shí),也了解到研發(fā)和產(chǎn)品崗位不同的思考角度,產(chǎn)品經(jīng)理的修改方法,是我第一時(shí)間就會(huì)排除,卻的確是有一定道理的。學(xué)習(xí)了。
總結(jié)
以上是生活随笔為你收集整理的SIM显示字 SPN,PLMN ,MCC,MNC的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 京东数科“四位一体”布阵新基建沙场
- 下一篇: 微信小程序播放bilibili视频