用户工具

站点工具


lan_http实验_网页服务器

差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
lan_http实验_网页服务器 [2020/07/09 09:26]
zgf
lan_http实验_网页服务器 [2022/03/22 10:23] (当前版本)
sean
行 2: 行 2:
 |技术支持电话|**0379-69926675-801**||| |技术支持电话|**0379-69926675-801**|||
 |技术支持邮件|Gingko@vip.163.com||| |技术支持邮件|Gingko@vip.163.com|||
-|技术论坛|http://​www.eeschool.org||| 
 ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^ ^  版本 ​ ^  日期 ​ ^  作者 ​ ^  修改内容 ​ ^
 |  V1.0  |  2020-07-09 |  gingko ​ |  初次建立 ​ |  |  V1.0  |  2020-07-09 |  gingko ​ |  初次建立 ​ | 
行 16: 行 15:
 ==== 二、 实验设备及平台 ==== ==== 二、 实验设备及平台 ====
  
-  - iCore4 双核心板。 +  - iCore4 双核心板[[https://​item.taobao.com/​item.htm?​spm=a1z10.1-c-s.w4004-22598974120.15.5923532fsFrHiE&​id=551864196684|点击购买]]。 
-  - JLINK(或相同功能)仿真器。+  - JLINK(或相同功能)仿真器[[https://​item.taobao.com/​item.htm?​id=554869837940|点击购买]]
   - Micro USB线缆。   - Micro USB线缆。
   - 网线。   - 网线。
行 36: 行 35:
   * BSD API提供了基于open-read-write-close模型的UNIX标准API,它的最大特点是使应用程序移植到其它系统时比较容易,但用在嵌入式系统中效率比较低,占用资源多。这对于我们的嵌入式应用有时是不能容忍的。   * BSD API提供了基于open-read-write-close模型的UNIX标准API,它的最大特点是使应用程序移植到其它系统时比较容易,但用在嵌入式系统中效率比较低,占用资源多。这对于我们的嵌入式应用有时是不能容忍的。
   * 其主要特性如下: ​   * 其主要特性如下: ​
-    ​* (1) 支持多网络接口下的IP转发; +    ​支持多网络接口下的IP转发; 
-    ​* (2) 支持ICMP协议; +    ​支持ICMP协议; 
-    ​* (3) 包括实验性扩展的UDP(用户数据报协议); +    ​包括实验性扩展的UDP(用户数据报协议); 
-    ​* (4) 包括阻塞控制、RTT 估算、快速恢复和快速转发的TCP(传输控制协议); +    ​包括阻塞控制、RTT 估算、快速恢复和快速转发的TCP(传输控制协议); 
-    ​* (5) 提供专门的内部回调接口(Raw API),用于提高应用程序性能; +    ​提供专门的内部回调接口(Raw API),用于提高应用程序性能; 
-    ​* (6) 可选择的Berkeley接口API (在多线程情况下使用) ; +    ​可选择的Berkeley接口API (在多线程情况下使用) ; 
-    ​* (7) 在最新的版本中支持ppp; +    ​在最新的版本中支持ppp; 
-    ​* (8) 新版本中增加了的IP fragment的支持; +    ​新版本中增加了的IP fragment的支持; 
-    ​* (9) 支持DHCP协议,​动态分配ip地址。 +    ​支持DHCP协议,​动态分配ip地址。 
-  ​* ​2、HTTP简介+=== 2、HTTP简介 ​=== 
   * HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,​是用于从万维网(WWW:​World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/​IP通信协议来传递数据(HTML文件,​图片文件,​查询结果等)。   * HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,​是用于从万维网(WWW:​World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/​IP通信协议来传递数据(HTML文件,​图片文件,​查询结果等)。
   * HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/​1.0的第六版,HTTP/​1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。   * HTTP是一个属于应用层的面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW中使用的是HTTP/​1.0的第六版,HTTP/​1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
行 55: 行 55:
     * (4)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。     * (4)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
     * (5)支持B/​S及C/​S模式。     * (5)支持B/​S及C/​S模式。
-  * 3、LAN8720A简介+=== 3、LAN8720A简介 ​=== 
   * LAN8720A是低功耗的10/​100M以太网PHY层芯片,I/​O引脚电压符合IEEE802.3-2005标准,支持通过RMII接口与以太网MAC层通信,内置10-BASE-T/​100BASE-TX全双工传输模块,支持10Mbps和100Mbps。   * LAN8720A是低功耗的10/​100M以太网PHY层芯片,I/​O引脚电压符合IEEE802.3-2005标准,支持通过RMII接口与以太网MAC层通信,内置10-BASE-T/​100BASE-TX全双工传输模块,支持10Mbps和100Mbps。
   * LAN8720A可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式),支持HPAuto-MDIX自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。LAN8720A的主要特点如下:   * LAN8720A可以通过自协商的方式与目的主机最佳的连接方式(速度和双工模式),支持HPAuto-MDIX自动翻转功能,无需更换网线即可将连接更改为直连或交叉连接。LAN8720A的主要特点如下:
-  ​*  高性能的10/​100M以太网传输模块 +    ​*  高性能的10/​100M以太网传输模块 
-  *  支持RMII接口以减少引脚数 +    *  支持RMII接口以减少引脚数 
-  *  支持全双工和半双工模式 +    *  支持全双工和半双工模式 
-  *  两个状态LED输出 +    *  两个状态LED输出 
-  *  可以使用25M晶振以降低成本 +    *  可以使用25M晶振以降低成本 
-  *  支持自协商模式 +    *  支持自协商模式 
-  *  支持HPAuto-MDIX自动翻转功能 +    *  支持HPAuto-MDIX自动翻转功能 
-  *  支持SMI串行管理接口 +    *  支持SMI串行管理接口 
-  *  支持MAC接口 +    *  支持MAC接口 
-  * LAN8720A功能框图如下图所示:+    * LAN8720A功能框图如下图所示:
 {{ :​icore4:​icore4_arm_hal_23_1.png?​direct |}}  {{ :​icore4:​icore4_arm_hal_23_1.png?​direct |}} 
 === 4、原理图 === === 4、原理图 ===
行 79: 行 80:
 int main(void) int main(void)
 {    {   
-    system_clock.initialize(); ​    ​//​系统时钟初始化+    system_clock.initialize(); ​     //​系统时钟初始化
     led.initialize(); ​              //​LED初始化     led.initialize(); ​              //​LED初始化
     adc.initialize(); ​              //​ADC初始化     adc.initialize(); ​              //​ADC初始化
-    delay.initialize(216); ​        ​//​延时初始化 +    delay.initialize(216); ​         //​延时初始化 
-    my_malloc.initialize(SRAMIN); ​    ​//​动态内存初始化 +    my_malloc.initialize(SRAMIN); ​  ​//​动态内存初始化 
-    usart6.initialize(115200); ​       //​串口波特设置 +    usart6.initialize(115200); ​     //​串口波特设置 
-    usart6.printf("​\033[1;​32;​40m"​); ​  ​//​设置字体终端为绿色+    usart6.printf("​\033[1;​32;​40m"​);​ //​设置字体终端为绿色
     usart6.printf("​\r\nHello,​ I am iCore4!\r\n\r\n"​); ​   //​串口信息输出 ​     usart6.printf("​\r\nHello,​ I am iCore4!\r\n\r\n"​); ​   //​串口信息输出 ​
  
     OSInit(); ​                        //​UCOS初始化     OSInit(); ​                        //​UCOS初始化
     ​     ​
-    while(lwip.initialize()) ​        ​//​lwip初始化+    while(lwip.initialize()) ​         //​lwip初始化
     {     {
      ​LED_RED_ON;​      ​LED_RED_ON;​
         usart6.printf("​\r\nETH initialize error!\r\n\r\n"​);//​ETH初始化失败         usart6.printf("​\r\nETH initialize error!\r\n\r\n"​);//​ETH初始化失败
     }     }
-  web.initialize(); ​              ​//​modbus_tcp初始化+  web.initialize(); ​                  ​//​modbus_tcp初始化
  
     OSTaskCreate(start_task,​(void*)0,​(OS_STK*)&​START_TASK_STK[START_STK_SIZE-1],​START_TASK_PRIO);​     OSTaskCreate(start_task,​(void*)0,​(OS_STK*)&​START_TASK_STK[START_STK_SIZE-1],​START_TASK_PRIO);​
-    OSStart(); ​                    ​//​开启UCOS ​  +    OSStart(); ​                       //​开启UCOS ​  
 } }
    
行 108: 行 109:
 {  ​ {  ​
     mymemset(mallco_dev.memmap[memx],​0,​memtblsize[memx]*4);​ //​内存状态表数据清零  ​     mymemset(mallco_dev.memmap[memx],​0,​memtblsize[memx]*4);​ //​内存状态表数据清零  ​
-     ​mallco_dev.memrdy[memx]=1; ​               //​内存管理初始化OK  ​+     ​mallco_dev.memrdy[memx]=1; ​     //​内存管理初始化OK  ​
  
    
行 123: 行 124:
     OS_CPU_SR cpu_sr;     OS_CPU_SR cpu_sr;
     struct netif *Netif_Init_Flag; ​     //​调用netif_add()函数时的返回值,​用于判断网络初始化是否成功     struct netif *Netif_Init_Flag; ​     //​调用netif_add()函数时的返回值,​用于判断网络初始化是否成功
-    struct ip_addr ipaddr; ​                 //​ip地址 +    struct ip_addr ipaddr; ​             //​ip地址 
-    struct ip_addr netmask; ​                 //​子网掩码 +    struct ip_addr netmask; ​            ​//​子网掩码 
-    struct ip_addr gw;                     ​//​默认网关  +    struct ip_addr gw;                  //​默认网关  
-    if(lan8720.memory_malloc())return 1;   ​//​内存申请失败 +    if(lan8720.memory_malloc())return 1;//​内存申请失败 
-if(lwip_comm_mem_malloc())return 1;   ​//​内存申请失败 +if(lwip_comm_mem_malloc())return 1;     ​//​内存申请失败 
-    if(lan8720.initialize())return 2;     ​//​初始化LAN8720失败  +    if(lan8720.initialize())return 2;   ​//​初始化LAN8720失败  
-    tcpip_init(NULL,​NULL); ​       //​初始化tcp ip内核,​该函数里面会创建tcpip_thread内核任务+    tcpip_init(NULL,​NULL); ​             //​初始化tcp ip内核,​该函数里面会创建tcpip_thread内核任务
     lwip_comm_default_ip_set(&​lwipdev);​ //​设置默认IP等信息     lwip_comm_default_ip_set(&​lwipdev);​ //​设置默认IP等信息
-#if LWIP_DHCP ​   //​使用动态IP+#if LWIP_DHCP ​                          ​//​使用动态IP
     ipaddr.addr = 0;     ipaddr.addr = 0;
     netmask.addr = 0;     netmask.addr = 0;
行 139: 行 140:
     IP4_ADDR(&​netmask,​lwipdev.netmask[0],​lwipdev.netmask[1] ,​lwipdev.netmask[2],​lwipdev.netmask[3]);​     IP4_ADDR(&​netmask,​lwipdev.netmask[0],​lwipdev.netmask[1] ,​lwipdev.netmask[2],​lwipdev.netmask[3]);​
     IP4_ADDR(&​gw,​lwipdev.gateway[0],​lwipdev.gateway[1],​lwipdev.gateway[2],​lwipdev.gateway[3]);​     IP4_ADDR(&​gw,​lwipdev.gateway[0],​lwipdev.gateway[1],​lwipdev.gateway[2],​lwipdev.gateway[3]);​
-    usart6.printf("​网卡en的MAC地址为:​................%d.%d.%d.%d.%d.%d\r\n",​lwipdev.mac[0],​lwipdev.mac[1],​lwipdev.mac[2],​lwipdev.mac[3],​lwipdev.mac[4],​lwipdev.mac[5]);​ +    usart6.printf("​网卡en的MAC地址为:​.......%d.%d.%d.%d.%d.%d\r\n",​lwipdev.mac[0],​lwipdev.mac[1],​lwipdev.mac[2],​lwipdev.mac[3],​lwipdev.mac[4],​lwipdev.mac[5]);​ 
-    usart6.printf("​静态IP地址........................%d.%d.%d.%d\r\n",​lwipdev.ip[0],​lwipdev.ip[1],​lwipdev.ip[2],​lwipdev.ip[3]);​ +    usart6.printf("​静态IP地址...%d.%d.%d.%d\r\n",​lwipdev.ip[0],​lwipdev.ip[1],​lwipdev.ip[2],​lwipdev.ip[3]);​ 
-    usart6.printf("​子网掩码..........................%d.%d.%d.%d\r\n",​lwipdev.netmask[0],​lwipdev.netmask[1],​lwipdev.netmask[2],​lwipdev.netmask[3]);​ +    usart6.printf("​子网掩码...%d.%d.%d.%d\r\n",​lwipdev.netmask[0],​lwipdev.netmask[1],​lwipdev.netmask[2],​lwipdev.netmask[3]);​ 
-    usart6.printf("​默认网关..........................%d.%d.%d.%d\r\n",​lwipdev.gateway[0],​lwipdev.gateway[1],​lwipdev.gateway[2],​lwipdev.gateway[3]);​+    usart6.printf("​默认网关...%d.%d.%d.%d\r\n",​lwipdev.gateway[0],​lwipdev.gateway[1],​lwipdev.gateway[2],​lwipdev.gateway[3]);​
 #​endif ​  ​Netif_Init_Flag=netif_add(&​lwip_netif,&​ipaddr,&​netmask,&​gw,​NULL,&​ethernetif_init,&​tcpip_input);//​向网卡列表中添加一个网口 #​endif ​  ​Netif_Init_Flag=netif_add(&​lwip_netif,&​ipaddr,&​netmask,&​gw,​NULL,&​ethernetif_init,&​tcpip_input);//​向网卡列表中添加一个网口
 #if LWIP_DNS ​   #if LWIP_DNS ​  
行 165: 行 166:
     OS_CPU_SR cpu_sr;     OS_CPU_SR cpu_sr;
     ​     ​
-    OS_ENTER_CRITICAL(); ​   //​关中断 +    OS_ENTER_CRITICAL(); ​  ​//​关中断 
-    res = OSTaskCreate(http_server_netconn_thread,​(void*)0,​(OS_STK*)&​WEB_TASK_STK[WEB_STK_SIZE-1],​WEB_PRIO);​ //​创建TCP服务器线程+    res = OSTaskCreate(http_server_netconn_thread,​(void*)0,​(OS_STK*)&​WEB_TASK_STK[WEB_STK_SIZE-1],​WEB_PRIO); ​             //​创建TCP服务器线程
     OS_EXIT_CRITICAL(); ​   //开中断     OS_EXIT_CRITICAL(); ​   //开中断
     ​     ​
行 199: 行 200:
             return;             return;
         }         }
-        listen(httpsock,​ 5);      //​在socket上进行监听+        listen(httpsock,​ 5);               ​//​在socket上进行监听
         size = sizeof(remotehost);​         size = sizeof(remotehost);​
   while(1)   while(1)
行 206: 行 207:
             ​             ​
         if(httpconn >= 0){          if(httpconn >= 0){ 
-            http_server_serve(httpconn); ​         //​处理连接+            http_server_serve(httpconn); ​   //​处理连接
         }else{         }else{
             close(httpconn);​             close(httpconn);​
行 224: 行 225:
     unsigned short int send_len = 0;     unsigned short int send_len = 0;
     char* name; //​获取方法请求文件名     char* name; //​获取方法请求文件名
-    ret = read(httpcon,​ recv_buffer,​ 1500); ​  ​//​提取http数据请求  ​+    ret = read(httpcon,​ recv_buffer,​ 1500); ​      ​//​提取http数据请求  ​
     st_http_request *http_request;​     st_http_request *http_request;​
     memset(tx_buf,​0x00,​MAX_URI_SIZE);​     memset(tx_buf,​0x00,​MAX_URI_SIZE);​
行 293: 行 294:
 ==== 附录: ==== ==== 附录: ====
  
-1、打开控制面板—→网络和Internet—→网络和共享中心—→更改适配器设置—→以太网—→属性+1、打开控制面板—→网络和Internet—→网络和共享中心—→更改适配器设置—→以太网—→属性
 {{ :​icore4:​icore4_arm_hal_23_4.png?​direct |}}  {{ :​icore4:​icore4_arm_hal_23_4.png?​direct |}} 
-2、Internet协议版本4选择使用下面的IP地址(如下图所示),然后更改IP地址和默认网关+2、Internet协议版本4选择使用下面的IP地址(如下图所示),然后更改IP地址和默认网关
 {{ :​icore4:​icore4_arm_hal_23_5.png?​direct |}}  {{ :​icore4:​icore4_arm_hal_23_5.png?​direct |}} 
  
  
lan_http实验_网页服务器.1594258017.txt.gz · 最后更改: 2020/07/09 09:26 由 zgf