⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 http.c

📁 本程序是一个RS232转网口的。是一个透明传输的模块
💻 C
字号:
/*
*****************************************************************************************************
*
*  File name: http.c
*****************************************************************************************************
*/
#include "..\head\includes.h"



/*
*****************************************************************************************************
*FUNC:
*NOTE:  
*****************************************************************************************************
*/ 
unsigned char xdata *xdata ReplacePtr=NULL; 


/*
*****************************************************************************************************
*FUNC:
*NOTE:  
*****************************************************************************************************
*/ 
typedef struct _page_replace_
{
    unsigned char *tag;    //替换目标  
    unsigned char length;  //替换长度
}_PAGE_REPLACE_;


#define GET_REPLACE_ITEM  11     //上传WEB须替换个数,提示当前配置参数

_PAGE_REPLACE_  code GetPageReplace[GET_REPLACE_ITEM] =
{
    "GET-LOCALMAC",     12,
    "GET-LOCALIP0000",  15,
    "GET-SEVERIP0000",  15,
    "GET-SEVERPORT",    13,
    "GET-GATEWAYIP00",  15,
	"GET-MASKIP00000",  15,

    "GET-ID000000"   ,  12,
    "GET-BAUDRATE"   ,  12,
    "GET-HEARTTIME"  ,  13,
    "GET-DHCPMODE"   ,  12,      //自动指派模式,手动分配模式
	"GET-COMCBIT"    ,  11       //串口奇偶校验位
};

#define POST_REPLACE_ITEM  13    //POST WEB须替换个数,提示配置正常否

_PAGE_REPLACE_  code PostPageReplace[POST_REPLACE_ITEM] =
{
    "提交用户名"  ,          10,
    "提交密码"    ,          8,
    "提交网卡地址结果",      16,
    "提交模块IP地址结果",    18,
    "提交服务器IP地址结果",  20,
    "提交服务器端口结果",    18,
    "提交网关IP地址结果",    18,
	"提交子网掩码结果",      16,

    "提交模块ID结果",        14,
    "提交波特率结果",        14,
    "提交心跳间隔结果",      16,
	"提交IP分配模式结果",    18,
	"提交校验位结果",        14,
};

#define REPLACE_STATU_NUM  13
unsigned char xdata ReplaceStatu[REPLACE_STATU_NUM]; //X项是否已替换过.
bit ReplaceNewIp = FALSE;                            //新IP是否已替换
/*
*****************************************************************************************************
*FUNC:
*NOTE:  
*****************************************************************************************************
*/ 
#define GET_PAGE          		0
#define POST_PAGE				1
#define GET_JPEG             	2
#define NONE				    3


/*
*****************************************************************************************************
*FUNC: 寻找替换
*NOTE:  
*****************************************************************************************************
*/
void Replace_Loop(unsigned char xdata *body ,unsigned char request,unsigned int length)
{
    unsigned char i;

	if (request == GET_PAGE) {                                             //提交网页
	    for (i=0; i<GET_REPLACE_ITEM; i++) {                               //替换那些参数
		    if (ReplaceStatu[i] == 0) {                                    //未替换
		        if(ReplacePtr = StrCompare(body,GetPageReplace[i].tag,length)) {  //找到要替换的
				    ReplaceStatu[i] = 10;
					switch (i) {
                        case 1:       //本地IP
						     IpToStr(my_ip_address); //此时本地IP可能是手动分配,也可能是自动指派              
                             ReplaceTag(ReplacePtr,IpString,GetPageReplace[i].length);
						     break;
                        case 4:       //网关IP
						     IpToStr(gateway_ip_address);       
                             ReplaceTag(ReplacePtr,IpString,GetPageReplace[i].length);
						     break;
                        case 5:       //子网掩码IP
						     IpToStr(mask_ip_address);
                             ReplaceTag(ReplacePtr,IpString,GetPageReplace[i].length);
						     break;
                        case 7:       //波特率
						     ReplaceTag(ReplacePtr,pBaudRate[*ConfigRegPtr[i]-0x31],GetPageReplace[i].length);
						     break;
                        case 8:       //心跳包
						     ReplaceTag(ReplacePtr,pHeartTime[*ConfigRegPtr[i]-0x31],GetPageReplace[i].length);
						     break;
                        case 9:       //IP分配模式
						     ReplaceTag(ReplacePtr,pDhcpMode[*ConfigRegPtr[i]-0x30],GetPageReplace[i].length);
						     break;
                        case 10:      //校验位
						     ReplaceTag(ReplacePtr,pComcBit[*ConfigRegPtr[i]-0x30],GetPageReplace[i].length);
						     break;
   					    default:      //正文用字符串替代原先准备替换的标签 ;
						     ReplaceTag(ReplacePtr,ConfigRegPtr[i],GetPageReplace[i].length);
						     break;
					}
 			    }
			}                                                      
        }
		return;
	} 
		
	if (request == POST_PAGE) {
	    if (ReplaceNewIp == FALSE) {
            IpToStr(my_ip_address);                            //此时本地IP可能是手动分配,也可能是自动指派              
	        if (ReplacePtr = StrCompare(body,"REFRESHLOCALIP1",length)) {
                ReplaceTag(ReplacePtr,IpString,15);            //10秒刷新新IP
	        }
 
			#if 0
  	        if (ReplacePtr = StrCompare(body,"REFRESHLOCALIP2",length)) {
                ReplaceTag(ReplacePtr,IpString,15);            //10秒刷新新IP
	        }
			#endif

			//以下修改于07.10.31
			#if 1
			if (ReplacePtr = StrCompare(body,"REFRESHLOCALIP2",length)) {
                if (DHCPMode) {                             //自动分配,不受修改本地IP更新显示
                    ReplaceTag(ReplacePtr,IpString,15);     //10秒刷新新IP
	            } else {
                    ReplaceTag(ReplacePtr,ConfigReg.reg.LocalIpStr,15);//手动分配,更新显示IP修改
			    }
			}
			#endif
			ReplaceNewIp = TRUE;
		}
		for (i=0; i<POST_REPLACE_ITEM; i++) {                              //替换那些参数
		    if (ReplaceStatu[i] == 0) {                                    //未替换
				if (HttpAckCode[i] == VALUE_NULL) {                        //值为空不替换跳到下一个
			        ReplaceStatu[i] = 10;                                  //置为已替换处理过 
                    continue; 
			    }
		        if (ReplacePtr = StrCompare(body,PostPageReplace[i].tag,length)) { //找到要替换的
                    ReplaceStatu[i] = 10;
                    //if (HttpAckCode[i] == VALUE_NULL) {
                    //    ReplaceTag(ReplacePtr," ",PostPageReplace[i].length);
                    //} else 
                    ReplaceTag(ReplacePtr,ConfigAckMsg[HttpAckCode[i]],PostPageReplace[i].length); 
					if ((HttpAckCode[i] == USER_ERROR) || (HttpAckCode[i] == PASSWORD_ERROR)) {
 	                    for (; i<REPLACE_STATU_NUM; i++) {         //如果是密码或用户名错误,余下的不再替换              
                            ReplaceStatu[i] = 10;                          
	                    }                   
                        break;                                             
					}
 			    }
			}                                                      //正文用字符串替代原先准备替换的标签
        }
	}
}


/*
*****************************************************************************************************
*FUNC:
*NOTE:  
*****************************************************************************************************
*/
void HttpFunc(union netcard xdata *pRxdnet,unsigned char sock,unsigned int length)
{
    unsigned int  xdata body_len, hdr_len, page_len;
	unsigned char xdata body[1461];
	unsigned int  xdata i,sent,remaining;
	unsigned char xdata request;
	unsigned char code *xdata head[3];  //利用指针数组存放头部数据首地址
	unsigned char code *xdata page[3];  //利用指针数组存放网页正文数据首地址
	unsigned char count=0,ch=0;

	if (StrCompare(pRxdnet->tcpframe.tcpdata,"POST",length)) {
        request = POST_PAGE; 
		DebugMsg(45);
	} else if (StrCompare(pRxdnet->tcpframe.tcpdata,"GET",length) != NULL) {
        if (StrCompare(pRxdnet->tcpframe.tcpdata, "logo",length) != NULL) {
            request = GET_JPEG;
			DebugMsg(46);
	    } else if (StrCompare(pRxdnet->tcpframe.tcpdata, "index",length) != NULL) {
	        request = GET_PAGE;
			DebugMsg(47);
        } else if (StrCompare(pRxdnet->tcpframe.tcpdata, "/ ",length) != NULL) {
	        request = GET_PAGE;
			DebugMsg(47);
        } else {
	        request = GET_PAGE;
			DebugMsg(48);
	    }
	} else {
        return;
	}

	if (request > 2) {
        return;
	}

	if (request == POST_PAGE) {
        ParseHttpCmd(pRxdnet->tcpframe.tcpdata,length);  // 各ACK ID放在HttpAckCode[i]里  
	}

	head[0] = HtmlHeader;                         //request =0:Getpage
	head[1] = HtmlHeader;                         //request =1:Postpage 
	head[2] = JpegHeader;                         //request =2:GetJPG

	page[0] = WebPage;                            //request =0:Getpage

	if (RemoteRestart == REMOTE_RESTART_TRUE) {
	    page[1] = PostRstPage;                     //HTTP控制重启,提交重启页   
 	} else if (RemoteRestart == REMOTE_RESTART_FALSE){
        page[1] = PostRstErrorPage;
	} else {
        page[1] = PostPage;                        //request =1:Postpage
	}
	page[2] = Photo1Jpeg;                          //request =2:GetJPG

    hdr_len = strlen(head[request]);               // 头长度:119
    page_len = strlen(page[request]);              //页长度: 2223
	if (request == GET_JPEG) {
        page_len = 2267;//7680;                    //图片长度用strlen取会有问题
	}
    body_len = hdr_len + page_len;                 //总长度: 2342

    HexToDec(page_len);                            // 网页正文长度变成字符串Data_Length

	if (body_len > 1460) {
        remaining = 1460;
    } else {
        remaining = body_len;
    }

    for (i=0; i<remaining; i++) {
		if (i < hdr_len) {
            body[i] = *(head[request]+i);            //COPY头部
	    } else {
            body[i] = *(page[request]+i-hdr_len);    //copy正文 从0个开始
	    }
	}

	body[remaining]=0;                               //结束符


	for (i=0; i<REPLACE_STATU_NUM; i++) {            //替换前全清0,0:未替换,大于0:已替换
        ReplaceStatu[i] = 0;                         //替换一个后填大于1的值,否为0
	}
    ReplaceNewIp = FALSE;                            //替换刷新IP,置未替换

	if (ReplacePtr = StrCompare(body,"TAG:LEN1",length)) {
        ReplaceTag(ReplacePtr,Data_Length,8);        //正文长度用字符串替代原先准备替换的标签
	}
    	
	Replace_Loop(body,request,remaining);            //把当前的参数替换为网页内容上传显示

	//#ifdef _DEBUG_
	//    Uart0Putsl(body,remaining);
	//#endif

	conxn[sock].pUnAcked->bUsed     = FALSE;
    User_TCPSend(sock,body,remaining);
    conxn[sock].my_sequence+=remaining;            // 很重要哦
    sent = remaining-hdr_len;                      //sent=正文已发,remaining=现在正要发的

    while (sent < page_len) {                      //小于说明正文还有未发
	    count++;
		ch=count+0x30;
        remaining = page_len - sent;               //现在要发的
        if (remaining > 1460) {
			remaining = 1460;
        }

        for (i=0; i<remaining; i++) {
            body[i] = *(page[request]+i+sent);     //copy正文
		}

	    body[remaining]=0;                         //结束符

		Replace_Loop(body,request,remaining);      //替换,有些正文有分侦发送,反以这也要判断

        sent += remaining;
		conxn[sock].pUnAcked->bUsed     = FALSE;
        User_TCPSend(sock,body,remaining);
		conxn[sock].my_sequence+=remaining;        // 很重要哦   
    } 

	conxn[sock].pUnAcked->bUsed     = FALSE;       // 很重要哦 僻免重发	

    //发RST命令目的是,让浏览器每一次POST或GET都得从请求链接开始,牺牲时间
    tcp_send(&TCPSend,FLG_RST, 20, sock); 
	InerClose(sock);
    //=======================================================
	
	if (RemoteRestart == REMOTE_RESTART_TRUE) {
	    RemoteRestart = REMOTE_RESTART_IDEL;
		HintMsg(11,NULL);
        McuRst(SAVE_EXIT);	   
    }			
}

/*
*****************************************************************************************************
* 
*****************************************************************************************************
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -