如何判断手机是否处于漫游状态?
时间:10-02
整理:3721RD
点击:
手机专业术语中的漫游与我们日常生活中的“省内漫游”,“全国漫游”不是一回事。
这里的漫游,是指手机使用一个运营商的SIM卡,注册上另一个运营商的网络。
判定是否漫游,是通过比较sim卡的PLMN与注册上网络的PLMN,不会去check是本地卡还是异地卡。
代码中更新手机漫游状态,是在srv_nw_info_update_roaming_state()中。
cntx->is_roaming =
!is_on_hplmn_by_spec_criteria &&
!t_mobile_sim_in_t_mobile_network &&
!same_pnn_by_phone_table;
is_on_hplmn_by_spec_criteria, t_mobile_sim_in_t_mobile_network,
same_pnn_by_phone_table。当这个3个条件都不满足即是漫游状态,界面上会显示Roaming icon。
(1) plmn_match_by_spec_criteria()是实现spec(3GPP TS 23.122 --Annex A: HPLMN
Matching Criteria)。
(2) t_mobile_sim_in_t_mobile_network, 是对使用T-mobile sim卡的特殊处理。
(3) same_pnn_by_phone_table,是针对一些有多个plmn的运营商所做特殊处理。
例如China Mobile有“46000,46002,46007” 3个plmn,当sim plmn是46000,注册上网络plmn是46002时,虽然sim PLMN与注册上网络plmn不相同,但是都是属于同一运营商China Mobile,不处于roaming状态。
在log(fiLTEr设为MOD_MMI_COMMON_APP(Trace_Group_3))中,可以看到以上3个条件的值,以及是否处于漫游状态。
代码中,可以通过srv_nw_info_is_roaming()接口来获取手机是否处于漫游状态。
最后,针对上面的第3点部分再做下详细的解释说明。
static MMI_BOOL srv_nw_info_update_roaming_status(
srv_nw_info_cntx_struct *cntx,
mmi_sim_enum sim,
MMI_BOOL is_on_hplmn_by_spec_criteria,
const srv_nw_info_location_info_struct *new_location)
{
...
same_pnn_by_phone_table = srv_netset_is_plmn_roaming(home_plmn, (CHAR*)nw_plmn)?
MMI_FALSE : MMI_TRUE;///////////////////////
如果不想使用原来默认的那种算法(会判断是否属于同一个运营商的plmn如果是就不算漫游)。
请自行实现函数 srv_netset_is_plmn_roaming的内容,直接判断 传进去的2个字串参数
home_plmn和 nw_plmn 是不是完全一样:
a. 如果是,说明 没有处于 漫游,就返回flase,则same_pnn_by_phone_table为 true ,那么后面的cntx->is_roaming就为false,表示没有处于漫游,就不会显示漫游图标。
b. 如果不是,则说明处于漫游就返回 true,则same_pnn_by_phone_table为 false ,那么后面的cntx->is_roaming就为true,表示处于漫游,就会显示漫游图标。
}
else
{
t_mobile_sim_in_t_mobile_network = MMI_FALSE;
same_pnn_by_phone_table = MMI_FALSE;
}
cntx->is_roaming =
(!is_on_hplmn_by_spec_criteria &&
!t_mobile_sim_in_t_mobile_network &&
!same_pnn_by_phone_table) ? MMI_TRUE : MMI_FALSE;
MMI_TRACE(SRV_NW_INFO_TRC_GROUP, TRC_SRV_NW_INFO_ROAMING_CONDITION,
sim, is_on_hplmn_by_spec_criteria, t_mobile_sim_in_t_mobile_network,
same_pnn_by_phone_table, cntx->is_roaming);
}
...
}
目前代码中的实现,srv_netset_is_plmn_roaming 里面会将传进去的2个字串参数转换为 BCD码,然后去数组 plmn_group_index里面查看对应的第2个成员的index值是否一致,如果一致就表示是同一个运营商的,就不算漫游。
具体可以看下srv_netset_is_plmn_roaming里面的实现。
最后附上数组plmn_group_index,可以看到,这个结构体里面的第一个成员是plmn对应的BCD码,第二个成员是index,如果index值一致就表明是同一个运营商的plmn.
const srv_netset_plmn_group_struct plmn_group_index[]=
{
/* Do NOT modify the following line. It is a keyword for the PLMN automatic create tool
*/
/* PLMN GROUP */
{0x00f064, 0},
{0X20f064, 0},
{0x70f064, 0},
{0x00f454, 1},
{0x20f454, 1},
{0x81f454, 1},
{0X30f454, 2},
{0x40f454, 2},
{0x61f454, 3},
{0x91f454, 3},
{0x10f554, 4},
{0x40f554, 4},
{0x30f554, 5},
{0x50f554, 5},
{0x20f054, 6},
{0x80f054, 6},
{0x10f525, 7},
{0x20f525, 7},
{0x20f634, 8},
{0x21f634, 8},
{0x01f025, 9},
{0x99f025, 9},
{0x70f262, 10},
{0x80f262, 10},
{0x03f432, 11},
{0x13f432, 11},
{0x23f432, 11},
{0x20f427, 12},
{0x30f427, 12},
{0x40f427, 12},
{0x60f427, 13},
{0x01f427, 13},
{0x11f427, 13},
{0x32f427, 13},
{0x23f427, 14},
{0x33f427, 14},
{0x43f427, 14},
{0x62f013, 15},
{0x13f013, 15},
{0x610013, 15},
{0x020013, 15},
{0x120013, 15},
{0x220013, 15},
{0x320013, 15},
{0x420013, 15},
{0x520013, 15},
{0x620013, 15},
{0x720013, 15},
{0x660013, 15},
{0x510013, 16},
{0x710013, 16},
{0x830013, 16},
{0x140013, 16},
{0, 0} // dummy one
};
不错,学习了~
这个帖子很高级!赞!