VRE实验7实验手册v30.docx
《VRE实验7实验手册v30.docx》由会员分享,可在线阅读,更多相关《VRE实验7实验手册v30.docx(15页珍藏版)》请在冰豆网上搜索。
VRE实验7实验手册v30
(项目七)手机应用开发—IPSearch
1、项目名称:
项目名称:
手机多媒体开发—IPSearch
课时安排:
16
2、项目目标:
IPSearch项目效果图如下:
图7-1IPSearch效果图
功能:
界面一是logo界面,3秒后跳转到界面二。
界面二是查询界面,点击输入框位置可以输入IP地址,点击OK键得到查询结果,点击右软键退出程序。
说明:
学习VRE系统中的HTTP联网内容,完成这款IPSearch软件。
通过本次实验让学员熟悉VRE平台程序架构、深入理解VRE的图形图像处理机制,掌握VRE发送HTTP网络请求的操作方法。
(1)熟悉VRE程序架构
(2)掌握VRE应用程序开发基础
(3)深入理解VRE图形图像系统
(4)掌握VRE资源管理器的使用
(5)掌握VREHTTP操作方法
(6)生成手机版本,打包安装到手机运行
3、项目方式:
(1)老师带领下,每名同学独立完成该任务
4、项目步骤
4.1任务1:
修改应用程序的图标和标题(时间:
20分钟)
4.1.1任务描述
(1)修改应用程序的图标
(2)修改应用程序的标题
4.1.2任务目的
(1)熟悉VRE资源管理器及配置文件的使用
(2)掌握如何修改VRE应用程序的图标和标题
4.1.3任务要求
(1)编译生成手机版本,能在真机上正常运行。
4.1.4难点提示
参考项目三任务一
4.2任务2:
界面设计及框架搭建(时间:
20分钟)
4.2.1任务描述
(1)设计程序UI界面
(2)实现UI框架部分
4.2.2任务目的
(1)进一步掌握VRE框架
(2)掌握VREGUI设计方法
4.2.3任务要求
(1)UI设计美观,合理
(2)能够在模拟器上正常运行
4.2.4难点提示
(1)参考界面如图7-1所示。
(2)框架搭建,首先在工程文件IPSearch_start.c的入口函数vm_main()中创建控制logo的定时器,在回调函数TimerCB()中实现logo界面的跳转。
在draw_hello()中实现界面的绘制,根据界面标志位值的不同分别绘制相应的界面,参考代码如下:
VMINTg_ViewFlag=0;//定义界面标识符
VMINTg_TimerHandle;//定义定时器句柄
voidvm_main(void){
。
。
。
g_TimerHandle=vm_create_timer(1000,TimerCB);
。
。
。
}
staticvoiddraw_hello(void){
VMUINT8*buf;
/*获取目标缓冲*/
buf=vm_graphic_get_layer_buffer(layer_hdl[0]);
/*用白色黑底清屏*/
vm_graphic_fill_rect(buf,0,0,vm_graphic_get_screen_width(),
vm_graphic_get_screen_height(),VM_COLOR_WHITE,VM_COLOR_BLACK);
switch(g_ViewFlag)
{
case0:
draw_image(buf,"logo.jpg",0,0);//显示logo界面
break;
case1:
draw_image(buf,"IP.png",0,0);//显示IP查询背景图片
draw_IPtext(buf);//绘制查询界面文字信息
break;
default:
break;
}
voidTimerCB(VMINTtid)
{
g_ViewFlag++;//定时器刷新时界面跳转
if(g_ViewFlag==1)
{
vm_delete_timer(g_TimerHandle);//进入查询界面后删除定时器
}
handle_sysevt(VM_MSG_PAINT,0);
}
4.3任务3:
资源加载及UI界面绘制(时间:
20分钟)
4.3.1任务描述
(1)加载程序所需的图片资源
(2)将资源导入到内存中
(3)显示界面图片
4.3.2任务目的
(1)掌握资源管理器的使用
(2)掌握图片资源的导入方法
(3)掌握图片的显示方法
4.3.3任务要求
(1)将导入并显示图片资源的功能实现方法封装成函数
(2)在模拟器上能正常运行
(3)以断点调试的方式保证结果的正确性
4.3.4难点提示
(1)资源导入功能,请参考项目三任务3、任务4
4.4任务4:
网络连接(时间:
60分钟)
4.4.1任务描述
(1)发送HTTP联网请求
(2)获得网络返回的数据
4.4.2任务目的
(1)掌握VRE发送HTTP请求的操作步骤
(2)了解webxml获取数据的方法
4.4.3任务要求
(1)成功联网并获取返回数据
(2)实现所需功能,能在模拟器上正确运行
(3)生成手机版本,能够在手机上正常运行
4.4.4难点提示
(1)发送HTTP请求在工程文件IPSearch_start.c的http_request()函数中实现,网络连接的步骤为:
定义网络连接方式、组装联网地址、创建报头指针空间、组装URL和HTTP请求头、发送联网请求,最后释放指针空间。
参考代码如下:
#defineIP_URL
"
voidhttp_request(VMSTRnumber)
{
http_head_tg_head[1];//创建HTTP报头
asyn_http_req_tg_reg;//定义联网方式
VMCHARwURL[128]={0};
VMINTret;
//定义网络连接方式
g_reg.req_method=GET;
g_reg.use_proxy=HTTP_USE_CMNET;
strcpy(wURL,IP_URL);
strcat(wURL,number);//组装联网地址
//创建报头结构指针指向的空间
g_reg.http_request=(http_request_t*)vm_calloc(sizeof(http_request_t));
if(NULL==g_reg.http_request)
{
return;
}
//组装URL
strcat(g_reg.http_request->url,wURL);
//组装HTTP请求头
sprintf(g_head[0].name,"RANGE");
sprintf(g_head[0].value,"bytes=-1");
g_reg.http_request->nhead=1;
g_reg.http_request->heads=g_head;
ret=vm_asyn_http_req(&g_reg,http_hook_cb,http_state_cb);
//释放HTTP指针的空间
vm_free(g_reg.http_request);
}
(2)联网后,在http_hook_cb()函数中接收网络返回数据,将信息保存到全局数组中,传给数据解析函数,进行结果解析。
参考代码如下:
voidhttp_hook_cb(VMINTbResponse,void*pSession)
{
VMUINTnWriteLen=0;
VMINTfile_hdl;
VMCHARg_Info[500]={0};
http_session_t*session=(http_session_t*)pSession;
if(0==bResponse)
{
//把返回的信息保存到数组中
if(g_Info!
=NULL)
{
memset(g_Info,0,500);
strncpy(g_Info,session->resbody,session->nresbody);
}
//把联网返回的结果传给数据解析函数
g_show_info=http_result_parse(g_Info);
handle_sysevt(VM_MSG_PAINT,0);
}
}
4.5任务5:
数据解析(时间:
70分钟)
4.5.1任务描述
(1)解析网络返回数据,获取IP地址信息
4.5.2任务目的
(1)熟悉XML文件
(2)掌握XML文件的解析方法
4.5.3任务要求
(1)成功解析得到IP地址信息
4.5.4难点提示
(1)XML文件的解析在工程文件IPSearch_start.c的http_result_parse()函数中实现,数据解析中需要查找到XML文件中第二个和字符串所在的位置,两个字符串中间的内容即是要获取的结果。
实现参考代码如下:
//网络返回的xml数据的格式
xmlversion="1.0"encoding="utf-8"?
>
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xmlns:
xsd="http:
//www.w3.org/2001/XMLSchema"xmlns="http:
//WebX
152.45.25.5
美国
//数据解析函数
VMINThttp_result_parse(VMSTRresbody)
{
VMINTnSize=0;
VMINTi=0;
VMCHARszStart[]="";
VMCHARszEnd[]="";
VMCHARchTemp[2]="";
VMSTRpFileTemp1=NULL;
if(resbody==NULL)
{
return0;
}
//查找地址信息所在位置
pFileTemp1=strstr(resbody,szStart);
pFileTemp1=strstr(pFileTemp1+1,szStart);
if(pFileTemp1)
{
i+=8;
while
(1)
{
if(pFileTemp1[i]=='<')
break;
chTemp[0]=pFileTemp1[i++];
strcat(g_Result,chTemp);
}
}
return1;
}
4.6任务6:
结果显示(时间:
20分钟)
4.6.1任务描述
(1)将解析后的结果显示到屏幕上
4.6.2任务目的
(1)熟悉字符的编码转换
(2)熟练掌握文字的输出
4.6.3任务要求
(1)将获取到的UTF-8格式的字符转化成UCS-2格式的显示
(2)在模拟器上能正常运行
(3)以断点调试的方式保证结果的正确性
4.6.4难点提示
(1)成功获取查询结果后,最后一步工作是结果显示,由于VRE手机只支持显示UCS-2格式的字符,所以首先需要调用UTF8toUCS2Code()函数进行字符转码,该函数定义在工程文件IPSearch_start.c中,实现参考代码如下:
VMINTUTF8toUCS2Code(VMUINT8*utf8_code,VMUINT16*ucs2_code)
{
VMUINT16temp1,temp2;
VMINTis_unrecognized=FALSE;
VMUINTstep=1,counter=0,end=0;
VMUINT8*utf8string=utf8_code;
if(!
utf8_code||!
ucs2_code){
return0;
}
end=strlen((char*)utf8_code);
while(counterif(0x00==(*utf8string&0x80)){
/*1byteUTF-8Charater.*/
temp1=*((VMUINT8*)(utf8string));
wstrcpy((VMWCHAR*)ucs2_code++,(VMWCHAR*)&temp1);
step=1;
counter+=step;
utf8string+=step;
is_unrecognized=TRUE;
}
elseif(0xc0==(*utf8string&0xe0)&&
0x80==(*(utf8string+1)&0xc0)
){
/*2bytesUTF-8Charater.*/
temp1=(VMUINT16)(*utf8string&0x1f);
temp1<<=6;
temp1|=(VMUINT16)(*(utf8string+1)&0x3f);
step=2;
counter+=step;
utf8string+=step;
wstrcpy((VMWCHAR*)ucs2_code++,(VMWCHAR*)(&temp1));
is_unrecognized=TRUE;
}
elseif(0xe0==(*utf8string&0xf0)&&
0x80==(*(utf8string+1)&0xc0)&&
0x80==(*(utf8string+2)&0xc0)
){
/*3bytesUTF-8Charater.*/
temp1=(VMUINT16)(*utf8string&0x0f);
temp1<<=12;
temp2=(VMUINT16)(*(utf8string+1)&0x3F);
temp2<<=6;
temp1=temp1|temp2|(VMUINT16)(*(utf8string+2)&0x3F);
step=3;
counter+=step;
utf8string+=step;
wstrcpy((VMWCHAR*)ucs2_code++,(VMWCHAR*)(&temp1));
is_unrecognized=TRUE;
}
else{
temp1=*((VMUINT8*)(utf8string));
wstrcpy((VMWCHAR*)ucs2_code++,(VMWCHAR*)&temp1);
is_unrecognized=TRUE;
utf8string++;
counter++;
}
}
returnis_unrecognized;
}
(2)转码后,在draw_IPtext()函数中完成结果显示,当全局标志位g_show_info的值为1时,表示结果解析成功,则显示结果,否则返回。
实现参考代码如下:
VMINTg_show_info=0;
VMCHARg_Result[500]={0};
voiddraw_IPtext(VMUINT8*buf)
{
VMWCHARs[100]={0};
if(g_show_info==1)
{
UTF8toUCS2Code(g_Result,s);
vm_graphic_textout(buf,50,130,s,wstrlen(s),VM_COLOR_BLUE);
}
if(0==g_show_info)
{
return;
}
}
4.7项目扩展
4.7.1要求
(1)仿照IPSearch软件,做一个QQ是否在线查询的软件
4.7.2实现思路
(1)利用www.提供的开放接口,仿照上述开发过程实现
(2)QQ在线查询的URL为:
“webservices/qqOnlineWebService.asmx/qqCheckOnline?
qqCode=”
5、项目总结报告
项目总结报告
项目名称
开发环境配置与搭建
项目组成员
完成情况
□全部完成□大部分完成
□少部分完成□没有思路
自我评分
代码规范度
项目中遇到的主要问题及解决办法
项目体会
自我评定
修改应用程序的图标和标题
界面设计及框架搭建
资源加载及UI界面绘制
网络连接
数据解析
结果显示