小区广播

来源:互联网 发布:步兵战车 知乎 编辑:程序博客网 时间:2024/04/28 12:49
总结客户经常遇到的有关小区广播的相关问题,目前MTK从Android KK到N,所有chip均支持小区广播功能
 
1. 什么是小区广播

Spec Document : 3GPP TS 23.041
小区广播是短信的一种类型,但有别于普通的点对点短信。
一般的点对点短消息(Short Message Service - Point to Point, SMS-PP)只能传送短消息给一个或少数几个收件人,
但是小区广播技术则是被设计为能够在特定区域中,按照指定的频道(Channel)来广播消息,让许多使用者同时接收到同样的消息。
因此手机仅是开启CB功能,开启Channel,被动接收来自相应Channel的小区广播消息

2. 如何测试小区广播

接收端:
手机作为终端只是被动接收小区广播消息,前提是手机要开启CB功能,并且开启相应的CB Channel.
手机设置路径:Mms -> Settings -> General -> Cell broadcast settings -> Enable Cell broadcast -> Add Channel

发送端:
由于国内运营商目前不支持小区广播,因此国内实网下无法测试,需要在实验室搭建环境测试或者找国外测试人员,
实验室使用仪表一般都是安立,anite,R&S罗德,安捷伦等。
 
抓取mtklog (mobile + modem log)
分析小区广播问题需要从手机开机识别SIM卡到进入Mms Cell broadcast settings 查看CB Channel的过程,
以确保CB是开启,并且预置了相应的小区广播频道才能判断无法接收的问题发生在AP端还是modem端,
若CB为关闭状态,显然是无法接收小区广播消息的,若CB开启但未预置相应的Channel也是无法接收的。
 
提小区广播接收不到的相关问题前请确保
1. CB功能为开启状态 2. 成功预置了相应的CB Channel 3. 对比机在相同情况下能够接收(排除CB发送仪器端问题)
 
3. 各个频道分类

小区广播频道总范围为 0-65535 (0x0000-0xFFFF),其中紧急小区广播范围如下:

PWS(Public Warning System) as defined in 3GPP TS 22.268 : 4352-6399 (0x1100-0x18FF)

ETWS(Earthquake and Tsunami Warning System) 范围4352-4359(0x1100-0x1107), 其中4357-4359 (0x1105-0x1107) for future extension,
因此有效频道范围为4352-4356 (0x1100-0x1104)

CMAS(Commercial Mobile Alert System) 范围4370-4399 (0x1112-0x112F), 其中4396-4399 (0x112C-0x112F) for future versions,
因此有效频道范围为4370-4395(0x1112-0x112B)
PWS范围内除ETWS和CMAS以外, 4400-6399 (0x1130-0x18FF) for future versions, 目前没有被使用。
 
MtkMms.apk 处理除PWS以外的普通小区广播消息
CMASReceiver.apk (MTK_CMAS_SUPPORT) 和 CellBroadcastReceiver.apk (MTK_ETWS_SUPPORT) 处理CMAS ETWS 范围的小区广播消息

另外Channel 0 作为test sim卡使用,相关参考 FAQ08639 [CB]Channel 0 没有设置, 但是能收到channel 0的小区广播

4. MTK_CMAS_SUPPORT 与 MTK_ETWS_SUPPORT 作用与区别

由于小区广播区分紧急小区广播,对于MtkMms.apk而言,只处理普通小区广播消息 
SMS_CB_RECEIVED_ACTION = "android.provider.Telephony.SMS_CB_RECEIVED"

PWS紧急小区广播类包含CMAS和ETWS这两类,
AP都是处理 SMS_EMERGENCY_CB_RECEIVED_ACTION = "android.provider.Telephony.SMS_EMERGENCY_CB_RECEIVED"

(1) MTK_CMAS_SUPPORT宏的开启会增加 CMASReceiver.apk App名称为紧急警报
/packages/apps/CMASReceiver/src/com/mediatek/cellbroadcastreceiver/CellBroadcastConfigService.java
protected void onHandleIntent(Intent intent) {} 预置Channel逻辑在此方法中

(2) MTK_ETWS_SUPPORT宏的开启会增加 CellBroadcastReceiver.apk App名称为灾难预警
/packages/apps/CellBroadcastReceiver/src/com/android/cellbroadcastreceiver/CellBroadcastConfigService.java
protected void onHandleIntent(Intent intent) {} 预置Channel逻辑在此方法中
 
