十七、W5100S/W5500+RP2040树莓派Pico<HTTP Server网页显示>

news2024/11/25 12:54:29

文章目录

  • 1 前言
  • 2 简介
    • 2 .1 什么是HTTP?
    • 2.2 HTTP的优点
    • 2.3 HTTP工作原理
    • 2.4 HTTP应用场景
  • 3 WIZnet以太网芯片
  • 4 HTTP网络设置示例概述以及使用
    • 4.1 流程图
    • 4.2 准备工作核心
    • 4.3 连接方式
    • 4.4 主要代码概述
    • 4.5 结果演示
  • 5 注意事项
  • 6 相关链接

1 前言

  HTTP是互联网上应用最为广泛的一种网络协议,所有的www文件都必须遵守这个标准。HTTP是Hypertext Transfer Protocol(超文本传输协议)的缩写,用于从www服务器传输超文本到本地浏览器。它可以使浏览器更加高效,使网络传输更快并且更易于计算机和移动设备之间的访问。

  W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。本教程将介绍W5100S/W5500以太网DHCP应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。

2 简介

2 .1 什么是HTTP?

  超文本传输协议HTTP是一种通信协议,它使用TCP协议工作,默认端口号为80.它允许将超文本标记语言(HTML)文档从Web服务器传送到Web浏览器。HTMl是一种创建文档的标记语言,这些文档包含相关的链接。可以单击一个链接来访问其他文档、图像或者多媒体对象,并获得关于链接项的附加信息。

2.2 HTTP的优点

  HTTP server的优点包括:

  1. 跨平台和跨语言:HTTP server可以运行在各种操作系统和编程语言环境中,使得它可以适应不同的需求和场景。
  2. 可扩展性:HTTP server支持可扩展的插件架构,可以根据需要添加新的功能和模块。
  3. 灵活的路由和请求处理机制:HTTP server支持灵活的路由和请求处理机制,可以根据不同的请求类型和URL路径来处理请求。
  4. 支持静态文件服务和动态请求处理:HTTP server可以同时处理静态文件服务和动态请求处理,使得它可以高效地提供网页和其他资源。
  5. 支持认证和安全连接:HTTP server支持认证和安全连接,如SSL/TLS协议,保证了传输数据的安全性。
  6. 高性能和可扩展性:HTTP server通常具有高性能和可扩展性,可以处理大量的并发请求和数据传输。

2.3 HTTP工作原理

在这里插入图片描述

HTTP通信机制的七个步骤如下:

  1. 建立TCP连接:在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的。
  2. Web浏览器向Web服务器发送请求命令:一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。
  3. Web浏览器发送请求头信息:浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
  4. Web服务器向Web浏览器发送响应:Web服务器在收到请求命令和头信息后,会分析请求,然后向Web浏览器发送响应。
  5. Web浏览器接收响应:Web浏览器会接收响应,包括状态码、响应头和响应体等信息。
  6. Web浏览器解析响应:Web浏览器会解析响应,根据状态码和响应体等信息来处理响应。
  7. 关闭连接:Web浏览器和Web服务器完成数据传输后,会关闭连接。

2.4 HTTP应用场景

HTTP server的应用场景非常广泛,以下是其中一些常见的应用场景:

  1. 静态文件服务:HTTP server可以用于提供静态文件的下载和访问,例如在网站上提供图片、文档、音频、视频等文件的下载和浏览。
  2. 动态网页服务:HTTP server可以与网页服务器配合,提供动态网页的服务。动态网页可以根据用户请求的不同,返回不同的内容,实现交互功能。
  3. 代理服务:HTTP server可以作为代理服务器,将客户端的请求转发到其他服务器,并将服务器的响应返回给客户端。这样可以隐藏客户端的真实地址和身份,提高安全性。
  4. 负载均衡:HTTP server可以作为负载均衡器,将多个服务器的响应均匀分配给客户端,以提高服务器的处理能力和吞吐量。
  5. 缓存服务:HTTP server可以将网页内容缓存到本地,减少对原始服务器的访问次数,提高网页的加载速度和响应速度。

3 WIZnet以太网芯片

WIZnet 主流硬件协议栈以太网芯片参数对比

