您的位置:首页 > 其它

OTA简单介绍

2014-02-20 13:33 169 查看
转载baidu文库

参考文档:IS_95B协议,683协议, 80-V0223-1_X3_ota

OTA是Over The Air的简称,也就是我们通常所说的空中接口。由发起方来分类,可以分成OTASP与OTAPA。其中:OTASP是Over
the air service provisioning的简称,由用户端发起,通过拨打Activation code:*228,*22800(800M A
系统),*22801(800M B系统)来执行。OTAPA是Over the air parameter administration的简称,由网络端发起,用户并不知晓。

OTA的主要功能是下载NAM Parameter(号码分配模块)与PRL List(优先漫游列表),而且更多的应用是用于下载PRL。

这里简要的介绍一下NAM参数:
NAM:
号码分配模块,每一个NAM是一些独立的网络参数的集合,MS正是依赖这些参数来接入网络。卡中只有一个NAM,NV中最大可以支持4个NAM,一般是2个NAM。
NAM参数有:
IMSI:国际移动站标识,15位10进制数表示,由MCC,MNC,MIN组成。
MCC:
移动国家码码,3位10进制数表示,IMSI的最高3位,占10bit内存,存储在NV_IMSI_MCC_I中
MNC:
移动网络码,2位10进制数表示,IMSI的第11,12位,占7bit内存,存储在
NV_IMSI_11_12_I中
MIN:
移动标识号码:是IMSI的最低10位,分成MIN2(高3位),MIN1(低7位)。MIN2存储在NV_MIN2_I中,占10bit,MIN1存储在NV_MIN1_I中,占34bit
SPC: Service Programming Code。安全密码,用于控制NAM参数的修改。如果要修改NAM参数,则必须先通过SPC验证。6位10进制数,范围从000000到999999,存储在NV_SEC_CODE_I中
SPASM:Subscriber Parameter Administration Security Mechanism。是用来防止NAM值被未经认证的网络修改的安全机制。
A_KEY:用于鉴权的输入,存储在NV_A_KEY_I中
A_KEY Checksum:在写A_KEY的时候需要输入26位的十进制数,前20位是A_KEY,后6位是CHECK
SUM,MS 先用A_KEY通过CAVE算法算出一个CHECK SUM跟输入的比较,如果相同则写允许写NV
ESN:
电子序列号,手机出厂时的序列号,也用于鉴权,存放在NV_ESN_I中
UIM_ID:卡的ID。有卡版本把UIM_ID做为ESN号码。
NAME:可以用来存放运营商的名字
SSD(Shared Secret Data):当需要鉴权的时候,网络端发送随机数跟SSD过来,MS通过A_KEY,ESN,MIN,随机数产生SSD跟网络端发过来的SSD比较,如果相同则鉴权通过
MDN:用来存放电话号码,存储在NV_DIR_NUMBER_I
SID:系统标识,当前系统的系统标识,是一个动态变化的值,通过跟手机里面存储的Home SID,NID对进行比较,用来判断是不是漫游
NID:网络标识,也是一个动态变化的值,从当前捕获的系统中得到
HOME SID REG:是否允许网内SID漫游
FOR SID REG:是否允许网外SID漫游
FOR NID REG:是否允许网外NID漫游
HOME SID NID PAIR:20对,存放在NV_SID_NID_LIST_I中

PRL:漫游优先列表,在搜索系统中用到,可以通过QPST工具或者OTA更新。
PRL Enable:用来标识搜网时是用PRL还是用系统默认的表,存放在NV_PRL_ENABLED_I

下面时关于OTA流程的一些简要介绍:

OTASP
(user-initiated OTA activation)
– NAM parameter download (IMSI, MDN)
– Preferred Roaming List (PRL) download
– Service Programming Lock download

A-Key exchange


OTAPA
(network-initiated OTA activation)
– New with IS-683A
– Supported in DMSS 3100 Release 2.0 and later
– Existing standard OTASP capability
– Service Programming without user intervention
– NAM lock

OTASP的工作流程如下:

用户拨打Activation code:(*FC + XX + SEND)发起呼叫。
其中*FC是Feature Code(*228或*act),标识发起的是一个OTA
call
xx是System Selection Code,00指800 MHz,
A-Band,01指800 MHz, B-Band
(关于Activation code详细的说明见IS683 3.2.1)

