远程升级模块是一个独立运行的进程,该模块提供了必要的接口函数供调用。本文档主要对模块的调用以及升级包的制作作相应的说明,并对升级过程中的各种状态的处理作了简要描述。
一般情况下终端程序在服务端会有版本控制记录,在版本验证的时候,服务端会对终端上发的程序版本进行判断,若需要更新则由终端收到需要更新的返回码之后发起更新请求。请求分为三个步骤:1.获取更新服务器信息;2.向更新服务器下载更新程序;3.处理下载后的升级包。在终端应用程序代码中,只需要直接调用DM层的封装函数即可。
Dm模块对远程升级函数的封装按照两个应用来划分:app和mdma,功能完全一样,不同之处仅仅是在不同线程中的使用,函数名存在dm_app_*()与dm_mdma_*()之分。下面仅对app应用函数接口作说明。
函数原型 | int dm_app_SendUpdateModuleUpdatedMsg_HB( unsigned char *apn, unsigned char *userid,\ unsigned char *passwd, unsigned char *ip, unsigned char *port, unsigned char *prover, unsigned char *downfile, char type); |
参数 | APN,用户ID,用户密码,升级地址IP,PORT,程序版本,升级程序URL路径,升级类型(0x01:自动升级; 0x02:手动升级; 0x04:短信通知升级) |
返回值 | |
功能说明 | 升级主程序 |
备注 | 入参必须全部是字符串 |
函数原型 | int dm_app_RegisterUpdateStateHandle( void(*Fp)(unsigned char state) ); |
参数 | 回调函数指针 |
返回值 | |
功能说明 | 注册升级模块状态处理函数 |
备注 | State:(0x01:成功;0x02:失败;0x04:未升级;) |
函数原型 | int dm_app_UnRegisterUpdateStateHandle( void ); |
参数 | 无 |
返回值 | |
功能说明 | 注销升级模块状态函数 |
备注 |
函数原型 | int dm_app_RegisterDownLoadStepHandle( void(*Fp)( unsigned char *file_name, long int total, long int step ) ); |
参数 | 回调函数指针 |
返回值 | |
功能说明 | 注册升级模块进度处理函数 |
备注 |
函数原型 | int dm_app_UnRegisterDownLoadStepHandle( void ); |
参数 | 无 |
返回值 | |
功能说明 | 注销升级模块进度处理函数 |
备注 |
在开机流程中,可以先注册状态处理和进度处理函数,亦可以在程序升级发起前注册。在获取升级的地址与参数之后就可以调用主升级程序函数了,升级可能需要的时间较长。
..\yaffs\app\MIT\Resource\etc目录下的mit.ini文件是远程升级模块的配置文件,里面包含有[System]即GPRS地址和[Update]即 升级参数,远程升级的断点续传功能也是由此文件来判断。
mit.ini文件中的[System]参数仅在云南版本的烟信通中有作用,在其他版本的使用中没有用途。
在正常未升级状态下,mit.ini文件中的downprover=和downfile=内容为空,如:
[System]
gprsip=222.76.149.190
gprsport=5857
[Update]
proid=000000
prover=000000
downprover=
downfile=
file=
当每一次升级开始的时候,prover=为当前程序版本号,downprover=会写入本次升级成功的版本号,downfile=写入本次升级的文件名。如:
[System]
gprsip=222.76.149.190
gprsport=5857
[Update]
proid=000000
prover=000000
downprover=080506
downfile=MIT_CRM_UPDATE_080507.tar.gz
file=
升级成功之后prover=修改为本次升级成功的版本号,downprover=和downfile=内容重新置空。如:
[System]
gprsip=222.76.149.190
gprsport=5857
[Update]
proid=000000
prover=080506
downprover=
downfile=
file=
若本次升级进行到一部分而未继续进行(异常或关机),那么,则在下一次重新升级开始的时候,文件仍然如下:
[System]
gprsip=222.76.149.190
gprsport=5857
[Update]
proid=000000
prover=000000
downprover=080506
downfile=MIT_CRM_UPDATE_080507.tar.gz
file=
此时,若即将升级的程序版本号与downprover=080506相同,则进行断点续载,升级模块会计算已下载文件的大小,然后在HTTP下载请求是从断点处开始请求下载。升级完成后mit.ini文件与一次性升级完全相同。
状态处理函数和进度处理函数的注册可以变化,即可以在开机时注册也可以在升级发起时注册,若是开机流程注册的函数,共用性较高则可以在升级后不注销,否则需要注销。
实例如下:
void DownLoadStepRegister( unsigned char *downfile, long int total, long int step );
dm_app_RegisterDownLoadStepHandle(DownLoadStepRegister);
static void net_proc_update_termin_result(unsigned char ucResult);
dm_app_RegisterUpdateStateHandle(net_proc_update_termin_result);
dm_app_SendUpdateModuleUpdatedMsg_HB(szApn, "user", "1234",
szServerIP, szServerPort, szProgVer, szProgUrl, 0x01);
dm_app_UnRegisterUpdateStateHandle( void );
升级提示界面是在MIT主线程创建的一个模态对话框,在发起远程更新时创建对话框,创建时会显示对话框的初始化文本内容。
调用升级模块后,当模块开始进行HTTP下载时,会固定时间间隔的持续调用由dm_app_RegisterDownLoadStepHandle(DownLoadStepRegister); 注册的进度回调函数,回调函数中有进度参数值,现有的做法是在进度回调函数中将体现当前进度值的字符串设置为模态对话框的显示内容。随着升级模块固定间隔的持续调用回调函数,回调函数又会更新对话框的显示文本,这样就可以在显示界面实时的看到当前的下载进度。
在实际使用过程中,应用程序调用dm_app_SendUpdateModuleUpdatedMsg_HB时,在保证参数完全正确的情况下(IP端口无误,版本号较原版本更高,正确的url),升级模块会主动进行GPRS连接,然后socket连接->升级文件下载->解压并更新文件->升级完成重新启动。
在发起远程更新时,升级模块会检测GPRS状态、重新连接GPRS并在完成后断开。GPRS的连接会出现如下状况:由于现有通讯库会对MIT进程中的GPRS调用进行控制,就会出现两个进程对GPRS状态判断的冲突,所以在发起远程更新时,要保证当前GPRS是断开状态,现在的通讯库提供了一个GPRS状态判断函数可供调用。
根据传入参数的情况可出现如下状态:
-
- 若IP,PORT端口传入错误,升级模块不发起更新并自动退出
- 若GPRS连接不成功,升级模块不发起更新并自动退出
- 若传入url地址错误,升级模块升级失败并退出
- 若传入版本号低于mit.ini中存储的原版本号(prover=原版本号),升级模块不发起更新并退出
- 在升级时中断,那么在下一次发起升级时,若传入的版本号与前一次发起升级时的版本号一致,升级模块进行断点续载,若传入的版本号比前一次发起升级时更高,则会删除前一次的下载,重新更新当前传入的版本。
综合上述的状态,在进行远程升级时若出现升级提示界面闪一下就退出的情况,首先应该检查参数的正确性,看入参是否会造成上述结果,然后分析其他可能的问题。
1.升级包必须制作成.tar.gz为后缀名的文件(如UPDATE_080507.tar.gz)。
2.升级包压缩过程要注意tar 语句的参数,正确形式如下:
如升级文件在文件夹 ..\MIT\UPDATE_080507 里面,则可以在路径..\MIT即文件夹UPDATE_080507的根目录下执行
tar czvf UPDATE_080507.tar.gz ./ UPDATE_080507(正确)
tar czvf UPDATE_080507.tar.gz UPDATE_080507(错误)
3.升级文件夹中除了有要更新的文件之外,必须有一个名为update.ini的文件,用来控制文件的升级
-
- Update.ini文件格式
1、update.ini文件一行有四个属性,每个属性之间以TAB键分割,每行之间以回车、换行结束;
2、update.ini文件一行四个属性说明如下:
程序名或目录名 存放目录 操作类型 文件类型
注:
a、程序名或目录名:需要升级的程序名或目录名,最大长度不能超过64字节;
b、存放目录
c、操作类型:(1:增加; 2:删除; 4:升级; 8:停止(只对可执行文件有效); 16:启动(只对可执行文件有效))
d、文件类型:(1:目录; 2:可执行文件; 4: 配置文件; 8: 驱动程序;)
-
- Update.ini示例解析
例如,某升级包中含有如下文件:
其中,
包含三个升级文件:db_set.db、MIT、window_button_set_up.gif
包含一个配置文件:update.ini
本次升级的目的:1.升级即替换两个文件db_set.db、MIT
2.增加一个图片文件 window_button_set_up.gif
3.删除中断内已存在的一个文件set_db.dat
那么update.ini配置如下:
第一行:
文件名:MIT 文件路径:/mnt/yaffs/app/MIT/Bin 操作类型:4:升级
文件类型:2:可执行文件
第二行:
文件名:window_button_set_up.gif 文件路径/mnt/yaffs/app/MIT/Resource/picture
操作类型:1:增加 文件类型:4:配置文件
第三行:
文件名:db_set.db 文件路径:/mnt/yaffs/app/MIT/ Resource/etc
操作类型:4:升级 文件类型:4:配置文件
第四行:
文件名:set_db.dat 文件路径:/mnt/yaffs/app/MIT/ Resource/etc
操作类型:2:删除 文件类型:4:配置文件
删除文件只在update.ini文件内容中体现出来