本篇总结
W6300 使用 8 个硬件 Socket 并行监听 80 端口,浏览器访问开发板 IP 即可看到 HTTP 页面。
🔑 MH2457、QSPI、UART调试、硬件TOE引擎、HTTP、DHCP
硬件平台 :本例程基于 W6300-EVB-M4 开发板运行。
采购推荐 :点击前往 WIZnet 官方淘宝店铺 选购 W6300-EVB-M4 开发板
本示例演示如何在 W6300 上实现 HTTP 服务器 功能。开发板通过 DHCP 获取 IP 后,使用 8 个硬件 Socket 同时监听 80 端口 ,浏览器访问开发板 IP 即可打开预置的网页。本例程用 ioLibrary 自带的 httpServer 库处理 HTTP 请求解析和响应发送,网页内容通过 reg_httpServer_webContent() 注册到代码中。
前置工具准备
开始本例程前,请确认以下工具已安装:
WIZ UartTool V1.0 :串口调试工具:点击下载
任意浏览器 :Chrome / Edge / Firefox 均可,用于访问开发板的 HTTP 页面
HTTP 协议简介
HTTP(HyperText Transfer Protocol)是一种用于分布式、协作式、超媒体信息系统的应用层协议 ,基于 TCP/IP 通信协议来传递数据,是万维网数据通信的基础。它采用请求-响应模型 :客户端发起请求,服务器处理后返回响应;本身无状态 ,每次请求独立。
HTTP 常用的请求方法有 GET 和 POST:
方法 参数位置 数据大小 安全性 典型用途
GET URL 查询字符串 受 URL 长度限制 明文显示,较低 获取资源
POST 请求体 无明显限制 相对安全 提交数据
HTTP 响应由状态行 、响应头 和响应体 三部分组成。状态码分五类:1xx 信息性、2xx 成功、3xx 重定向、4xx 客户端错误、5xx 服务器错误。本例程中服务器对 GET 请求返回 200 OK,对未知 URI 返回 404 Not Found。
W6300 的优势
W6300 的 TOE 引擎支持 8 个独立硬件 Socket,本例程让 8 个 Socket 全部监听 80 端口,可同时处理多个浏览器请求。HTTP 请求解析、响应头和响应体的组装由 ioLibrary 的 httpServer 库完成,用户只需注册网页内容并轮询 httpServer_run()。
硬件连接与拓扑
请注意:
PC 和开发板需接入同一路由器(同一网段)。路由器需开启 DHCP 服务(家用路由器默认开启)。
Micro USB 线连接 DEBUG USB 口到 PC(供电 + 调试串口)
网线连接开发板 RJ45 网口 到路由器 LAN 口
确保 W6300 与 MH2457 之间的 QSPI 连线正确(CSn、SCK、DATA0~DATA3)
┌───────────────────────────────────┐
│ 路由器(DHCP Server) │
│ 192.168.1.1 │
└────┬──────────────────┬───────────┘
│ │
┌────┴──────────┐ ┌───┴───────────┐
│ W6300 │ │ PC │
│ (HTTP Server) │ │ (浏览器访问) │
│ :80 │ │ │
└────┬──────────┘ └───────────────┘
│ QSPI ↑
┌────┴──────┐ DEBUG USB
│ MH2457 │──────────→ WIZ UartTool
│ MCU │
└───────────┘
网络拓扑:路由器分配 IP,W6300 运行 HTTP Server,PC 浏览器访问配置页面,MH2457 通过 QSPI 驱动 W6300
工程结构
工程核心文件如下:
Project/
├── main.c ← 系统入口:串口、GPIO、QSPI 初始化 + user_run()
└── USER/
│ ├── user_main.c/h ← 网络地址定义 + HTTP Server 主流程
│ ├── http_server.c ← W6300 平台适配:w6300_httpServer_init(含定时器注册)
└── internet/
├── httpServer.c ← HTTP Server 状态机
├── httpParser.c ← HTTP 请求解析
└── httpUtil.c ← CGI 处理(本例程预留接口)
步骤1:注册网页内容 文件:USER/Webpage.h + USER/user_main.c — 网页内容定义为字符串常量 index_page,通过 reg_httpServer_webContent() 注册到 HTTP Server 库中。
reg_httpServer_webContent((uint8_t *)"index.html", (uint8_t *)index_page);
reg_httpServer_webContent() 由 internet/httpServer.c 提供,将网页内容存入 web_content 数组。浏览器请求 index.html 时由 find_userReg_webContent() 检索匹配。本例程中浏览器访问根路径 / 时,会被自动映射到 INITIAL_WEBPAGE(即 index.html)。
步骤2:初始化 HTTP Server 并注册定时器
文件:USER/http_server.c — W6300 平台在 ioLibrary 的 httpServer_init() 基础上做了封装 w6300_httpServer_init():先关闭待用 Socket,再调用原始初始化,最后通过 wiz_add_timer() 注册 1 秒时基。
void w6300_httpServer_init(uint8_t *tx_buf, uint8_t *rx_buf, uint8_t cnt, uint8_t *socklist)
{
uint8_t i;
for (i = 0U; i < cnt; i++)
{
if (getSn_SR(socklist[i]) != SOCK_CLOSED)
{
(void)close(socklist[i]);
}
}
httpServer_init(tx_buf, rx_buf, cnt, socklist);
wiz_add_timer(httpServer_time_handler, 1000);
}
在主程序中初始化 HTTP Server,传入 HTTP 发送缓存、接收缓存、Socket 数量和 Socket 列表:
static uint8_t http_tx_ethernet_buf[HTTP_SERVER_BUF_SIZE] = {0};
static uint8_t http_rx_ethernet_buf[HTTP_SERVER_BUF_SIZE] = {0};
static uint8_t socknumlist[] = {0, 1, 2, 3, 4, 5, 6, 7};
w6300_httpServer_init(http_tx_ethernet_buf, http_rx_ethernet_buf,
_WIZCHIP_SOCK_NUM_, socknumlist);
为什么用 8 个 Socket
W6300 支持 8 个独立硬件 Socket,本例程将 0~7 全部交给 HTTP Server 使用,可以同时处理多个浏览器的并发连接。每个 Socket 独立维护自己的 HTTP 请求状态,浏览器访问不同页面时不会互相阻塞。HTTP 请求解析和响应组装由 ioLibrary 库处理,无需用户干预。
步骤3:主循环运行 HTTP Server
文件:USER/user_main.c — 在主循环中遍历 8 个 Socket,分别调用 httpServer_run() 驱动每个 Socket 的状态机。
while (1)
{
for (i = 0; i < _WIZCHIP_SOCK_NUM_; i++)
{
httpServer_run((uint8_t)i);
}
}
httpServer_run() 由 internet/httpServer.c 实现,状态机逻辑如下:SOCK_CLOSED 时打开 Socket 监听 80 端口;SOCK_INIT 时调用 listen();SOCK_ESTABLISHED 时解析请求并发送响应(IDLE → RES_INPROC → RES_DONE);SOCK_CLOSE_WAIT 时断开连接。每个 Socket 独立运行,互不干扰。
Socket状态 执行操作
SOCK_CLOSED 打开 TCP Socket,绑定 80 端口
SOCK_INIT 调用 listen() 进入监听状态
SOCK_LISTEN 等待浏览器连接
SOCK_ESTABLISHED 解析 HTTP 请求,发送响应头和响应体
SOCK_CLOSE_WAIT 断开连接,Socket 回到 SOCK_CLOSED
步骤4:浏览器请求解析与响应 文件:internet/httpServer.c + internet/httpParser.c — 浏览器请求到达后,ioLibrary 的 HTTP Server 库完成以下流程:解析请求行和请求头 → 判断请求方法(GET/POST)→ 匹配 URI → 查找注册的网页内容 → 生成响应头 → 分段发送响应体。
本例程中,当浏览器访问 http://192.168.1.8/ 时,URI 为 /,服务器自动映射到 index.html,从注册的网页内容中查找并返回给浏览器。如果请求的 URI 未注册(例如 /test.html),返回 404 Not Found。
CGI 接口预留
本例程的 internet/httpUtil.c 中 predefined_get_cgi_processor() 和 predefined_set_cgi_processor() 函数为空实现,只返回 0。这意味着本例程不处理 CGI 请求,只返回静态网页。如果需要实现表单提交、参数处理等动态功能,可在这两个函数中扩展。
运行验证
烧录例程运行后,首先进行 PHY 链路检测,然后通过 DHCP 获取网络地址,最后 8 个 Socket 依次打开并监听 80 端口。打开 WIZ UartTool V1.0 ,连接 DEBUG USB 对应 COM 口(115200 / 8N1),预期串口输出如下:
MH2457 W6300 QSPI example start
W6300 HTTP Server example
PHY link
The current Mbtis speed : 100Mbps
The current Duplex Mode : Full-Duplex
DHCP running
DHCP success!
====================================================================================================
W6300 network configuration : DHCP
MAC : 00:08:DC:12:34:56
IP : 192.168.1.8
Subnet Mask : 255.255.255.0
Gateway : 192.168.1.1
DNS : 192.168.1.1
====================================================================================================
Please enter 192. 168. 1. 8 in your browser to access the HTTP server
> HTTPSocket[0] : CLOSED
> HTTPSocket[0] : OPEN
> HTTPSocket[1] : CLOSED
> HTTPSocket[1] : OPEN
> HTTPSocket[2] : CLOSED
> HTTPSocket[2] : OPEN
> HTTPSocket[3] : CLOSED
> HTTPSocket[3] : OPEN
...
然后在浏览器中输入开发板的 IP 地址(如 192.168.1.8)即可打开预置的网页。
浏览器访问 192.168.1.8 — W6300 HTTP Server 返回 index.html 页面 常见问题
Q: 为什么用 8 个 Socket 监听同一个端口
W6300 的 8 个硬件 Socket 相互独立。本例程把 0~7 全部交给 HTTP Server,让多个浏览器的并发连接可以分散到不同 Socket 上,避免单个 Socket 忙时其他请求排队等待。每个 Socket 独立维护 HTTP 状态,浏览器访问不同页面时不会互相阻塞。
Q: 网页内容存放在哪里
本例程的网页内容以字符串常量形式存放在 Webpage.h 的 index_page 变量中,通过 reg_httpServer_webContent() 注册到 HTTP Server 库。web_content 数组中记录了每个网页的名称、长度和内容指针,浏览器请求时由 find_userReg_webContent() 检索。
Q: W6300 的 HTTP Server 定时器如何实现
W6300 平台通过软件定时器链表提供时基。在 USER/http_server.c 的 w6300_httpServer_init() 中调用 wiz_add_timer(httpServer_time_handler, 1000) 注册回调,wiz_timer_handler() 由 1ms 系统定时中断调用,累计到 1000ms 后执行 httpServer_time_handler(),将 httpServer_tick_1s 加 1。HTTP Server 库通过 get_httpServer_timecount() 读取该计数用于超时判断。
Q: 如何自定义网页内容
修改 Webpage.h 中的 index_page 字符串即可。如需注册多个网页,可多次调用 reg_httpServer_webContent(),传入不同的网页名称和内容。注意 web_content 数组有上限 MAX_CONTENT_CALLBACK,超过后会注册失败。
Q: 为什么需要关闭 Socket 后再初始化
W6300 上电后 Socket 可能处于不确定状态。在 w6300_httpServer_init() 中,先遍历 socket 列表,如果 Socket 不是 SOCK_CLOSED 状态则调用 close() 复位,确保所有 Socket 从干净状态开始。这样 HTTP Server 库在 SOCK_CLOSED 分支中才能正确地通过 socket() 重新打开监听。
总结
本文基于 W6300 硬件 TCP/IP 协议栈实现了 HTTP 服务器功能:
HTTP 协议基础 :HTTP 是基于 TCP/IP 的应用层协议,采用请求-响应模型,具有无状态、无连接的特点
多 Socket 并行 :使用 W6300 的 8 个硬件 Socket 全部监听 80 端口,支持多浏览器并发访问
网页注册 :通过 reg_httpServer_webContent() 注册网页内容,浏览器请求时由库函数自动匹配和返回
状态机驱动 :主循环遍历 8 个 Socket 调用 httpServer_run(),每个 Socket 独立运行状态机
W6300 平台适配 :通过 w6300_httpServer_init() 封装 Socket 复位和软件定时器注册,接口与 ioLibrary 兼容
CGI 接口预留 :internet/httpUtil.c 中预留了 CGI 处理函数,可扩展表单提交等动态功能