用过手机的人都知道,在手机上方通知栏位置,一般都有一个运营商名称,比如中国移动(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);
}