精华内容
下载资源
问答
  • 基于STM32F429+LWIP,整合webserver\tcp client \ping功能三合一 使用了外部SDRAM,上电时即需插入网线,否则会检测失败,在netif_set_up/down函数中, 可自行修改代码,以符合应用需求。 针对标准库不能兼容一个...
  • 基于stm32f407+lwipweb server,可网页配置设备参数
  • lwip http server

    千次阅读 2019-03-29 19:08:32
    在做web配网的时需要一个http server网上搜了下lwip有提供http server,下面记录下使用怎么使用和使用过程中遇到的问题 开始移植 网上找了些资料发现下面网址讲的比较好,介绍了cgi,ssi和移植方法,这里我再整理下 ...
    在做web配网的时需要一个http server网上搜了下lwip有提供http server,下面记录下使用怎么使用和使用过程中遇到的问题

    开始移植

    网上找了些资料发现下面网址讲的比较好,介绍了cgi,ssi和移植方法,这里我再整理下
    https://wenku.baidu.com/view/330c56204afe04a1b171de08.html

    lwip版本:1.4.0

    文件入下
    在这里插入图片描述
    下表分别介绍这些文件

    文件(夹)说明
    makefsdata该文件夹包含原始网页文件和将原始网页文件转化为网页数组的工具,主要目前时生成fsdata.c文件
    fs.c用来管理生成的网页数据
    fs.h用来管理生成的网页数据
    fsdata.c生成的网页数组
    fsdata.h生成的网页数组
    httpd.chttp server 的实现
    httpd.hhttp server 的实现
    httpd_cgi_ssi.ccgi和ssi实现,主要修改这里面代码

    makefsdata文件夹如下,web_pages存放写好的网页,运行make.bat就生成fsdata.h
    在这里插入图片描述
    在wifi起ap后调用httpd.c 文件里的httpd_init,http server就初始化成功了,然后再浏览器输入wifi ip地址回车,就进入登陆上服务器了

    有几个宏定义要打开

    //filename :lwipopts.h
    #define HTTPD_SUPPORT 1      //打开httpd
    #define HTTPD_USE_MEM_POOL 0 //要关掉
    #define LWIP_HTTPD_SUPPORT_POST   1 //支持post
    
    #define LWIP_HTTPD_MAX_CGI_PARAMETERS 16    //cgi数量定义
    #define LWIP_HTTPD_SSI_INCLUDE_TAG      1  //改为0就不发送标签
    
    void httpd_init(void)
    {
      LWIP_DEBUGF(HTTPD_DEBUG, ("httpd_init\r\n"));
    
    #if LWIP_HTTPD_SSI
      httpd_ssi_init(); //初始化ssi参数
    #endif
    
    #if LWIP_HTTPD_CGI
      httpd_cgi_init(); //初始化cgi参数
    #endif
    
      httpd_init_addr(IP_ADDR_ANY); //建立一个tcp server 绑定IP_ADDR_ANY地址,端口号80
      
    }
    
    

    httpd_cgi_ssi.c中

    void httpd_ssi_init(void)
    {
    	http_set_ssi_handler(SSIHandler,ppcTAGs,NUM_CONFIG_SSI_TAGS);
    }
    
    void httpd_cgi_init(void)
    {
         http_set_cgi_handlers(ppcURLs, NUM_CONFIG_CGI_URIS);
    }
    

    ppcTAGs用于存放标签(等下结合网页看)

    #define APLIST_TAG_NAME     	"aplist"
    #define APLIST_COUNT_TAG_NAME 	"aplistcount"
    #define APLIST_PAGE_TAG_NAME 	"aplistpage"
    
    static const char *ppcTAGs[]=
    {
    	APLIST_TAG_NAME,       //index = 0
    	APLIST_COUNT_TAG_NAME, //index = 1
    	APLIST_PAGE_TAG_NAME,  //index = 2
    };
    

    注意:这个标签长度取决于下面宏定义
    lwipopts.h

    #define LWIP_HTTPD_MAX_TAG_NAME_LEN 20
    

    SSIHandler是找到这些标签后对应的处理函数

    static u16_t SSIHandler(int iIndex,char *pcInsert,int iInsertLen)
    {
        char *TagName = NULL;
        //这里根据index找到对应Tag
        TagName = (char *)SSIGetTagName(iIndex);
    
        if (TagName == NULL) return 0;
    	if (STRCMP(TagName, APLIST_TAG_NAME) == 0) //判断APLIST_TAG_NAME 标签
        {  //APLIST_TAG_NAME 标签下处理,输出pcInsert,这个变量是输出参数,放在web网页的对应标签后
            Aplist_Handler(pcInsert); 
        }
        else if (STRCMP(TagName, APLIST_COUNT_TAG_NAME) == 0)
        {
            AplistCount_Handler(pcInsert);
        }
        else if (STRCMP(TagName, APLIST_PAGE_TAG_NAME) == 0)
        {
            AplistPage_Handler(pcInsert);
        }
    
    	return strlen(pcInsert); //返回pcInsert长度
    }
    

    注意:pcInsert这个这个指针被分配的内存取决下面宏
    lwipopts.h

    #define LWIP_HTTPD_MAX_TAG_INSERT_LEN 1024*2
    

    ppcURLs用于存放请求的url地址,和不同请求不同网址下服务端执行的动作(等下结合网页看)

    static const tCGI ppcURLs[]=
    {   //   网址          服务端执行动作
        {"/login.cgi",LOGIN_CGI_Handler}, 
        {"/wifimode.cgi",WIFI_CGI_Handler},
        {"/scan.cgi",SCAN_CGI_Handler},
        {"/aplist.cgi",APLIST_CGI_Handler},
    };
    

    比如服务器收到请求的是http:xx.xx.xx.xx/login.cgi这个url后就会执行LOGIN_CGI_Handler这个函数
    可以看到这是一个登陆函数,但是没有验证用户名和密码

    //pcParam 是得到参数字符串 
    //iNumParams 得到参数总个数
    //iIndex 是对应参数序号
    //pcValue[iIndex]得到对应参数字符串
    const char* LOGIN_CGI_Handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[])
    {
      LOG_PRINTF("LOGIN_CGI_Handler\r\n");
    
      iIndex = FindCGIParameter("username",pcParam,iNumParams);
      if (iIndex != -1)
      {
          LOG_PRINTF("username: %s\r\n", pcValue[iIndex]);
      }
    
      iIndex = FindCGIParameter("password",pcParam,iNumParams);
      if (iIndex != -1)
      {
          LOG_PRINTF("password: %s\r\n", pcValue[iIndex]);
      }
      return "/wireless_config.shtml"; //返回的网页
    }
    

    下面看下网页代码
    index.shtml

      <form id="logonForm" name="logonForm" method="post" action="/login.cgi">
    

    可以看到这里提交一个表单,方法是post,动作是/login.cgippcURLs第一个结构体对应上

    /wireless_config.shtml

    <p class="STYLE1" id="p_aplistpage" hidden="hidden"><!--#aplistpage--></p>
    <p class="STYLE1" id="p_totalpage" hidden="hidden"><!--#aplistcount--></p>
    <p class="STYLE1" id="p_aplist" hidden="hidden"><!--#aplist--></p>
    

    上面这三个标签和ppcTAGs对应,当wifi通过ppcTAGs标签下对应的函数处理后加在对应标签后返回,网页端再拿着标签对应的id做处理显示出来。
    发生请求后电脑网页端可以看到都加在对应标签后
    在这里插入图片描述
    大致就是这样的原理

    下面说下遇到问题
    1.只有httpd_init函数,没有提供deinit函数,我自己写个函数标记了下tcp的pcb,deinit就释放他

    static struct tcp_pcb *httpd_close_pcb=NULL;
    void httpd_close(void)
    {
    	LWIP_DEBUGF(HTTPD_DEBUG, ("httpd_close\r\n"));
    	if(httpd_close_pcb != NULL)
    	{		
    		printf("#### %d ###\n",tcp_close(httpd_close_pcb));	
    		httpd_close_pcb= NULL;
    	}
    }
    
    
    /**
     * Initialize the httpd with the specified local address.
     */
    static void httpd_init_addr(struct ip_addr *local_addr)
    {
      struct tcp_pcb *pcb;
      err_t err;
    
      pcb = tcp_new(); 
      httpd_close_pcb = pcb;  //add 这里是我加的
      LWIP_ASSERT("httpd_init: tcp_new failed", pcb != NULL);
      tcp_setprio(pcb, HTTPD_TCP_PRIO);
      /* set SOF_REUSEADDR here to explicitly bind httpd to multiple interfaces */
      err = tcp_bind(pcb, local_addr, HTTPD_SERVER_PORT);
      LWIP_ASSERT("httpd_init: tcp_bind failed", err == ERR_OK);
      pcb = tcp_listen(pcb); //-
      LWIP_ASSERT("httpd_init: tcp_listen failed", pcb != NULL);
      /* initialize callback arg and accept callback */
      tcp_arg(pcb, pcb);
      tcp_accept(pcb, http_accept);
    }
    

    2.发现每会发送请求后 tcp_in.c的 533 行都会分配内存,我一直想着怎么释放,偶然发现过一段时间后他自己释放了,百度后发现如下,看来要学下lwip
    在这里插入图片描述
    作者博客如下
    https://blog.csdn.net/xujun3614/article/details/78193065

    3.服务器执行动作的这个函数执行时间不能太长,这个是目前我还不知道怎么解决的,可以看到函数最后返回一个网页,若执行时间较长,浏览器就一直转圈圈,有可能加载失败。

    展开全文
  • if (osThreadNew((osThreadFunc_t)Lwip_Web_Task, NULL, &attr) == NULL) { printf("Falied to create Lwip_Web_Entry!\n"); } } SYS_RUN(Lwip_Web_Entry); 扫二维码|关注我们 HarmonyOS社区 电子发烧友与华为官方...

    硬件模块:
    WF-H861-SSA1 WiFi 模组 

    实现功能:在上电后进入AP 模式,热点名称:Soon-WiFi-IoT,连接上热点后用浏览器访问:http://192.168.10.1/

    显示“Hello Wifi IoT”

    输入:http://192.168.10.1/wifiiot

    则显示“欢迎访问wifi-iot页面”

    输入:http://192.168.10.1/error

    显示“404-Page not found”

    主要代码如下:

    #include <stdio.h>

    #include <unistd.h>

    #include <string.h>

    #include <hi_i2c.h>

    #include "ohos_init.h"

    #include "cmsis_os2.h"

    #include "wifi/ap_mode.h"

    #include "lwip/sockets.h"

    const unsigned char htmldata[] = "\

          <html>\

                <meta charset=\"utf-8 \">\

                <head>\

                   <title>Wifi-iot</title>\

                </head>\

                <body>\

                   <h1>欢迎访问wifi-iot页面</h1>\

                </body>\

         </html>";

    const unsigned char hellowifiiot[] = "\

            <html>\

                <head>\

                   <title>Hello Wifi IoT</title>\

                </head>\

                <body>\

                   <h1>Hello Wifi IoT</h1>\

                </body>\

            </html>";

    const unsigned char errhtml[] = "\

            <html>\

                <head>\

                   <title>Error!</title>\

                </head>\

                <body>\

                   <h1>404-Page not found</h1>\

                </body>\

            </html>";

    /**

      * [url=home.php?mod=space&uid=2666770]@Brief[/url] serve tcp connection  

      * [url=home.php?mod=space&uid=3142012]@param[/url] conn: connection socket 

      * @retval None

      */

    void http_server(int conn)

    {

        int buflen = 1500;

        int ret;

        unsigned char recv_buffer[1500];

        /* Read in the request */

        ret = read(conn, recv_buffer, buflen);

        if (ret <= 0)

        {

            close(conn);

            printf("read faiLED\r\n");

            return;

        }

        if (strncmp((char *)recv_buffer, "GET /wifiiot", 9) == 0)

        {

            write(conn, htmldata, sizeof(htmldata) - 1);

        }

        else if (strncmp((char *)recv_buffer, "GET /error", 9) == 0)

        {

            write(conn, errhtml, sizeof(errhtml) - 1);

        }

        else

        {

            write(conn, hellowifiiot, sizeof(hellowifiiot) - 1);

        }

        /* Close connection socket */

        close(conn);

    }

    /**

      * @brief  http_task

      * @param None

      * @retval None

      */

    static void http_task(void)

    {

        int sock, newconn, size;

        struct sockaddr_in address, remotehost;

        /* create a TCP socket */

        if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0)

        {

            printf("can not create socket");

            return;

        }

        /* bind to port 80 at any inteRFace */

        address.sin_family = AF_INET;

        address.sin_port = htons(80);

        address.sin_addr.s_addr = INADDR_ANY;

       

     if (bind(sock, (struct sockaddr *)&address, sizeof(address)) < 0)

        {

            printf("can not bind socket");

            close(sock);

            return;

        }

        /* listen for connections (TCP listen backlog = 1) */

        listen(sock, 1);

        size = sizeof(remotehost);

        while (1)

        {

            newconn = accept(sock, (struct sockaddr *)&remotehost, (socklen_t *)&size);

            if (newconn >= 0)

            {

                printf("newconn");

                http_server(newconn);

            }

            else

            {

                close(newconn);

            }

        }

    }

    static void *Lwip_Web_Task(const char *arg)

    {

        (void)arg;

        wifi_start_softap();

        http_task();

        return NULL;

    }

    static void Lwip_Web_Entry(void)

    {

        osThreadAttr_t attr = {0};

        attr.name = "Lwip_Web_Task";

        attr.attr_bits = 0U;

        attr.cb_mem = NULL;

        attr.cb_size = 0U;

        attr.stack_mem = NULL;

        attr.stack_size = 8192;

        attr.priority = osPriorityNormal;

        if (osThreadNew((osThreadFunc_t)Lwip_Web_Task, NULL, &attr) == NULL)

        {

            printf("Falied to create Lwip_Web_Entry!\n");

        }

    }

    SYS_RUN(Lwip_Web_Entry);

    扫二维码|关注我们

    HarmonyOS社区

    电子发烧友与华为官方共建

    点击阅读原文,下载完整源代码和编译好的测试bin!

    展开全文
  • 针对轻量型LwIP协议栈开源包具有的工业以太网传输功能,应用于嵌入式开发产品中。...通过对该控制系统的研究和测试发现,优化后的LwIP架构有效地解决了工业以太网总线和web server资源冲突的问题。
  • TCPIP网络组件Lwip之最简单的webserver tcp lwip stm32 红龙
  • LwIP之socket应用--WebServer和Modbus TCP
    展开全文
  • 简单的web实现,在我以前的TCP修改的
  • LwIP_uCOS_WEB_server

    2011-02-06 20:15:39
    该软件资源很值得研究,可以少走个把月的弯路。作者继LM3SAPP_Ethernet_Bootloader_Note,LM3SAPP_Ethernet_LwIP_RawAPI两个项目后更有价值的大作。
  • LWIP_APP顾名思义就是LWIP的应用程序了,这里面编写了,TCP服务器,TCP客户端,UDP服务器,UDP客户端,Webserver(应用程序和服务器的接口技术(CGI),动态网页技术(SSI),和ajax技术,做异步提交,获取数据)。...
  • C语言编写web server

    2020-01-14 10:34:06
    后来经同事帮助在《嵌入式网络那些事STM32物联实战》这本书上找到了基于协议栈LWIPweb server,建立服务器需要对HTTP协议、html网页有所了解,这样更利于设计代码完善功能(公司要求功能简单点灯、OTA升级、PWM波形...
  • STM32+LWIP+WEB_SSI_CGI

    热门讨论 2015-03-07 19:06:55
    STM32+LWIP+WEB_SSI_CGI能用的网络编程
  • Zynq 7000裸机的lwip 样例程序echo server 实验

    万次阅读 热门讨论 2017-10-12 00:15:14
    zynq 7000 裸机跑lwip 的echo server
  • LWIP调试http server的Out of memory问题

    千次阅读 2017-09-22 17:11:02
    LWIP调试http server的Out of memory问题最近在做IOT控制,主要通过LWIP的http server来做控制,实现手机和电脑浏览器控制查看数据,其中用web server做实时的数据传输,遇到了切换网页是有时会卡在跳转处很久,...
  • lwip1.4.0 http server实现及POST 实现

    万次阅读 热门讨论 2014-05-16 16:16:36
    lwip1.4.0之http server实现及POST 实现   一、HTTP SERVER的实现  lwip默认的http server 在 apps/httpserver_raw 主要核心文件为 fs.c fs.h(读取相关html相关资源), httpd.c httpd.h httpd_...
  • 本程序根据原子哥STM32H7开发板源码《网络实验15 NETCONN_WEBserver实验(UCOSII版本)》改编,且包含了修改后的网页文件,原子哥的程序是将网页文件转换成了程序的一部分,该方式不方便网页的制作与调试,而且测试...
  • 一、背景 WebServer作为HTTP服务器,接收手机APP请求,配置网关接入网络。 Post请求和Get请求: ...文件所在 ESP8266_NONOS_SDK-2.1.0\IoT_Demo\user/user_webserver.c。 创建TCP服务端,参...
  • 本程序基于原子哥STM32H7开发板例程《网络实验15 NETCONN_WEBserver实验(UCOSII版本)》修改而来,原来的程序是将网页文件转化为.c文件包含到程序中使用,现在将网页文件直接放在U盘中,程序从U盘读取网页文件,该...
  • STM32移植lwip之建立web服务器

    万次阅读 多人点赞 2016-12-03 09:32:54
    基础工程:修改后能ping通pc机的工程(STM32官方移植lwip修改代码) 搭建工程:最终搭建好的web服务器工程(STM32搭建web服务器工程) 调试工具:用来调试tcp连接下的数据接收(网络调试助手) 测试浏览器:这里使用...
  • STM32F103+ENC28J60+Webserver

    2016-06-28 13:59:21
    硬件:STM32F103+ENC28J60 完成Webserver,通过很小的代码量完成网页配置IP/子网掩码/默认网关 Total RO Size (Code + RO Data) 6256 ( 6.11kB) Total RW Size (RW Data + ZI Data) 2656 ( 2.59kB) Total ROM Size ...
  • F429MQTT+WEBSERVER.zip

    2019-12-31 23:04:12
    基于正点原子F429开发板实现mqtt连接百度天工平台,实现数据正常上行发送。网络协议栈使用lwip1.4.1,网络芯片为lan8720,操作系统使用freertos。
  • LWIP 2.0.3 之TFTP Server ,简单文件传输

    千次阅读 2018-10-26 17:04:40
    TFTP即简单文件传输协议,...本例说明:下位机跑LWIP作为TFTP Server,Windows端作为client,实现: windows向下位机发送文件 从下位机端获取文件 LWIP封装的比较完美,TFTP使用起来非常方便,打开tftp_server.h...
  • lwip1.4.0之http server实现及POST 实现

    千次阅读 2017-12-13 11:50:03
    lwip1.4.0之http server实现及POST 实现   一、HTTP SERVER的实现  lwip默认的http server 在 apps/httpserver_raw 主要核心文件为 fs.c fs.h(读取相关html相关资源), httpd.c httpd.h httpd...
  • Web点灯一 1. html实现 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>web 点灯</title> <script defer="defer"> function ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 470
精华内容 188
关键字:

lwipwebserver