由于CMASReceiver.apk CellBroadcastReceiver.apk 中都有处理4370~4393的CB Message逻辑,
因此同时开启两个宏,测试时会发生同时会有2种声音、讯息及震动重叠现象导致PWS测试失败
由于Channel都可以自行定制,因此请只开启MTK_CMAS_SUPPORT = yes,不要同时开启这两个宏。
 
5. 预置小区广播的方法
 
无论 modem端、CMASReceiver.apk 还是 MtkMms.apk预置,任一处预置上即可
由于MtkMms.apk预置有时序问题发生,因此推荐 (1) modem或者 (2) CMASReceiver.apk中预置。
 
(1) modem端预置 (推荐)
custom\service\nvram\nvram_data_items.c 预设channel:
COMMON_NVRAM_EF_CB_CH_INFO_DEFAULT[] 里的这一段
#ifndef __CMAS__
0xFF, 0xFF, /* CH 1 , for example: chanel 50 is 0x00, 0x32 */
0xFF, 0xFF, /* CH 2 */
……
改为:
#ifndef __CMAS__
0x03, 0x8F, /* CH 1 , for example: chanel 911 */ 
0x03, 0x97, /* CH 2 , for example: chanel 919 */ 
……
注意:(1)#ifndef __CB_CHANNEL_ONLY_STORED_IN_NVRAM__ 和else 中 都有define
COMMON_NVRAM_EF_CB_CH_INFO_DEFAULT[]两个数组里面的都改下
(2)这样修改的话,如果是双卡项目,那么双卡预置的内容是一样的,如果需求双卡预置不一样的默认值,那么需进行如下改动:
①请为NVRAM_EF_CB_CH_INFO_LID添加NVRAM_ATTR_MULTI_DEFAULT属性,如下:
\custom\service\nvram\nvram_data_items.c(不同平台路径可能不同)
{
NVRAM_EF_CB_CH_INFO_LID,
NVRAM_EF_CB_CH_INFO_TOTAL,
NVRAM_EF_CB_CH_INFO_SIZE,
NVRAM_NORMAL(COMMON_NVRAM_EF_CB_CH_INFO_DEFAULT),
NVRAM_CATEGORY_USER,
NVRAM_ATTR_FACTORY_RESET | NVRAM_ATTR_MULTI_DEFAULT,//此处添加NVRAM_ATTR_MULTI_DEFAULT属性
"MT46",
VER(NVRAM_EF_CB_CH_INFO_LID)
},
②修改COMMON_NVRAM_EF_CB_CH_INFO_DEFAULT[],将原有的默认值放在一个{}中,然后复制一份,放{}中,放后面即可,中间用逗号分隔。举例如下:
\custom\service\nvram\nvram_data_items.c(不同平台路径可能不同)
如原有的是
COMMON_NVRAM_EF_CB_CH_INFO_DEFAULT[]=
{
……
}
那么请修改为
COMMON_NVRAM_EF_CB_CH_INFO_DEFAULT[]=
{
{……},//SIM1
{……} //SIM2,复制过来后,请在相应位置对预置参数进行修改。
}
如果对于双卡预置不同默认值仍有疑问,可以参考我司DCC上面的Modem_NVRAM_to_Customer.pptx中的NVRAM Customize章节,具体是page17~page22,主要是在page20页
(3)不管双卡预置相同默认值的改法,还是双卡预置不同默认值的改法,改完后,如果采用firmware upgrade升级可以直接升级,如果是Download Only或者OTA升级,还需将NVRAM_EF_CB_CH_INFO_LID_VERNO(\interface\service\nvram\nvram_editor_data_item.h)在原有的基础上加1,如原有是"000",请修改为"001",才可以生效。
 
(2) AP端预置且PWS范围内4352-6399 (0x1100-0x18FF),
并且MTK_CMAS_SUPPORT OR MTK_ETWS_SUPPORT开启后不满足,
请客制化CMASReceiver OR CellBroadcastReceiver
CellBroadcastConfigService.onHandleIntent()方法中预置channel的逻辑。
 
(3) 由于预置Channel必须在CB enabled的前提下才能预置成功,
因此AP端预置Channel的思路都是先通过调用 SmsManager activateCellBroadcastSms(true)开启CB,

之后构造 SmsBroadcastConfigInfo[]实例传入预置Channel信息,
再次调用SmsManager setCellBroadcastSmsConfig()方法,通过判断此方法反馈的boolean值为ture,
则表明modem预置Channel成功。
若默认要求CB为关闭状态,预置Channel完成后,再次调用SmsManager activateCellBroadcastSms(false)关闭CB即可。
 
(4) AP端预置 (不推荐,由于AP端预置和SIM卡与SMS初始化状态紧密相关,有很多无法预期的情况导致预置失败)
参考 FAQ13893 android L小区广播预置方法 