建立call连接以后,MS与基站通过Data Burst来通讯:

基站给MS发送Request消息要求MS执行某种操作
然后MS回给基站Response消息告诉基站操作的结果:
Request消息的类型有下面几种:

OTASP_CONFIG_REQ_MSG:读取NAM参数配置

OTASP_DOWNLOAD_REQ_MSG:下载NAM参数到一个临时的存储器中

OTASP_MS_KEY_REQ_MSG:更新A_KEY


OTASP_KEY_GEN_REQ_MSG:产生SSD

OTASP_REAUTH_REQ_MSG:重新鉴权

OTASP_COMMIT_REQ_MSG:把临时存储器中的NAM参数写到NV里面去

OTASP_PROT_CAP_REQ_MSG:MS支持哪些OTA业务

OTASP_SSPR_CONFIG_REQ_MSG:读取PRL配置

OTASP_SSPR_DOWNLOAD_REQ_MSG:下载PRL到一个临时的存储器中

OTASP_VALIDATION_REQ_MSG:验证(包括SPC,SPASM)

OTASP_OTAPA_REQ_MSG:OTAPA业务

对应的Response消息类型有:

OTASP_CONFIG_RSP_MSG

OTASP_DOWNLOAD_RSP_MSG

OTASP_MS_KEY_RSP_MSG

OTASP_KEY_GEN_RSP_MSG

OTASP_REAUTH_RSP_MSG

OTASP_COMMIT_RSP_MSG

OTASP_PROT_CAP_RSP_MSG

OTASP_SSPR_CONFIG_RSP_MSG

OTASP_SSPR_DOWNLOAD_RSP_MSG

OTASP_VALIDATION_RSP_MSG

OTASP_OTAPA_RSP_MSG

下面通过一个PRL下载的例子来说明一下流程:
我们假定用户拨了*22800,OTASP CALL已经建立好了,这时候CDMA状态处于Convation状态:
首先,基站想知道MS支持哪些OTA function,它发了一个Protocol Capability Request:

然后MS处理这条Data burst短信,返回一个Protocol Capability Response告诉基站它支持下面这些OTA
业务

因为Feature包含了Service Programming Lock,所以需要验证SPC,于是基站发送Validation
Request给MS,并给出SPC=0看看是否跟手机当中的SPC匹配

MS验证SPC以后,回复Validation Response给基站,告诉基站验证成功

基站想知道MS支持的最大PRL长度是多少,于是发送SSPR Configuration Request读取MS中PRL
长度的配置:

MS返回SSPR Configuration Resonse消息告诉基站它支持的PRL最大长度为3k,当前的PRL长度为3067,PRL
Version为0

然后开始下载PRL到临时的存储器中,由于PRL表比较大,所以需要分段下载,segment_offset告诉MS偏移首地址多少开始存储,由于刚开始,所以值为0,Segment_size告诉MS这一段PRL的大小。Last_segment标识是不是最后一个PRL段。

MS返回存储的结果,告诉基站存储成功

其他的段重复上面的过程。

我们看一下最后两段的SSPR Download Request:

last_segment =1标识最后一段已经收到,整个PRL download结束

然后基站给MS发送Commit Request,要求把临时存储器里面的PRL表写到NV/RUIM中去:

MS处理Commit Request消息,存储完毕,告诉基站PRL写入成功

这时候整个PRL下载过程就结束了。

支持OTA需要打开的宏:

我们自己定义的宏:

LT_DIAMOND_UI_OTASP

部分代码如下

在CALL建立好以后,cdma的MAIN STATE处于CDMA_TC(mccdma.c里面的mcc_subtask)的CDMA_CONV子状态,这时候收到一条Data
burst消息,调用tc_conv_msg(mcctc.c)函数进行处理。

switch (msg_ptr->msg.gen.msg_type)

{

case
CAI_TC_REV_BURST_MSG:/*Data burst type*/

next_state =
process_tc_data_burst( &msg_ptr->msg, next_state );

break;

}

在process_tc_data_burst(mcctcsup.c)函数中因为收到的是OTA消息

if (msg_ptr->tc_burst.burst_type ==
CAI_OTA_ACTIVATION)

