MTK6226 GPRS HTTP PUT Method 开发文档
Author:huazjxy time:2007/04/27 company:huayu
1. 配置IIS 服务器支持 HTTP PUT方法。
具体操作如下:
可以自己在windows的IIS组件里添加IIS信息服务,操作时须插入windows安装盘。
安装好IIS服务器之后,再安装Perl,用MTK6226软件自带就行。
设置IIS Put Method
(1)IS信息服务,进入默认网站项,进入默认网站属性,将IP 地址,tcp端口设置如下:
(2)再进入主目录,设置好本地路径,一般为c:/inetpub/wwwroot,再将后面的脚本资源访问、读取、记录访问、索引资源、写入、目录浏览等全部勾上。
将下面的执行权限选为脚本和执行文件,默认为纯脚本。
(3)再进入执行权限后面的配置项:
如下图添加上perl脚本的相关配置:
将perl脚本的动作限制为OPTIONS,GET,HEAD,POST,PUT,DELETE,TRACE.再将所有类型的脚本的动作限制全部改为与perl相同的。
如果是XP的后,安装IIS后再安装上perl后,perl脚本项自动就加上去了(注意:必须perl安装在后才行)。
如果是windows2003 server除了把上面的配置完成后,还必须在“应用WEB服务扩展“里面将禁止未知脚本项打开。
(3)将IIS配置成可以匿名访问,如下:
(4)配置成功后,重新启动下IIS网站服务,再用iisputscannner工具查看下,如果看到PUT方法已打开,则设置成功。如下图:
2.关于Http Put Method 程序实现:
一共修改了三个文件,FileMgr.c,EngineerModeSocketDemoApp.c,EngineerModeSrc.c。
2.1、关于FileMgr.c的修改
先为gprs菜单写highlight函数如下:
一点击菜单,触发FMGR_ACTION_FWD_GPRS 动作。
void highlight_fmgr_to_gprs(void)
{
fmgr_p->tree_action = FMGR_ACTION_FWD_GPRS;
}
进入“传送请求处理“函数void fmgr_forward_to_app(void).修改如下:
增加了对传送到gprs的响应。
void fmgr_forward_to_app(void)
{
……//此处省略
switch (fmgr_p->tree_action)
{
case FMGR_ACTION_FWD_GPRS:
/* pass file name to GPRS Server */
/* hook gprs func */
phsetgprsForward(fmgr_p->file_path);
……//此处省略
}
……//此处省略
}
上面程序实现的功能是:当一按传送到GPRS键时,将文件的路径+文件名传递到函数
phsetgprsForward(fmgr_p->file_path),交给函数处理。
2.2关于EngineerModeSrc.c的修改
添加处理函数void phsetgprsForward(S8 *path) ,对传递过来的文件名进行处理,并进入下
一步的EntryEmHTTPURL( )函数,让用户输入URL地址(服务器地址)。
这个函数的功能是:
先将当前的SocketAppType(套.接字申请类型)设置为HTTP_PUT方法。
再将文件名以unicode码的形式拷贝到soc_demo_gprs->filename(结构体里的数组里去),
记住此处不能够用指针,因为指向结构体的指针是分配在堆上的动态指针,可能会导致指针
地址所保存的数据部分丢失。
注意:必须用unicode码因为FS_Open()函数只认unicode码,否则将打不开文件。
void phsetgprsForward(S8 *path)
{
currentSocketAppType =HTTP_PUT;//Put Method.
if(soc_demo_gprs==NULL)
soc_demo_gprs=OslMalloc(sizeof(soc_demo_app_transaction_struct));
/*copy the path to soc_demo_gprs->filename as unicode format*/
pfnUnicodeStrcpy((S8*)soc_demo_gprs->filename,path);
EntryEmHTTPURL();
}
接下来将里面原有的HTTP请求方法,改为HTTP_PUT和HTTP_GET两种方法,在发送
Request请求时,增加对HTTP_PUT请求的处理:
void EmSocketSendReq(void)
{
……
/*add by huazjxy 07/04/27*/
if(currentSocketAppType == HTTP_PUT)
{
UnicodeToAnsii(emSocketInputdata, EmSocketInputBuff);//将URL地址转换成Ansii码.
}
else if(currentSocketAppType==HTTP_GET)
//
else if(currentSocketAppType==HTTP_PUT)
// 将 HTTP_PUT 请求以及文件名 soc_demo_gprs->filename 打入到 mmi_soc_demo_app_request() 函数中。}
void mmi_soc_demo_app_request(S8*path)函数主要增加了发送http_send_http_Put_request();
(将HTTP_PUT的协议头和数据发送给服务器的函数)。
void mmi_soc_demo_app_request(S8*path){
……/* copy the path to soc_demo_transcation->filename as unicode format */ pfnUnicodeStrcpy((S8*)soc_demo_transaction->filename,path);
//将传递过来的文件路径以unicode format保存起来
switch(app_id){
case HTTP_PUT://HTTP_PUT add by huazjxy 07/04/27
{
return en_soc_demo_http_send_Put_request();//add by huazjxy 07/04/27
}
case HTTP_GET://HTTP_GET add by huazjxy 07/04/27
{
return en_soc_demo_http_send_Get_request();//add by huazjxy 07/04/27
}
}……
}
2.3 EngineerModeSocketDemoApp.c的修改
增加http_send_Put_request()函数,即向服务器发送http_put请求以及数据的函数,也是整个
程序设计的关键所在。
Void en_soc_demo_http_send_Put_request(void){
……//此处省略
//打开文件,将文件读入data ,data为1024 byte大小的buffer中。
/*open the file and get the size of the file */
fd = FS_Open((U16*)soc_demo_transaction->filename, FS_READ_ONLY );
FS_GetFileSize(fd,&file_size);
FS_Read(fd, data, FS_PUT_SIZE, (UINT*)&size );/* the end */
/*send http_put_request headers*///格式如下:头+数据
……//soc_connect( )连接。
……//soc_send( )发送数据。
……//校验
if(ret==SOC_WOULDBLOCK){//waits for socket notifySetProtocolEventHandler(em_soc_demo_app_socket_notify,MSG_ID_APP_SOC_NOTIFY_IND);return EN_SOC_SUCCESS;}
……}