高通平台紧急呼叫问题总结
Posted 知不足而奋进
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高通平台紧急呼叫问题总结相关的知识,希望对你有一定的参考价值。
目录
1引言
1.1 编写目的
梳理紧急呼叫流程,根据紧急呼叫的要求,整理高通平台紧急呼叫的处理流程以及高通modem紧急呼叫号码列表的配置与维护。
1.2 背景
紧急呼叫问题伴随着每个项目,多数情况下都是因为紧急呼叫号码列表配置有误或者网络不支持原因导致的。掌握modem ECC list配置方法,熟悉紧急呼叫的整个处理流程,对于处理项目中处理紧急呼叫问题相关bug的效率有很好的提升。
2. 紧急呼叫基础知识
本节对紧急呼叫的信令流程进行梳理,结合日志对流程中的关键信息进行解读,同时对紧急叫号码列表的来源进行梳理。
2.1 紧急呼叫信令流程
UMTS(GSM、WCDMA、TD-Scdma)网络下紧急拨号的信令流程与普通呼叫的信令流程相似,只在少许的信令和参数上有所不同。如下空口日志截图是在无卡状态下抓的紧急呼叫流程图。
有卡状态下的正常呼叫信令空口日志流程如下:
对比日志信令流程可知紧急呼叫和普通呼叫存在如下区别:
- 紧急呼叫在不需要鉴权的情况下也是可以正常接入;
- 在CM Service Request中包含serv_type,普通呼叫时为1,紧急呼叫为2;
3.在信令流程中还有一个明显的区别就是在通话建立时,终端发送给网络的setup msg,在紧急呼叫中变为Emergency Setup。该信令中包含了一个重要的参数,可以对紧急呼叫号码的类型进行说明。如果emerg_cat_incl = 0则说明这是一个未声明类型的通用紧急呼叫。如果emerg_cat_incl = 1则下面的更详细的参数(emerg_serv_cat_val)会说明具体的紧急呼叫类型。此参数在24008的10.5.4.33中描述如下:
Csim卡中的EFECC (Emergency Call Codes)文件中存储着部分紧急呼叫号码,此部分详细可以参考3Gpp2协议C.S0065-B_cdma2000_application_for_UICC。
- 在CSIM卡中的EF ID为0x6F47;
- 最多可以有5个紧急呼叫号码;
- 每个紧急号码最长6 位;
- 该file在SIM卡中是可选项。
备注:目前国内三大运营商只有电信卡中存储有紧急呼叫号码,而联通和移动卡中暂时都未发现可以读出紧急呼叫号码。
2.2.2 从网络端获取
终端可以通过如下几条NAS信令从网络侧获取紧急呼叫号码列表:
- 位置更新Location updating accept;
- 附着Attach accept;
- 路由更新Routing area update accept。
这几条NAS消息中会携带Emergency Number List参数,格式参见TS 24.008中 10.5.3.13
Emergency Number List,如下截图:
每个紧急呼叫号码都会附带其类型:该需求在有些国家是强制要求支持的,但在国内,该参数无效,不用配置也可以。
2.2.3 手机终端code中获取
手机内部也可以存储紧急呼叫号码,在没有插SIM卡时,UE只能通过手机内部存储的紧急呼叫号码列表作出判断,该列表可以固化在UE软件的代码或者NV文件中。对于高通平台,在代码中可以通过Hardcoded ECC list进行配置,在NV中可以通过NV67221进行配置。
2.2.4 紧急呼叫号码的优先级
紧急呼叫号码的来源有4个地方,那么如果同一个紧急呼叫号码在多处进行了配置那个优先级比较高呢?
对于3gpp_release_ver为11版本的,优先级顺序如下:
Network ECC -> SIM ECC-> NV73755 ->Hardcoded ECC(NV69737)->NV 67221;
Release 11 之前的版本,优先级顺序如下:
SIM ECC -> NV73755->Network ECC ->Hardcoded ECC(NV69737)->NV 67221
终端协议的版本是在NV 65538中进行定义的;值为80表示为 release 11.
不同的国家通信网络处理紧急呼叫的方式的规范要求不同,在我国相关部门并没有对运营商的紧急呼叫服务做硬性规定,如果在国内呼叫是以紧急呼叫拨出,只能听到一段无用的语音提示,其实并未接入到真正的服务台。所以在国内除非是在无卡状态下,或者PIN1锁的情况下会走紧急拨号,正常情况下即使号码是实际意义上的紧急呼叫号码,那也是走的普通语音呼叫拨出的。
3.1 国内运营商对紧急呼叫规范要求
3.1.1 中国移动
中国移动对紧急呼叫的规范规范要求,见《中国移动LTE-TDSCDMA-GSM多模终端技术规范》
3.1.4 中国联通规范解读
相对于中国移动规范,联通要简单的多,但是明确要求将10个紧急呼叫号码全部存在UE上;
要求UE能够读取SIM/USIM卡中存储的紧急呼叫号码列表(国内的SIM/USIM卡都没有存储紧急呼叫号码,这个在国内无法测试)。要求无卡状态下呼叫紧急号码听到录音即可。
3.1.5 中国电信
电信C库:要求有卡情况下,国内特有的紧急号码110,119,122,120可以正常呼入人工台,无卡情况下,110,119,122,120,112等听到服务台语音播报即可。
3.1.6 入网测试CTA
CTA入网测试要求:要求有卡情况下,国内特有的紧急号码110,119,122,120可以正常呼入人工台,无卡情况下,110,119,122,120走CDMA网络呼入人工台,112听到录音提示即可。
3.1.7 国内网络紧急呼叫测试正常结果
3GPP规范的8个紧急呼叫号码加上国内特有的2个紧急呼叫号码,总共10个紧急号码:000,08,110,112,118,119,120,122,911,999其中红色为国内的紧急呼叫号码。
- 有卡情况下:
国内所特有的号码110,119,120,122,可以正常呼入人工台,实质上走的是普通呼叫流程,未走紧急呼叫流程。112,911听到一段录音提示,底层实质走的是紧急呼叫拨出的。电信卡拨打112,无法正常拨出,因为CDMA1x网络不支持112.
- 无卡情况下:
如果注册到移动的GSM、TD-SCDMA网络,拨打紧急呼叫号码可以听到一段录音提示。
如果注册到联通的WCDMA、GSM网络,由于网络并不支持紧急呼叫,通话拨出后直接被挂断。
如果注册到电信的CDMA网络,国内的110,120,119,122,可以拨通到人工台,而122无法拨通。
紧急呼叫与普通呼叫存在少量的区别:首先需要维护紧急呼叫号码列表,其次在界面上需要显示紧急呼叫,最后在号码呼出时Modem需要走紧急呼叫信令流程。
4.1 紧急呼叫实现流程
android系统对应相关层之间的处理如下图:
4.1.1 Framework层作用
Framework中与紧急呼叫相关的代码主要在PhoneNumberUtils.java中,相关功能如下:
- 维护紧急呼叫列表:Framework需要从RIL获取紧急呼叫列表,从ril.ecclist系统属性中获取紧急号码列表。其次针对伪紧急呼叫号码(运营商表示是紧急呼叫但实际上只能走普通呼叫的号码,如国内的110,119,120,122)列表的维护。
- 应用层下发拨打电话请求时,Framework层将拨打的号码与紧急呼叫号码列表和伪紧急呼叫号码列表进行逐一对比。如果在这两张表单中有与当前拨打号码相符和的号码,则将UI界面设置为紧急呼叫界面。
- 给RIL下发拨打电话的信息,与普通呼叫一样,只有电话号码,并不包括是否为紧急呼叫的判断结果。
4.2.2 RIL层作用
RIL层的主要作用是对ril.ecclist紧急呼叫号码列表的维护以及上报,在高通平台中,对于G网或者UMTS网络,Ril层虽然对拨打的号码也做了紧急呼叫的判断,但是实际上并未将判断结果下发给Modem,与普通呼叫一样只给Modem下发拨打的手机号码。QCRIL_ECC_LIST用来保存紧急号码,是modem模块通过一个主动上报报给RIL侧的。当RIL收到Modem上报的QMI_PBM_EMERGENCY_LIST_IND_V01,表示Modem有紧急号码列表要更新,于是RIL解析这条信令中的数据,从中提取紧急号码列表,保存在ril.ecclist。
4.2.3 Modem层作用
Modem针对紧急呼叫号码的作用也是两方面:
一、紧急呼叫号码的维护。
Modem对ECC list的维护是在PM(phonebook manager)模块中的对ECC Cache列表进行维护的,ECC Cache中的紧急呼叫号码的更新主要从下面5个方面:
- SIM卡检卡时,终端会读取sim/Usim卡中的EFECC/EFECC文件,如果读取成功,并发现里面存有紧急呼叫号码表,则将该表中ECC number更新到ECC Cache中。
- 当终端检测到有卡插入时会读取NV73755这个的ECC numbers,并将此NV中的紧急呼叫号码按照从卡中读取到的紧急呼叫号码进行处理。(备注:如果此NV进行了配置,则代码中会将此NV中的紧急呼叫号码和来自于卡中的紧急呼叫号码做合并处理,如果重复以卡中的ECC为准。并将合并后的ECC List中的 number全部按照是从卡中读取出来的紧急呼叫号码进行处理)。
- 当modem收到网络的Attach Accept/LAU Accept/RAU Accept时,查看其中是否有Emergency List IE,如果有,则将该列表中的ECC number更新到ECC Cache 中。
- 从Hardcoded ECC list中获取,其中包括代码中固化的 ECC number或者通过NV69737 中配置的EFs文件中获取。
- 从NV中获取ECC number,NV67221.
从紧急呼叫号码的来源可以看出,如果需要配置所支持的紧急呼叫号码,终端可以配置的地方有3处,即NV73755、Hardcoded ECC list和NV 67221。
首先看如何NV73755中对紧急呼叫号码的配置,在NV73755中配置的紧急呼叫号码永远会被当作紧急呼叫号码处理,而不管是否有卡存在,此NV中最多可以配置50个紧急呼叫号码。NV中个参数描述如下:
//如果NV69736为false,则直接从如下两个数组中读取紧急呼叫号码配置,所以,如果不想在EFs文件中配置,就可以在源代码中将紧急呼叫号码写死。
//有卡情况下紧急呼叫号码配置如下:
//无卡时候的紧急呼叫号码的配置如下:
当代码NV 69736 的值设置为ture时,Hardcoded ECC list会使用EFs文件中的紧急呼叫号码,而不会使用代码中写死的紧急呼叫号码。
NV中进行配置:
设置NV69736值为ture,然后在NV69737中动态添加号码列表,下图设置了112和110两个紧急呼叫号码:
112是一个通用的紧急呼叫号码(对应emergency_category = 0(PBM_EMERGENCY_SERVICE_CAT_DEFAULT)),在是否插卡的情况下都走紧急呼叫(hardcoded_type = 0(PBM_HARDCODE_ALWAYS))。110是国内的匪警号码(对应emergency_category = 1(PBM_EMERGENCY_SERVICE_CAT_POLICE)),仅在无卡的情况下走紧急呼叫(hardcoded_type = 1(PBM_HARDCODE_CARD_ABSENT))。
相比而言,在代码中固化紧急呼叫号码的方法需要编译代码,相对麻烦,在NV中添加号码的方法相对比较简单,但NV69737目前只能添加最多10个紧急呼叫号码。
NV69737中配置相各关参数说明:
最后看如何在NV中配置紧急呼叫,对应的NV值为NV67221。
在NV67221中配置的紧急呼叫号码永远会被当作紧急呼叫号码处理,而不管是否有卡存在。此NV中最多也只能配置10个紧急呼叫号码。NV67221对应的个参数说明如下:
//从如下modem日志打印中可以看出,紧急呼叫号码更新的不同来源。
Card ecc for…… 是NV63755和SIM卡中的NV,最终都按照SIM卡中的NV对待。
NV ECC 是NV67221 中的NV值。
Hardcoded 是在NV69737中配置的,或者在代码中写死的NV。
//最终通过如下日志打印,可以看出modem给ril上报的ecclist。
备注:猜测这里的RIL[1],RIL[0]应该对应的是卡槽1和卡槽2,具体没深入研究。
二、紧急呼叫拨号流程的处理
modem侧对紧急呼叫拨号请求的处理是在CM模块进行的。当拨号请求QMI消息下发后,拨号请求指令需要进一步在CM模块进行处理,CM对call_type进行重新判定,最终决定本次拨号请求在底层是以紧急呼叫的方式拨号,还是以普通的呼叫请求拨出。
//从代码调用可知,拨号请求发起后会调用cmcc_call_control_processing函数,并最终调用到cmcc_resolve_call_type函数。
//cmcc_resolve_call_type函数的主要功能如下:
//最终cmcc_resolve_call_type经过层层调用,然后去判断此号码是否为紧急呼叫号码。如果是紧急呼叫号码,则将call_type设置为emergency,最终拨号以紧急呼叫方式在空口拨出。
4.2.4 紧急呼叫一些特殊需求的处理方案
1. CTA要求支持CDMA1x的终端,必须在无卡情况下走CDMA1x呼入人工台。
解决方案:
在高通文档80-NA121-1_E_Config_Emergency_Call_Orig_CDMA_NWs_China中的章节2.4中,介绍了针对紧急呼叫优先走CDMA1x的代码修改。但是在有些平台,或者高通的新产品基线中,高通代码中已经合入了相应代码,并有NV73825(/sd/emergency_call_1x_scan_first)进行控制,并且在各个运营商的MBN中默认是打开的,所以在新的基线上如果有此需求,先看此文档,搜索代码中是否已经合入此部分代码,如果已经合入那可以通过NV73825来控制无卡紧急呼叫号码优先走CDMA1x还是走GW。
此方案开启后,针对一个特殊号码112,因为国内网络CDMA1x下不支持紧急呼叫号码112,所以当112,优先走CDMA1x时候,就会失败,失败后终端会重新找GW网络进行呼出,所以就导致112拨打时时延特别长。
2 . 当无卡情况下紧急呼叫号码优先走CDMA1x,如何优化112拨打时延,让112优先走GW。
请参考高通文档80-NA121-1_E_Config_Emergency_Call_Orig_CDMA_NWs_China中的章节2.5和2.6章节的代码修改。
3 . 在国内,中国联通的WCDMA网络制式下不支持紧急呼叫,当终端无卡驻留在联通的WCDMA网络下时经常会出现无法正常呼出紧急呼叫的问题。
通过修改NV72589对应的EFs文件(/sd/emergency_rat_acq_order),调整RAT order GSM高于WCDMA提升性能,同事需要使能NV71522(/nv/item_files/modem/mmode/custom_emerg_info)->is store ral in efs 为值true。
4 . 针对国内特有的紧急呼叫号码110,119,120,122,在界面上要求显示紧急呼叫,但是在底层要求走普通呼叫拨出。
解决方案:
- 某些新平台,高通有对应的featrue(China NAL Requirement Emergency Numbers),高通参考文档为《80-p9720-1_a_china_nal_requirement_for_emergency_numbers》,此feature在CM层进行call_type_resolved时会按照下表中的条件,对call_type进行最终的判决。可以看出,当在插卡时,并且获取到normal service时,120,110,119,122,最终会被CM模块判断为normal call呼出。
//从代码中可以看出,在resolve_call_type会调用到pbm_session_emergency_number_cat_ext2,函数。
//pbm_session_emergency_number_cat_ext2函数中,会经过一系列的判断之后,根据服务状态设置NAL标签,如果符合设置为true。
// pbm_session_emergency_number_cat_ext2函数中最终会再做一次判断,如果这个紧急呼叫号码不是来自于网络侧,并且NAL标签为ture,则重置is_emergency_num为false。即最终判别为normal call.
(2) 如果高通代码中没有此feature,即没有此部门判断代码,那么我们需要在NV69737中进行配置,配置这几个特殊的紧急呼叫号码的hardcoded_type = 1(PBM_HARDCODE_CARD_ABSENT),即仅在无卡的时候作为紧急呼叫号码。
- *国内紧急呼叫配置策略
目前针对国内项目和上那那边商量的配置策略如下:
关于无卡国内的紧急号码,现在的策略是支持所有3GPP规定的号码,且加上国内特有的120和122,总计10个号码当做紧急号码。
ECC list:112、911、000、08、110、999、118、119、120、122。
关于有卡时候紧急配置策略:
110/120/119/122/999 这五个号码当做normal 号码,112/911/000/08/118当做ECC num
但不论有卡无卡,在拨打这10个号码的时候界面需要显示紧急呼叫。
最终配置的方案如下:
通过配置项目的CU、CT、CMCC的开放市场MBN来实现。具体操作如下:
- 针对NV73755中的ECC number,全部清除,我们不用此NV进行紧急呼叫号码配置。
- 紧急呼叫号码只配置这10个号码112、911、000、08、110、999、118、119、120、122。
在NV69737和NV67221中配置。其中112/911/000/08/118五个号码在NV67221中配置,即有卡无卡都走紧急呼叫流程拨出。110/120/119/122/999这五个号码则配置在三个MBN里面的NV69737 里面(必须保证69736 配置true),且hardcode type 项为1。当然也可以将这10个号码都在NV69737中进行配置。
- 关于无卡情况下110/119/120/122 四个号码优先走CDMA网络,其他号码无卡优先走GW网络策略:目前部分高通平台已经实现了无卡所有紧急号码优先走CDMA的方案,可以通过NV73825(/sd/emergency_call_1x_scan_first)进行控制,并且默认已经集成到CM以及SD层了。所以想实现无卡情况下仅110/119/120/122走CDMA网络,其它号码走GW,需要我们自己优化代码。详细代码修改请参考高通文档80-NA121-1_E_Config_Emergency_Call_Orig_CDMA_NWs_China,也可参考上海冯志国代码修改如下:
修改文件包含如下(请务必保证NV73825配置了)
modem_proc/mmcp/api/cm_v.h
modem_proc/mmcp/mmode/cm/src/cmcall.c
modem_proc/mmcp/mmode/sd/src/sdcmd.c
modem_proc/mmcp/mmode/sd/src/sdi.h
modem_proc/mmcp/mmode/sd/src/sdss.c
/AMSS/build /zs_config/features_common.conf(主要是定义该feature的宏)
具体实现如下:
- modem_proc/mmcp/api/cm_v.h(在此头文件末尾定义函数声明cm_is_chn_emg_num):
/*Begin modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-1*/
#if defined FEATURE_NO_SIM_ECC_CALL_1X_SCAN_FIRST_FOR_CHINA_ECC_NUM
/*==========================================================================
FUNCTION cm_is_chn_emg_num
DESCRIPTION
Checks is the emergency call is on China number.
DEPENDENCIES
None
RETURN VALUE
boolean
SIDE EFFECTS
none
=========================================================================*/
extern boolean cm_is_chn_emg_num( void );
#endif
/*End modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-1*/
- modem_proc/mmcp/mmode/cm/src/cmcall.c(判断当前号码是否是期望的ECC号码,定义在文件末尾处):
/*Begin modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-2*/
#if defined FEATURE_NO_SIM_ECC_CALL_1X_SCAN_FIRST_FOR_CHINA_ECC_NUM
/*==========================================================================
FUNCTION cm_is_chn_emg_num
DESCRIPTION
Checks is the emergency call is on China number.
DEPENDENCIES
None
RETURN VALUE
boolean
SIDE EFFECTS
none
=======================================================================*/
boolean cm_is_chn_emg_num( void )
boolean result = FALSE;
char* chn_emg_num[]="110","119","120","122";
int i;
CMCALL_FOR_EACH_CALL_DO
if( this_call->call_type == CM_CALL_TYPE_EMERGENCY )
CM_MSG_HIGH_0("Emerg call found on number:");
for (i=0;i<this_call->num.len;i++)
CM_MSG_MED_1(" %u",this_call->num.buf[i]);
for (i=0;i<ARR_SIZE(chn_emg_num);i++)
if(cm_num_cmp_exact( &this_call->num,(uint8*)chn_emg_num[i],strlen(chn_emg_num[i]) ))
result = TRUE;
break;
CMCALL_END_FOR
return result;
#endif
/*End modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-2*/
- modem_proc/mmcp/mmode/sd/src/sdcmd.c(文件末尾函数定义,封装函数):
/*Begin modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-3*/
#if defined FEATURE_NO_SIM_ECC_CALL_1X_SCAN_FIRST_FOR_CHINA_ECC_NUM
/*==========================================================================
FUNCTION sd_get_cm_is_chn_emg_num
DESCRIPTION
This function checks with CM is the emergency call is on China emerg number.
==========================================================================*/
EXTERN boolean sd_get_cm_is_chn_emg_num( void )
return cm_is_chn_emg_num();
#endif
/*End modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-3*/
- modem_proc/mmcp/mmode/sd/src/sdi.h(文件末尾函数声明):
/*Begin modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-4*/
#if defined FEATURE_NO_SIM_ECC_CALL_1X_SCAN_FIRST_FOR_CHINA_ECC_NUM
/*==========================================================================
FUNCTION sd_get_cm_is_chn_emg_num
DESCRIPTION
This function checks with CM is the emergency call is on China emerg number.
==========================================================================*/
EXTERN boolean sd_get_cm_is_chn_emg_num( void );
#endif
/*End modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-4*/
- modem_proc/mmcp/mmode/sd/src/sdss.c(高通原有基础上增加限制条件判断):
case SDSS_IF_COND_CHINA_EMERG_CRITERIA: /* Currently handling only Gsubscriptions */
/* THIS IF COND IS DEPENDENT UPON MCC/MNC & EFS VALUE, PLEASE USE CAUTIOUSLY */
boolean bEvalAgainst = TO_WORD(para1, para2); /* if cond. to be evaluated against true or false */
/*Begin modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-5*/
#if defined FEATURE_NO_SIM_ECC_CALL_1X_SCAN_FIRST_FOR_CHINA_ECC_NUM
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
boolean result = sd_get_cm_is_chn_emg_num();
SD_MSG_HIGH_1("jarvis.feng: ecc number is 110/120/119/122? %d",result);
boolean china_emerg_scan_criteria = sdss_is_china_emerg_scan_allowed(ss) && result;
#else
boolean china_emerg_scan_criteria = sdss_is_china_emerg_scan_allowed(ss);
/*- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -*/
#endif
/*End modify by jarvis.feng for ecc call 1x can first when make 110.119.120.122 5-5*/
4. 针对无卡状态下联通WCDMA网络不支持紧急呼叫,优化方案。
配置方法如下:
(1):emergency_rat_acq_order GSM的优先级高于UTRAN。
(2):设置NV71522的 is_store_ral_in_efs 值为true。
在国内测试过程中,经常会遇到无卡情况下紧急呼叫无法正常呼出(有卡时候都基本没有问题,因为有卡都走正常呼叫流程),常见的3种网络不支持紧急呼叫的情况。
6.1 终端无卡在GSM网络不支持紧急呼叫
如果终端无卡状态下在GSM网络下紧急呼叫拨号失败,首先查看系统消息2,3,4中的rach_ctrl_params参数中的ac的值。如果为0表示支持,如果未其它值,表示此网络下不支持紧急呼叫。
2016 Dec 2 02:46:34.760 [92] 0x5B2F GSM DSDS RR Signaling Message -- System Information Type 3
rach_ctrl_params
max_retrans = 1 (0x1)
tx_int = 13 (0xd)
cell_barr_access = 0 (0x0)
re = 1 (0x1)
ac = 0 (0x0)
6.2 终端无卡在WCDMA网络不支持紧急呼叫
国内大多数WCDMA网络下在无卡状态下是不支持紧急呼叫的,终端发送的CM_Service_Reqest消息会直接被网络拒绝,拒绝原因值为17。
OTA LOG MM/CM Service Request
serv_type = 2 (0x2)
mob_ident
ident_type = 2 (0x2)
odd_even_ind = 1 (0x1)
num_ident = 15 (0xf)
ident[0] = 8 (0x8)
ident[1] = 6 (0x6)
ident[2] = 0 (0x0)
ident[3] = 6 (0x6)
ident[4] = 4 (0x4)
ident[5] = 3 (0x3)
ident[6] = 0 (0x0)
ident[7] = 2 (0x2)
ident[8] = 0 (0x0)
ident[9] = 1 (0x1)
ident[10] = 0 (0x0)
ident[11] = 6 (0x6)
ident[12] = 2 (0x2)
ident[13] = 5 (0x5)
ident[14] = 0 (0x0)
OTA LOG MM/CM Service Reject
chan_type = 0 (0x0)
prot_disc_check = 5 (0x5)
trans_id_or_skip_ind = 0 (0x0)
prot_disc = 5 (0x5) (GSM_MOB_MANAGEMENT)
msg_type = 34 (0x22)
prot
mob_man_prot
CM_SERVICE_REJECT
rej_cause
rej_cause_val = 17 (0x11)//NETWORK FAILURE
t3246_incl = 0 (0x0)
UE通过IMEI去向网侧申请发起紧急呼叫,但是网侧不支持,因此直接CM Service Reject,紧急呼叫失败。该问题在不插卡并将开机选网设置成为W优先(驻留到联通3G网络)的情况下拨打紧急呼叫号码会出现,是典型的网侧不支持引起的紧急呼叫失败。
6.3 终端的IMEI号非法导致紧急呼叫失败
在开发过程中,有时候终端所携带的IMEI号为非法的,这种情况也会导致在无卡的状态下导致紧急呼叫失败。
//终端发起CM_Service_Reqest消息:
OTA LOG MM/CM Service Request
serv_type = 2 (0x2)//紧急呼叫
mob_ident
ident_type = 2 (0x2)//IMEI号
odd_even_ind = 1 (0x1)
num_ident = 15 (0xf)//所携带IMEI号
协议中对ident_type的描述如下:
//被网络以原因值96拒绝了:
OTA LOG MM/CM Service Reject
chan_type = 0 (0x0)
prot_disc_check = 5 (0x5)
trans_id_or_skip_ind = 0 (0x0)
prot_disc = 5 (0x5) (GSM_MOB_MANAGEMENT)
msg_type = 34 (0x22)
prot
mob_man_prot
CM_SERVICE_REJECT
rej_cause
rej_cause_val = 96 (0x60)//invalid mandatory information
t3246_incl = 0 (0x0)
#96 错误的协议描述为:必选协议字段错误。
以上是关于高通平台紧急呼叫问题总结的主要内容,如果未能解决你的问题,请参考以下文章