6. 默认开启小区广播的方法

modem端修改:custom\service\nvram\nvram_cust_pack.c 设置CB service 默认是打开的
COMMON_NVRAM_EF_SMSAL_COMMON_PARAM_DEFAULT[]
#ifdef __UE_SIMULATOR__
0x01, 0x01, /* CB setting - ON,CB all language - ON */
#else
0x00, 0x01, /* CB setting - OFF,CB all language - ON */
#endif
里这一句改为
#ifdef __UE_SIMULATOR__
0x01, 0x01, /* CB setting - ON,CB all language - ON */
#else
0x01, 0x01, /* CB setting - ON,CB all language - ON */
#endif

7. 小区广播常用AT命令 (radio_log中search)
 
(1) 查询小区广播信息 query CB config info
AT> AT+CSCB?
AT< +CSCB: <mode>,<mids>,<dcss>,<all language on>
<mode> : 0 enabled, 1 disabled.
0 <mids><dcss> are accepted -> CB ON
1 <mids><dcss> are not accepted -> CB OFF
<mids> : All available CBM Message Identifier, default is empty : “”
e.g. “0,1,5,320-478,922”
<dcss> : CBM Data Coding Scheme, default is empty : “”
e.g. “0-3,5”
<all language on>:
0 only <dcss> language is accepted
1 all language is accepted

e.g. 
CB为关闭状态,没有任何channel信息
AT> AT+CSCB?
AT< +CSCB: 1,"","0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,32,33,34,35,36,15,0,1,2,3",1

CB为开启状态,预置有50,100,200,201这四个Channel
AT> AT+CSCB?
AT< +CSCB: 0,"50,100,200-201","0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,32,33,34,35,36,15",1

(2) AT+CBM 手机接收到小区广播信息
e.g. 
AT< +CBM: 22
AT< 000100C80111E8329BFD068140201008040281402010
[UNSL]< UNSOL_RESPONSE_NEW_BROADCAST_SMS 000100c80111e8329bfd068140201008040281402010 [SUB0]

因此测试手机接收小区广播前,需要确认 (1) CB是否开启 (2) 待接收的Channel是否预置
 
8. CMAS 4370-4395 接收不到
 
请优先在Mms AP中确认CB Enabled,并且 CMASReceiver.app -> Settings -> 查看Emergency alerts选项是否被勾选,
若依然被勾选还接收不到,请做如下修改:
 
main_log中搜索"ignore CB RECEIVED ACTION because disabled enable_cell_broadcast"后,
需要把 CMASReceiver 中 enable_cell_broadcast 默认值全部改为true
 
(1) /vendor/mediatek/proprietary/packages/apps/CMASReceiver/res/xml/default_preference.xml
<setting key="enable_cell_broadcast" defaultValue="true"/> // make sure defaultValue="true"

(2) /vendor/mediatek/proprietary/packages/apps/CMASReceiver/res/xml/preferences_main.xml
<PreferenceCategory
android:key="category_cell_broadcast_settings"
android:title="@string/sms_cb_settings" >

<!-- Enable Cell broadcast -->
<com.mediatek.cellbroadcastreceiver.CheckBoxAndSettingsPreference
android:defaultValue="true// make sure defaultValue="true"
android:enabled="true"
android:key="enable_cell_broadcast"
android:summary="@string/enable_cell_broadcast_summary"
android:title="@string/enable_cell_broadcast_title" />

</PreferenceCategory>

(3) /vendor/mediatek/proprietary/packages/apps/CMASReceiver/src/com/mediatek/cellbroadcastreceiver/CellBroadcastReceiver.java
protected void onReceiveWithPrivilege(Context context, Intent intent, boolean privileged) {
……
} else if (Telephony.Sms.Intents.SMS_EMERGENCY_CB_RECEIVED_ACTION.equals(action) ||
Telephony.Sms.Intents.SMS_CB_RECEIVED_ACTION.equals(action)) {
// ignore incoming messages if CMAS option is off.
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);
boolean enableCB = prefs.getBoolean(
CheckBoxAndSettingsPreference.KEY_ENABLE_CELLBROADCAST, true); // false -> true
if (!enableCB) {
log("ignore CB RECEIVED ACTION because disabled enable_cell_broadcast");
return;
}
……
}

