diff --git a/APP_Framework/Applications/app_test/test_webserver/README.md b/APP_Framework/Applications/app_test/test_webserver/README.md index abcc45362..fe0461c4e 100644 --- a/APP_Framework/Applications/app_test/test_webserver/README.md +++ b/APP_Framework/Applications/app_test/test_webserver/README.md @@ -1,24 +1,67 @@ -# 基于cortex-m3-emulator实现哈希表并测试验证## +# 基于矽璓已实现的Lwip,在ARM上实现基本的Web服务## ## 1. 简介 - +基于矽璓已实现的Lwip,在ARM上实现基本的Web服务,其功能支持IP、GateWay、DNS、子网掩码等网络参数的设置。 +主要功能为:web服务等待Http请求的到来,解析Http报文后,设置本机的网络参数信息,在终端打印设置后的网络参数信息,并返回浏览器客户端成功响应。 ## 2. 数据结构设计说明 +Server的网络结构参数为: +``` +struct ServerNet +{ + char local_ip[20]; + char local_mask[20]; + char local_gw[20]; + char local_dns[20]; +}ServerNet; +``` +主要实现了以下几个函数: +``` +TcpThread: 建立socket监听,循环等待网络通信事件的到来; +HandleHttpRequest:处理并解析Http报文,得到网络参数信息; +AddrUpdate: 根据到来的参数,更新本机网络参数; +LwipShowIP:显示网络参数信息,包括IP、GateWay、DNS、子网掩码; +LwipSetIP: 设置网络参数信息,包括IP、GateWay、DNS、子网掩码; +ShowDns: 显示dns网址; +SetDns: 设置dns网址; +``` +除此之外,还包括两个工具函数: +``` +SubstractServerNet: 截取http报文的请求体,格式为:ip=192.168.1.9&netmask=255.255.255.0&iproute=192.168.1.1&dns=114.114.114.114 +substring: 截取字符串 + +``` ## 3. 测试程序说明 - +1. 通过数据线将开发板连接电脑,并通过网线连接使开发板接入家庭局域网。 +2. 将TestWebserver注册为shell 命令,编译前通过menuconfig打开lwip和TestWebserver功能。 +3. 将编译成功的XiZi-edu-arm32.bin文件烧录到arm板子。烧录bin文件前,需要将开发板boot引脚拉高(盖上跳帽),上电后再按下reset按键,之后可以点击烧写工具的执行按钮,等待烧写完成。 +4. 将boot引脚拉低(摘下跳帽),按下reset按键,使用串口工具显示xiuos的命令行界面。 +5. 将开发板的本机ip通过setip命令设置为与电脑端在同一个局域网之下,利用ping命令检测成功通信。 +6. 运行TestWebserver命令验证功能。 ## 4. 运行结果(##需结合运行测试截图按步骤说明##) -![image](ConfigOpen.png) -打开menuconfig之后,将test_hash_map开启(y),保存后退出 + -![image](CompileSuccess.png) -编译XiZi-cortex-m3-emulator.elf成功 +烧录程序,boot引脚拉高,按下reset按键。 -![image](ShellCommand.png) -启动qemu模拟Xiuos操作系统,验证TestHash注册Shell命令 + -![image](TestHash.png) -执行TestHash命令,打印测试结果。 +点击执行烧录,程序烧录成功。 + + +打开串口调试工具,xiuos程序成功在开发板上运行。 + + + +利用setip命令,修改开发板ip,使得开发板和电脑在同一个局域网内,并使用ping命令测试。 + + + +在服务端运行TestWebserver命令,打开index.html,设置网络参数信息,点击提交,发送http请求。 + + + +web服务收到http请求后并打印post请求报文,以及修改后的开发板的网络参数信息,包括IP、子网掩码、GateWay和DNS。 diff --git a/APP_Framework/Applications/app_test/test_webserver/index.html b/APP_Framework/Applications/app_test/test_webserver/index.html new file mode 100644 index 000000000..d0514189a --- /dev/null +++ b/APP_Framework/Applications/app_test/test_webserver/index.html @@ -0,0 +1,33 @@ + + + + + 表单 + + + + +
+

设置路由信息

+ + +

IP地址:

+

子网掩码:

+

默认网关:

+

DNS服务器

+

+ + +