ModelEmbedded CoreHost I/FTX/RX BufferHW SocketNetwork Performance
W5100STCP/IPv4, MAC & PHY8bit BUS, SPI16KB4Max.25Mbps
W6100TCP/IPv4/IPv6, MAC & PHY8bit BUS, Fast SPI32KB8Max.25Mbps
W5500TCP/IPv4, MAC & PHYFast SPI32KB8Max 15Mbps
  1. W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
  2. W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
  3. W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。

4 HTTP网络设置示例概述以及使用

4.1 流程图

  程序的运行框图如下所示:

在这里插入图片描述

4.2 准备工作核心

软件

  • Visual Studio Code
  • WIZnet UartTool

硬件

  • W5100SIO模块 + RP2040 树莓派Pico开发板 或者 WIZnet W5100S-EVB-Pico开发板
  • Micro USB 接口的数据线
  • TTL 转 USB
  • 网线

4.3 连接方式

  • 通过数据线连接PC的USB口(主要用于烧录程序,也可以虚拟出串口使用)

  • 通过TTL串口转USB,连接UART0 的默认引脚:

    • RP2040 GPIO0(UART0 TX) <----> USB_TTL_RX
    • RP2040 GPIO1(UART0 RX) <----> USB_TTL_TX
  • 使用模块连接RP2040 进行接线时

    • RP2040 GPIO16 <----> W5100S MISO
    • RP2040 GPIO17 <----> W5100S CS
    • RP2040 GPIO18 <----> W5100S SCK
    • RP2040 GPIO19 <----> W5100S MOSI
    • RP2040 GPIO20 <----> W5100S RST
  • 通过PC和设备都通过网线连接路由器LAN口

4.4 主要代码概述

  我们使用的是WIZnet官方的ioLibrary_Driver库。该库支持的协议丰富,操作简单,芯片在硬件上集成了TCP/IP协议栈,该库又封装好了TCP/IP层之上的协议,我们只需简单调用相应函数即可完成协议的应用。

第一步:http_server.c文件中加入对应的.h文件。

第二步:定义DHCP配置需要的宏和HTTP sever 最大连接socket的宏。

第三步:网络信息的配置,开启DHCP模式,定义HTTP server socket表。

第四步:编写定时器回调处理函数,用于 DHCP 1秒滴答定时器处理函数。

第五步:主函数先是定义了一个定时器结构体参数用来触发定时器回调函数,对串口和SPI进行初始化,然后写入W5100S的网络配置参数,初始化DHCP后开始DHCP获取IP,获取到就打印获取到的IP,获取次数超过最大获取次数时就使用静态IP,初始化HTTP server后开始设置服务器显示界面,主循环传入socket号执行回环测试函数等待客户端连接。

#include <stdio.h>
#include "pico/stdlib.h"
#include "pico/binary_info.h"
#include "hardware/spi.h"

#include "wizchip_conf.h"
#include "bsp_spi.h"
#include "dhcp.h"     // Use dhcp
#include "socket.h"   // Use socket
#include "arp.h"      // Use arp

#define SOCKET_ID 0                      // Socket number
#define ETHERNET_BUF_MAX_SIZE (1024 * 2) // Send and receive cache size
#define DHCP_RETRY_COUNT 5               // DHCP retry times


/**
 * @brief   Timer callback processing function, used for dhcp timing processing
 * @param   repeating :Timer structure
 * @return  bool
 */
bool repeating_timer_callback(struct repeating_timer *t);

/**
 * @brief   Initialization of chip network information
 * @param   conf_info :Static configuration information
 * @return  none
 */
void network_init(wiz_NetInfo *conf_info);

/* Network information to be configured. */
wiz_NetInfo net_info = {
    .mac = {0x00, 0x08, 0xdc, 0x1e, 0xed, 0x2e}, // Configured MAC address
    .ip = {192, 168, 1, 10},                     // Configured IP address
    .sn = {255, 255, 255, 0},                    // Configured subnet mask
    .gw = {192, 168, 1, 1},                      // Configured gateway
    .dns = {8, 8, 8, 8},                         // Configured domain address
    .dhcp = NETINFO_DHCP};                       // Configured dhcp model,NETINFO_DHCP:use dhcp; NETINFO_STATIC: use static ip.