(4) /vendor/mediatek/proprietary/packages/apps/CMASReceiver/src/com/mediatek/cellbroadcastreceiver/CellBroadcastConfigService.java
@Override
protected void onHandleIntent(Intent intent) {
……
} else if (CellBroadcastReceiver.SMS_STATE_CHANGED_ACTION.equals(intent.getAction())) {
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
boolean enableCB = false;
if (!prefs.contains(CheckBoxAndSettingsPreference.KEY_ENABLE_CELLBROADCAST)) {
enableCB = true;
// begin [
prefs.edit().putBoolean(CheckBoxAndSettingsPreference.KEY_ENABLE_CELLBROADCAST, true).commit();
// ] end 
Log.d(TAG, "do not contain the enable_cell_broadcast ");
} else {
enableCB = prefs.getBoolean(CheckBoxAndSettingsPreference.KEY_ENABLE_CELLBROADCAST,
true); // false -> true
Log.d(TAG, "contain the enable_cell_broadcast,enableCB = " + enableCB);
}

9. CMAS 4380 4393 和 4381 4392 接收不到

ENG版本验证 -> Dial *#*#3646633#*#* -> Telephony -> CMAS ->
Show RMT Alerts (Display RMT alert) 对应测试 4380 4393 这两个Channel接收情况
Show Exercise Alerts (Display the exercise alerts) 对应测试 4381 4392 这两个Channel接收情况
 
USER版本同时也需要接收得到:
需要在 CMASReceiver 中将 enable_cmas_rmt_support / enable_cmas_exercise_support默认值改为true 
ENABLE_CMAS_RMT_SUPPORT 控制是否允许接收 4380 4393 这两个Channel
ENABLE_CMAS_EXERCISE_SUPPORT 控制是否允许接收 4381 4392 这两个Channel

(1) /vendor/mediatek/proprietary/packages/apps/CMASReceiver/res/xml/default_preference.xml
<setting key="enable_cmas_rmt_support" defaultValue="true"/> // false -> true
<setting key="enable_cmas_exercise_support" defaultValue="true"/> // false -> true

(2) /vendor/mediatek/proprietary/packages/apps/CMASReceiver/src/com/mediatek/cellbroadcastreceiver/CellBroadcastConfigService.java
@Override
protected void onHandleIntent(Intent intent) {
……
if (intent.getBooleanExtra("isBootCompleted", false)) {
SharedPreferences.Editor editor = prefs.edit();
if (!prefs.contains(ENABLE_CMAS_RMT_SUPPORT)) {
editor.putBoolean(ENABLE_CMAS_RMT_SUPPORT, true); // false -> true
}
if (!prefs.contains(ENABLE_CMAS_EXERCISE_SUPPORT)) {
editor.putBoolean(ENABLE_CMAS_EXERCISE_SUPPORT, true); // false -> true
}
editor.commit();
editor.clear();
}

(3) /vendor/mediatek/proprietary/packages/apps/CMASReceiver/src/com/mediatek/cellbroadcastreceiver/CellBroadcastAlertService.java
private boolean isMessageEnabledByUser(CellBroadcastMessage message) {
……
case SmsCbCmasInfo.CMAS_CLASS_REQUIRED_MONTHLY_TEST:

SharedPreferences rmtPrefs = this.getSharedPreferences(
PREF_NAME, MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE
| MODE_MULTI_PROCESS);
boolean resOfRmt = rmtPrefs.getBoolean(CellBroadcastConfigService.ENABLE_CMAS_RMT_SUPPORT, true); // false -> true
Log.d(TAG, "in isMessageEnabledByUser , CMAS setting " + resOfRmt);
return resOfRmt;

case SmsCbCmasInfo.CMAS_CLASS_CMAS_EXERCISE:

SharedPreferences exePrefs = this.getSharedPreferences(
PREF_NAME, MODE_WORLD_READABLE | MODE_WORLD_WRITEABLE
| MODE_MULTI_PROCESS);
boolean resOfexe = exePrefs.getBoolean(CellBroadcastConfigService.ENABLE_CMAS_EXERCISE_SUPPORT, true); // false -> true
Log.d(TAG, "in isMessageEnabledByUser , EXER setting " + resOfexe);
return resOfexe;
 
(4) /vendor/mediatek/proprietary/packages/apps/CmasEM/res/xml/cmas_setting.xml
<CheckBoxPreference
android:key="enable_cmas_rmt_support"
android:title="@string/cmas_rmt_title"
android:summary="@string/cmas_rmt_summary"
android:persistent="true"> // false -> true
</CheckBoxPreference>
<CheckBoxPreference
android:key="enable_cmas_exercise_support"
android:title="@string/cmas_exercise_title"
android:summary="@string/cmas_exercise_summary"
android:persistent="true"> // false -> true
</CheckBoxPreference>
原创粉丝点击