+ +
+ + + diff --git a/APP_Framework/Applications/app_test/test_webserver/photos/1.png b/APP_Framework/Applications/app_test/test_webserver/photos/1.png new file mode 100644 index 000000000..2c3980afd Binary files /dev/null and b/APP_Framework/Applications/app_test/test_webserver/photos/1.png differ diff --git a/APP_Framework/Applications/app_test/test_webserver/photos/2.png b/APP_Framework/Applications/app_test/test_webserver/photos/2.png new file mode 100644 index 000000000..e2fc46ebd Binary files /dev/null and b/APP_Framework/Applications/app_test/test_webserver/photos/2.png differ diff --git a/APP_Framework/Applications/app_test/test_webserver/photos/3.png b/APP_Framework/Applications/app_test/test_webserver/photos/3.png new file mode 100644 index 000000000..0db94c2f8 Binary files /dev/null and b/APP_Framework/Applications/app_test/test_webserver/photos/3.png differ diff --git a/APP_Framework/Applications/app_test/test_webserver/photos/4.png b/APP_Framework/Applications/app_test/test_webserver/photos/4.png new file mode 100644 index 000000000..7f337458a Binary files /dev/null and b/APP_Framework/Applications/app_test/test_webserver/photos/4.png differ diff --git a/APP_Framework/Applications/app_test/test_webserver/photos/5.png b/APP_Framework/Applications/app_test/test_webserver/photos/5.png new file mode 100644 index 000000000..85ab2f41e Binary files /dev/null and b/APP_Framework/Applications/app_test/test_webserver/photos/5.png differ diff --git a/APP_Framework/Applications/app_test/test_webserver/photos/6.png b/APP_Framework/Applications/app_test/test_webserver/photos/6.png new file mode 100644 index 000000000..37b6e162f Binary files /dev/null and b/APP_Framework/Applications/app_test/test_webserver/photos/6.png differ diff --git a/APP_Framework/Applications/app_test/test_webserver/test_webserver.c b/APP_Framework/Applications/app_test/test_webserver/test_webserver.c index 33c0b75ac..a5f15f2c1 100644 --- a/APP_Framework/Applications/app_test/test_webserver/test_webserver.c +++ b/APP_Framework/Applications/app_test/test_webserver/test_webserver.c @@ -11,46 +11,22 @@ #include "test_webserver.h" /**设置ip,网关,子网掩码这部分参考lwip_config_demo.c*/ -uint8_t enet_idd = 0; - void LwipShowIP() { -#ifdef configMAC_ADDR - char mac_addr0[] = configMAC_ADDR; -#endif - - //打印出来 lwip_eth0_ipaddr + // find default netdev lw_notice("\r\n************************************************\r\n"); lw_notice(" Network Configuration\r\n"); lw_notice("************************************************\r\n"); - lw_notice(" ETH0 IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth0_ipaddr)[0], ((u8_t *)&lwip_eth0_ipaddr)[1], - ((u8_t *)&lwip_eth0_ipaddr)[2], ((u8_t *)&lwip_eth0_ipaddr)[3]); - lw_notice(" ETH0 IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth0_netmask)[0], ((u8_t *)&lwip_eth0_netmask)[1], - ((u8_t *)&lwip_eth0_netmask)[2], ((u8_t *)&lwip_eth0_netmask)[3]); - lw_notice(" ETH0 IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_gwaddr)[0], ((u8_t *)&lwip_eth0_gwaddr)[1], - ((u8_t *)&lwip_eth0_gwaddr)[2], ((u8_t *)&lwip_eth0_gwaddr)[3]); -#ifdef configMAC_ADDR - lw_notice(" ETH0 MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr0[0], mac_addr0[1], mac_addr0[2], - mac_addr0[3], mac_addr0[4], mac_addr0[5]); -#endif -#ifdef BOARD_NET_COUNT - if(BOARD_NET_COUNT > 1) - { - char mac_addr1[] = configMAC_ADDR_ETH1; - lw_notice("\r\n"); - lw_notice(" ETH1 IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth1_ipaddr)[0], ((u8_t *)&lwip_eth1_ipaddr)[1], - ((u8_t *)&lwip_eth1_ipaddr)[2], ((u8_t *)&lwip_eth1_ipaddr)[3]); - lw_notice(" ETH1 IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth1_netmask)[0], ((u8_t *)&lwip_eth1_netmask)[1], - ((u8_t *)&lwip_eth1_netmask)[2], ((u8_t *)&lwip_eth1_netmask)[3]); - lw_notice(" ETH1 IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t *)&lwip_eth1_gwaddr)[0], ((u8_t *)&lwip_eth1_gwaddr)[1], - ((u8_t *)&lwip_eth1_gwaddr)[2], ((u8_t *)&lwip_eth1_gwaddr)[3]); - lw_notice(" ETH1 MAC Address : %x:%x:%x:%x:%x:%x\r\n", mac_addr1[0], mac_addr1[1], mac_addr1[2], - mac_addr1[3], mac_addr1[4], mac_addr1[5]); - } -#endif + lw_notice(" ETH0 IPv4 Address : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_eth0_ipaddr)[0], ((u8_t*)&lwip_eth0_ipaddr)[1], + ((u8_t*)&lwip_eth0_ipaddr)[2], ((u8_t*)&lwip_eth0_ipaddr)[3]); + lw_notice(" ETH0 IPv4 Subnet mask : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_eth0_netmask)[0], ((u8_t*)&lwip_eth0_netmask)[1], + ((u8_t*)&lwip_eth0_netmask)[2], ((u8_t*)&lwip_eth0_netmask)[3]); + lw_notice(" ETH0 IPv4 Gateway : %u.%u.%u.%u\r\n", ((u8_t*)&lwip_gwaddr)[0], ((u8_t*)&lwip_eth0_gwaddr)[1], + ((u8_t*)&lwip_eth0_gwaddr)[2], ((u8_t*)&lwip_eth0_gwaddr)[3]); lw_notice("************************************************\r\n"); } +uint8_t enet_idd = 0; void LwipSetIP(int argc, char *argv[]) { if(argc >= 4) @@ -87,29 +63,82 @@ void LwipSetIP(int argc, char *argv[]) lwip_config_net(enet_idd, lwip_ipaddr, lwip_netmask, lwip_gwaddr); } +void ShowDns(){ + const ip_addr_t *dns = dns_getserver(0); + char *dns_ip = ipaddr_ntoa(dns); + printf("lw: eth0 dns is %s \n", dns_ip); +} + +void SetDns(char* ip){ + ip_addr_t dns; + ipaddr_aton(ip, &dns); + dns_setserver(0, &dns); + printf("ETH0 Set DNS Success!\n"); +} + void AddrUpdate() { - char * local_ip = "192.168.1.10"; - char * local_mask="255.255.255.0"; - char * local_gw = "192.168.1.1"; - char * port= "0"; - char *argv[5]; - argv[1] = local_ip; - argv[2] = local_mask; - argv[3] = local_gw; - argv[4] = port; + argv[1] = ServerNet.local_ip; + argv[2] = ServerNet.local_mask; + argv[3] = ServerNet.local_gw ; + argv[4] = 0; LwipSetIP(4, argv); - + LwipShowIP(); + SetDns(ServerNet.local_dns); + ShowDns(); +} + +char *substring(char *dst,char *src,int start,int len) +{ + char *p=dst; + char *q=src; + int length=strlen(src); + if(start>=length||start<0) + return NULL; + if(len>length) + len=length-start; + q+=start; + while(len--) + { + *(p++)=*(q++); + } + *(p++)='\0'; + return dst; +} + +void SubstractServerNet(char * params){ + char *p =params; + p +=3; + char *end = strchr(p, '&'); + int len = (int)(end-p); + substring(ServerNet.local_ip, p, 0,len); + p +=len; + p += 9; + end = strchr(p, '&'); + len = (int)(end-p); + substring(ServerNet.local_mask , p, 0, len); + p +=len; + p +=9; + end = strchr(p, '&'); + len = (int)(end-p); + substring(ServerNet.local_gw, p, 0, len); + p +=len; + p += 5; + strcpy(ServerNet.local_dns, p); } -//设置socket -//循环监听socket并修改ip,单线程 +void HandleHttpRequest(char *params){ + SubstractServerNet(params); + AddrUpdate(); //修改本机参数信息; +} -static void tcpecho_thread(void *arg){ +//设置socket +//循环监听socket并修改网络信息,单线程 +void tcpecho_thread(){ int sock=-1, connected; - char *recv_data ; + char *recv_data; struct sockaddr_in server_addr, client_addr; socklen_t sin_size; int recv_data_len; @@ -161,12 +190,17 @@ static void tcpecho_thread(void *arg){ recv_data_len = recv(connected, recv_data, RECV_DATA, 0); - printf("recv %d len data\n",recv_data_len); recv_data[recv_data_len] = '\0'; - - // write(connected,recv_data,recv_data_len); printf("%s\n", recv_data); + + char * params = strstr(recv_data, "ip="); + HandleHttpRequest(params); + + char *response = "HTTP/1.1 200 OK\r\n" + "Content-Type: application/x-www-form-urlencoded\r\n" + "\r\n"; + write(connected,response,strlen(response)); if (connected >= 0) closesocket(connected); @@ -178,8 +212,7 @@ static void tcpecho_thread(void *arg){ } void TestWebserver(){ - AddrUpdate(); - LwipShowIP(); + tcpecho_thread(); } PRIV_SHELL_CMD_FUNCTION(TestWebserver, Implement web_server, PRIV_SHELL_CMD_MAIN_ATTR); \ No newline at end of file diff --git a/APP_Framework/Applications/app_test/test_webserver/test_webserver.h b/APP_Framework/Applications/app_test/test_webserver/test_webserver.h index 172efd4f0..105ff13c7 100644 --- a/APP_Framework/Applications/app_test/test_webserver/test_webserver.h +++ b/APP_Framework/Applications/app_test/test_webserver/test_webserver.h @@ -17,9 +17,27 @@ #include "netif/ethernet.h" #include "lwip/tcpip.h" #include "sys_arch.h" +#include +#include "dns.h" +#include "string.h" + #define PORT 80 -#define RECV_DATA (1024) +#define RECV_DATA 1024 +struct ServerNet +{ + char local_ip[20]; + char local_mask[20]; + char local_gw[20]; + char local_dns[20]; +}ServerNet; +void LwipShowIP(); +void LwipSetIP(int argc, char *argv[]); +void ShowDns(); +void SetDns(); +void AddrUpdate(); //更新本机网络参数信息 +void HandleHttpRequest(); //解析报文,并返回响应 +void TcpThread();//建立socket监听,循环等待网络通信事件到来 #endif \ No newline at end of file