static uint8_t ethernet_buf[ETHERNET_BUF_MAX_SIZE] = {
    0,
};                                           // Send and receive cachestatic uint8_t destip[4]={192, 168, 1, 2};  // udp destination ip
static uint8_t dest_ip[4] = {192, 168, 1, 2}; // UDP IP address
static uint8_t breakout_flag = 0;         // Define the DHCP acquisition flag

int main()
{
    struct repeating_timer timer; // Define the timer structure
    wiz_NetInfo get_info;
    /* MCU init */
    stdio_init_all();     // Initialize the main control peripheral
    wizchip_initialize(); // Initialize the chip interface

    /*dhcp init*/
    DHCP_init(SOCKET_ID, ethernet_buf);                                   // DHCP initialization
    add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler

    printf("wiznet chip tcp server example.\r\n");
    network_init(&net_info);              // Configuring Network Information
    print_network_information(&get_info); // Read back the configuration information and print it

    while (true)
    {
        do_arp(SOCKET_ID, ethernet_buf, dest_ip);   //run arp
    }
}

void network_init(wiz_NetInfo *conf_info)
{
    int count = 0;
    uint8_t dhcp_retry = 0;

    if (conf_info->dhcp == NETINFO_DHCP)
    {
        while (true)
        {
            switch (DHCP_run()) // Do the DHCP client
            {
            case DHCP_IP_LEASED: // DHCP resolves the domain name successfully
            {
                if (breakout_flag == 0)
                {
                    printf("DHCP success\r\n");
                    getIPfromDHCP((*conf_info).ip);
                    getGWfromDHCP((*conf_info).gw);
                    getSNfromDHCP((*conf_info).sn);
                    getDNSfromDHCP((*conf_info).dns);
                    wizchip_setnetinfo(conf_info); // Configuring Network Information
                    close(SOCKET_ID);              // After dhcp close the socket, avoid errors in later use
                    breakout_flag = 1;
                }
                break;
            }
            case DHCP_FAILED:
            {
                printf(" DHCP failed \r\n");
                count++;
                if (count <= DHCP_RETRY_COUNT) // If the number of times is less than or equal to the maximum number of times, try again
                {
                    printf("DHCP timeout occurred and retry %d \r\n", count);
                }
                else if (count > DHCP_RETRY_COUNT) // If the number of times is greater than DHCP fails
                {
                    breakout_flag = 1; // if DHCP fail, use the static
                    DHCP_stop();       // Stop processing DHCP protocol
                    conf_info->dhcp = NETINFO_STATIC;
                    wizchip_setnetinfo(conf_info); // Configuring Network Information
                    break;
                }
                break;
            }
            }
            if (breakout_flag)
            {
                printf("config succ\r\n");
                break;
            }
        }
    }
    else
    {
        wizchip_setnetinfo(conf_info); // Configuring Network Information
    }
}

bool repeating_timer_callback(struct repeating_timer *t)
{
    DHCP_time_handler(); // DHCP 1s Tick Timer handler
    return true;
}

4.5 结果演示

在这里插入图片描述

1.打开Wiznet UartTool,填入参数,打开浏览器输入开发板获取到的ip,连接上开发板。

2.可以看到设置好的服务界面,同时串口也打印连接信息。

5 注意事项

  • 如果想用WIZnet的W5500来实现本章的示例,我们只需修改两个地方即可:

​ (1)在library/ioLibrary_Driver/Ethernet/下找到wizchip_conf.h这个头文件,将_WIZCHIP_ 宏定义修改为W5500。

​ (2)在library下找到CMakeLists.txt文件,将COMPILE_SEL设置为ON即可,OFF为W5100S,ON为W5500。

6 相关链接

WIZnet官网

WIZnet官方库链接

本章例程链接

想了解更多,评论留言哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1189079.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大自然的拥抱:燃木壁炉营造的原始温馨

人们都喜欢坐在壁炉旁&#xff0c;享受熊熊炉火的温暖和舒适。壁炉不仅提供取暖功能&#xff0c;还营造出室内的温馨氛围。而在现代&#xff0c;有多种类型的壁炉可供选择&#xff0c;其中燃木壁炉是一种备受欢迎的选择。 相比之下&#xff0c;煤炭传统供暖燃料是有限的非可再生…

Oracle递归查询树形数据

实际生活有很多树形结构的数据&#xff0c;比如公司分为多个部门、部门下分为多个组&#xff0c;组下分为多个员工&#xff1b;省市县的归属&#xff1b;页面菜单栏等等。 如果想查询某个节点的父节点或者子节点&#xff0c;一般通过表自身连接完成&#xff0c;但如果该节点的子…

每日一题 2258. 逃离火灾(手撕困难!!!)

火会扩散&#xff0c;但是我们可以看作火不会扩散到已经着火的格子&#xff0c;这样我们就可以记录每一个为草地的格子的着火时间在代码中&#xff0c;因为数字 2 已经表示墙了&#xff0c;所以我们把当时间为 0 时着火的格子在 gird 中的值设为 3&#xff0c;时间为 1 时着火的…

YOLOv8教程系列:五、关闭数据增强

YOLOv8教程系列&#xff1a;五、关闭数据增强 在一些特殊情况下&#xff0c;特别是在计算机视觉任务中&#xff0c;如目标检测&#xff0c;图像的颜色扰动可能会对算法的性能和稳定性产生重要影响。在这些情况下&#xff0c;我们可能需要采取一些措施来关闭部分或全部的数据增…

招商银行余额截图生成器在线,虚拟金额中国农业邮政建设工商,易语言开源例子

其实用易语言的画板写一个图片生成器真的非常简单&#xff0c;我这里都没用任何第三方的支持库&#xff0c;当然也可以用EXUI画板自绘功能&#xff0c;但是用这个默认的就足够了&#xff0c;而且画出来的图非常高清&#xff0c;软件框架里面比较模糊因为缩放的原因&#xff0c;…

调试 Mahony 滤波算法的思考 10

调试 Mahony 滤波算法的思考 1. 说在前面的2.Mahony滤波算法的核心思想3. 易懂的理解 Mahony 滤波算法的过程4. 其他的一些思考5. 民间 9轴评估板 1. 说在前面的 之前调试基于QMI8658 6轴姿态解算的时候&#xff0c;我对Mahony滤波的认识还比较浅薄。初次的学习和代码的移植让…

EMNLP2023 | 让模型学会将提示插入到合适的中间层

深度学习自然语言处理 原创作者&#xff1a;cola 现有的提示微调方法基本是人工选择提示层&#xff0c;而人工选择将提示插入到哪些层次并非一定合理&#xff0c;这导致了很大程度上限制提示微调发挥潜能。我们的模型(SPT)可以让模型自己学习应该在哪些中间层插入提示&#xff…

强化您的应用安全,从app加固开始

强化您的应用安全&#xff0c;从app加固开始 目录 强化您的应用安全&#xff0c;从app加固开始 摘要 引言 1. 加密和数据保护 2. 代码混淆 3. 防止反编译 4. 安全测试 5. 更新和补丁 6. 权限控制 7. 输入验证和输出过滤 8. 日志记录和监控 9. 安全设计和架构 10.…

【Python】AppUI自动化—appium自动化开发环境部署、APP测试案例(17)上

文章目录 一.appium简介1.什么是appium2.appium 的工作原理3.APP类型4.APP页面布局 二,appium开发环境部署&#xff08;python环境&#xff09;1.下载安装环境1.1.下载安装所需环境1.2.Appium-desktop&#xff08; Appium-Server-GUI &#xff09;配置1.3.Appium-Inspector 配置…

【Delphi】Android 开发HTTP请求出错解决方案

目录 一、故障现象 二、原因及解决方案 一、故障现象 在android内建的WebBrowser浏览器中通过http访问一个网站&#xff08;注意不是https&#xff09;&#xff0c;出现如下错误提示&#xff1a; 在使用ntfy的时候&#xff0c;访问http定义的服务器地址&#xff08;注意不是…

通过postgis空间库导入sql格式的矢量数据到arcgis中

1、在postgis中创建数据库 命名为test3 2、创建空间扩展 3、导入sql矢量文件 进入psql.exe目录中 进入dos命令框中 输入命令,其中host输入自己的主机ip,database为自己的数据库名称,数据路径修改为自己电脑上的路径,注意反斜杠 psql

github官网打不开或访问慢的解决办法

对国内程序员而言&#xff0c;github官网经常面临打不开或访问慢的问题&#xff0c;今天教你一招非常简单且好用的小技巧&#xff0c;轻松访问github官网。 1、github官网打不开的原因 首选我们说下github官网打不开的原因到底是什么。细心的同学会发现&#xff0c;github偶尔…

SDL2 简单介绍以及Windows开发环境搭建

1.简介 SDL&#xff08;Simple DirectMedia Layer&#xff09;是一个跨平台的多媒体开发库&#xff0c;使用C语言写成&#xff0c;用于实现音频、图形、输入以及窗口功能的处理。它提供了一个简单、易用的API&#xff0c;可以帮助开发者快速构建跨平台的多媒体应用程序。 SDL…

国外访问学者/博士后留学人员反诈骗指南

访问学者/博士后/联合培养博士人员出国后&#xff0c;对当地环境及政策不熟悉&#xff0c;需要提高防范意识&#xff0c;为此&#xff0c;知识人网小编特整理这篇反诈骗指南&#xff0c;提醒留学人员防微杜渐、未雨绸缪。 近日&#xff0c;多国使馆发布相关提醒&#xff1a;不法…

kali linux系统选用gnome桌面安装完成后无法调节屏幕亮度踩坑过程( 2301_77564090)

方法一&#xff1a; 在终端通过xrandr命令查看当前显示屏名字 然后输入命令调节屏幕亮度&#xff0c;我调节的是原先的70%&#xff0c; xrandr --output eDP --brightness 0.7 方法一能成功调节&#xff0c;但每次开机屏幕亮度都自动回调到100%&#xff0c;每次都要手动打开终…

5G毫米波通信中的关键技术

随着5G技术的快速发展&#xff0c;毫米波通信作为其中的一项重要技术&#xff0c;在高速数据传输、低延迟通信和大规模连接等方面具有显著的优势。本文将探讨5G毫米波通信中的关键技术&#xff0c;包括毫米波频段的选择、信号处理技术和MIMO技术等。 一、毫米波频段的选择 毫米…

Node版本管理工具——Nvm

文章目录 前言基础常识彼此之间的关系 一、安装 nvm&#xff1f;查看是否安装成功 二、配置下载源三、nvm常用命令 前言 nvm 全名 node.js version management&#xff0c;顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 基础常识 node&#x…

掌握互联网的未来:5G时代的新机遇

随着5G技术的快速发展&#xff0c;我们正步入一个全新的互联网时代。5G不仅仅是速度的飞跃&#xff0c;它还代表着无限的可能性和前所未有的创新机遇。本文将探讨5G如何重新定义互联网&#xff0c;并为您提供洞察如何抓住这波科技浪潮。 5G技术的核心优势 超高速度&#xff1a…

Git的安装和常用命令Git与SVN的区别Gitee远程仓库团队开发代码共享演示

目录 一、Git入门 1.1 Git简介 1.2 Git与SVN的区别 1.2.1 详解 1.2.2 图解 1.3 Git相较于SVN的优势与劣势 1.3.1 Git的优势与劣势 1.3.2 SVN的优势与劣势 1.4 Git的工作流程 1.4.1 图解 1.4.2 详解 二、Git的安装以及常用命令 2.1 Git官网链接 2.2 安装步骤 2.…

国产小体积超低成本电动车仪表智能刷卡解锁13.56M非接触式读写芯片CI522兼容替代RC522

Ci522电动车仪表一键启动芯片 Ci522是一个高度集成的&#xff0c;工作在13.56MHz的非接触式读写器芯片&#xff0c;阅读器支持ISO/IEC 14443 A/MIFARE。 无需外围其他电路&#xff0c;Ci522的内部发送器可驱动读写器天线与ISO/IEC 14443 A/MIFARE卡和应答机通信。接收器模块提…