调用otaspx_ext_to_int把消息转化成otasp的消息类型

typedef union

{

otaspi_gen_msg_type gen;

otaspi_config_req_msg_type config_req; /* Configuration Request */

otaspi_download_req_msg_type dload_req; /* Download Request */

otaspi_commit_req_msg_type commit_req; /* Commit Request */

otaspi_reauth_req_msg_type reauth_req; /* Re-Authenticate Request */

otaspi_ms_key_req_msg_type ms_key_req; /* MS Key Request */

otaspi_key_gen_req_msg_type key_gen_req; /* Key Generation Request */

otaspi_prot_cap_req_msg_type prot_cap_req; /* Protocol Capability Request */

otaspi_sspr_cfg_req_msg_type sspr_cfg_req; /* SSPR Config Request */

otaspi_sspr_dload_req_msg_type sspr_dload_req; /* SSPR Download Request */

otaspi_validation_req_msg_type validn_req; /* Validation Request */

otaspi_otapa_req_msg_type otapa_req; /* OTAPA Request */

} otaspi_ftc_msg_type;

gen表示Request消息的类型,消息实体放入对应类型的块

转化成功以后再调用otasp_process_msg(otasp.c)处理具体的消息

switch (otasp_msg_ptr->gen.msg_type)

{

case
OTASP_CONFIG_REQ_MSG:

process_config_req (&otasp_msg_ptr->config_req);

break;

case
OTASP_DOWNLOAD_REQ_MSG:

next_state = process_dload_req (&otasp_msg_ptr->dload_req);

break;



}

otasp与otapa最终执行的操作都在这个函数里。有兴趣的同事可以直接在这里(otasp.c)开始看OTA对不同类型消息的处理过程。这些代码由于我也是刚开始学习,不是很熟悉,准备下次再介绍。

另外,关于OTASP的一些UI的提示。

1:提示”Programming need initial”。在当前使用nam的MIN值没有被写过的情况下,需要在开机的时候提示用户。

在uisstrt.c中处理。

Uistate_startup()

case INIT_S:中有很大一段代码是对NAM一些参数合法性的验证,如果超出范围,就整个NAM初始化掉。在读出MIN1或者MIN2的时候,如果ui_get_nv返回的状态是NV_NOTACTIVE_S,我们就在这里置一个标志,然后在进入idling的时候弹出pop框提示

2:在用户拨打*228,*22800,*22801的时候,需要在通话界面显示

Searching。。。

Activation

OTASP

在ui_call_show_outgoing_call()中处理,画界面

3::在通话中,显示Programming in Progress

在ui_call_show_conversation()中处理,画界面

3:OTASP完成以后,显示根据结果显示Programming Successful或者

Programming Unsuccessful

在ui_call_show_release_call()处理,画界面

4:OTASP/OTAPA结束以后,需要beep 3
声。

在end_conversation()中处理,设了一个400ms的定时器

#ifdef LT_DIAMOND_UI_OTASP

/* OTASP ending tone */

if ( ISOTASP(curr_call.cm_info.call_type) )

{

ota_beep_time = 1;

ui_menutimer_set((int4)400);

}

#endif /* LT_DIAMOND_UI_OTASP */

然后在call_end_disp_mode_event()中对timer事件进行处理

#ifdef LT_DIAMOND_UI_OTASP

case UI_MENUTIMER_F:

if(ota_beep_time < 3)

{

ota_beep_time ++;

uisnd_tone( UI_EARBEEP_SND, SND_TIME, 200 );

ui_menutimer_set((int4)400);

}

#endif /* LT_DIAMOND_UI_OTASP */

OTAPA的流程跟OTASP类似,只是不需要UI的提示,因为OTAPA是网络端发起的,用户并不知道,所以在执行OTAPA操作的时候,不需要做UI处理。

OTA相关可能使用到的工具有:

QPST,QXDM

QXDM用来查看一些NAM项的内容

QPST--àRoam--àSave to file
得到 *****.qcn打开可以查看PRL的信息

这里介绍的只是OTA处理的一个大体框架,细节方面我会慢慢完善进去,因为刚接触OTA,难免有一些理解上面的错误,欢迎指正,谢谢
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: