📄 http.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 + -