【移动通信】运营商名称显示优先级

用过手机的人都知道,在手机上方通知栏位置,一般都有一个运营商名称,比如中国移动(CMCC),中国联通(UNICOM)...


1,为什么手机要显示运营商名称?

对于国内用户来说,移动和联通、电信之间是没有漫游,在开卡时即选定了运营商,手机装上SIM卡就一直显示选定的运营商,似乎运营商名称显示是多余的;

其实,在国外运营商很多,不同运营商之间存在漫游协议,用户在漫游时收费也是不同的,因此有必要显示用户当前所使用的运营商名称;

另外,只有当注册到该运营商网络时才会显示该运营商名称,否则会显示“无网络”或者“仅限紧急呼叫”,如此看到运营商名称,也意味着手机有信号,同时一般信号强度指示也在旁边;

还有,运营商名称显示本身也是对该运营商的商业宣传,其重要性不言而喻,尤其是对将来的虚拟运营商


2,运营商名称显示的流程是什么样的?


以下内容为转载:

1. (U)SIM卡中存放的PLMN和PNN内容。具体显示哪个内容根据SPN文件设置以及当前登陆网络决定。
2. 网络下发MM中的数据
3. ME制造时预置的PLMN以及对应的显示名称
事实上,还有第四种显示方式,就是直接显示MCC+MNC。例如中国移动前几年刚启用460 02的时候,很多手机不能识别,就直接把这个组合显示出来。

注:手机在注册的时候,网络下发给手机的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相关文件的作用如下
1. EF_6F46_SPN
b1=0: 当注册PLMN为HPLMN或者EF_SPDI所存PLMN时,不显示PNN
b1=1: 当注册PLMN为HPLMN或者EF_SPDI所存PLMN时,显示PNN
b2=0: 当注册PLMN既不是HPLMN也不是EF_SPDI所存PLMN时,显示SPN
b2=1: 当注册PLMN既不是HPLMN也不是EF_SPDI所存PLMN时,显示SPN
其他:RFU
前提:根据ETSI规范,
在HPLMN时,默认需要显示SPN; 
在VPLMN时,默认需要显示PNN

2. EF_6FCD_SPDI
      此文件中存放的PLMN手机进行显示时,等效视为HPLMN
3. EF_6FC5_PNN
用于存放Full Name和Short Name以替换手机内存所存或者网络下发的对应值。

4. EF_6FC6_OPL
如果卡内不存在此文件,则以6FC5的第一条记录替换HPLMN或者EPLMN的内容。
如果此文件存在,则以Byte 1-7指示PLMN, Byte 8指示对应的Full Name/Short Name。

其他
新增两个文件EF_6FDE_SPNI和EF_6FDF_PNNI,可以支持图标显示。

实用举例
Q: 如果有一个虚拟运营商,它在自己的国家X省使用自己的网络(MCC=123,MNC=01),在其他地方租用别的运营商的网络。在Y省租用MNOY(MCC=123,MNC=02)的网络,在Z省租用MNOZ的网络(MCC=123,MNC=03)。它要求在XY省只显示MVNO A,在Z省显示MVNO A和MVNO A+,漫游出国的时候显示MVNO A和漫游伙伴的名字。请问,我们在USIM卡中应该如何设置(假设手机能够完美的支持SPDI和PNN的要求)?

A:
1. 将SPN的第一个字节设置为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文件的对应记录
参考规范:
ETSI TS 124.008 V7.4.0
ETSI TS 122.101 V9.11.0
ETSI TS 131.102 V10.3.0


当然,这里OPN或SPN的获取,并不只能从sim ef文件中获取,也有可能,比如Android智能机,获取的方式是不同的,存放在\system\etc下的spn-conf.xml文件中,打开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="中国移动"/> 


如上所示,可根据所希望显示的PLMN,修改对应字串,某些用户有爱的显示为中国移不动或者用户自己的姓名等等,类似的道理。


问题解决:

这个问题,本身严格来说不是故障,因为代码的编写符合标准要求,由于2G和3G SIM未启用OPN和SPN,因此获取的字串为空,直接走到了获取PLMN逻辑,4G SIM中网络运营商预留了默认的英文字串,原则上也并无不妥,但欠完美。作为研发,我个人建议不必修改,但此处体现了我的局限,产品经理坚持修改,并建议保留优先级逻辑,但若显示为英文字串,则修改为中文,但我认为这样的修改可实现却并不合标准,且手边并无联通4G SIM,无从得知联通SIM状况,几番讨论后,由于客户投诉,坚持修改,因此,针对移动SIM,增加临时性patch,修改获取PLMN条件,若为英文CMCC,则转入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);
                }


你可能感兴趣的:(【移动通信】运营商名称显示优先级)