文章目录
- 1 前言
- 2 简介
- 2 .1 什么是WebSocket协议?
- 2.2 WebSocket协议工作原理
- 2.3 WebSocket协议优点
- 2.4 WebSocket应用场景
- 3 WIZnet以太网芯片
- 4 WebSocket示例概述以及使用
- 4.1 流程图
- 4.2 准备工作核心
- 4.3 连接方式
- 4.4 主要代码概述
- 4.5 结果演示
- 5 注意事项
- 6 相关链接
1 前言
在互联网的世界中,实时、高效的数据交换是至关重要的。WebSocket协议,作为一种强大的通信工具,正是为满足这一需求而生。与传统的HTTP协议不同,WebSocket协议允许服务器主动向客户端发送数据,而不需要客户端发起请求。这种特性使得WebSocket协议在需要实时数据交换的场景中,如在线聊天、多人在线游戏等,具有显著的优势。
W5100S/W5500是一款集成全硬件 TCP/IP 协议栈的嵌入式以太网控制器,同时也是一颗工业级以太网控制芯片。本教程将介绍W5100S/W5500以太网Web socket应用的基本原理、使用步骤、应用实例以及注意事项,帮助读者更好地掌握这一技术。
2 简介
2 .1 什么是WebSocket协议?
WebSocket是一种网络协议,允许服务器和客户端之间进行双向通信。与HTTP使用请求和响应模式不同,WebSocket对等方可以在任何时候向任一方向发送消息。WebSocket通常用于聊天应用和其他需要服务器和客户端之间持续通信的应用。
2.2 WebSocket协议工作原理
- 客户端向服务器发出HTTP请求以建立WebSocket连接。
- 如果服务器使用WebSocket协议,则它将接受升级并发送响应。
- 如果初始握手成功,客户端和服务器已经同意使用为HTTP请求建立的现有TCP/IP连接作为WebSocket连接。
- 数据现在可以通过这个连接使用基本的帧消息协议流动。
- 一旦双方都确认WebSocket连接应该关闭,TCP连接就会被拆除。
2.3 WebSocket协议优点
MODBUS TCP协议的优点包括:
- 全双工通信:WebSocket支持全双工通信,这意味着服务器和客户端可以同时发送和接收信息。
- 实时性:使用WebSocket,可以立即发送和接收数据,比HTTP更快。此外,它们比AJAX更快。
- 跨源通信:尽管这可能带来安全风险,但WebSocket支持跨源通信。
- 跨平台兼容性:WebSocket支持跨平台兼容性,包括Web、桌面和移动设备。
- 低开销:HTTP需要大约2000字节的开销,而WebSocket只需要2字节。
- 替代长轮询:WebSocket可以替代长轮询。
- 数据类型:与只能发送字符串数据类型的AJAX调用不同,WebSocket是数据类型化的。
- 持久连接:WebSocket是客户端和服务器之间的持久连接,这允许服务器在任何时候向客户端发送数据,而无需客户端请求。
- 低延迟:由于连接已经建立,因此WebSocket数据帧的组织非常高效(主要是6个额外的字节,2个字节用于头部,4个字节用于掩码),可以比通过包含头部、cookie等的HTTP请求更高效地发送数据。
- 减少带宽使用:与基于HTTP的实时机制(如HTTP长轮询)相比,WebSocket协议使用持久连接,而不是连续的HTTP请求/响应周期。WebSocket需要的带宽较少,并且与HTTP相比,提供了较低的延迟,从而减轻了客户端和服务器的负担。
- 改善性能和响应性:WebSocket的优点是,它们可以在客户端和服务器之间进行实时通信,而无需频繁的HTTP请求/响应。这带来了诸如减少延迟、改善性能和响应性的Web应用程序等好处。
2.4 WebSocket应用场景
WebSocket协议的应用场景广泛,以下是一些主要的领域:
- 实时事件更新:例如体育比赛实时得分、股市价格等。
- 用户通知:例如软件更新、内容更新。
- 协作编辑工具:多人同时在线编辑同一份文档。
- 信息流:例如社交媒体和新闻的实时更新。
- 社交媒体流:例如实时更新的Twitter或Facebook信息流。
- 聊天应用:例如实时的在线聊天。
- 多人在线游戏:例如需要多人同时在线的网络游戏。
- 实时位置数据更新:例如共享单车或打车应用的实时位置更新。
- 股市应用:例如实时更新的股票价格。
使用WebSocket搭建的在线网页聊天示例:
3 WIZnet以太网芯片
WIZnet 主流硬件协议栈以太网芯片参数对比
Model | Embedded Core | Host I/F | TX/RX Buffer | HW Socket | Network Performance |
---|---|---|---|---|---|
W5100S | TCP/IPv4, MAC & PHY | 8bit BUS, SPI | 16KB | 4 | Max.25Mbps |
W6100 | TCP/IPv4/IPv6, MAC & PHY | 8bit BUS, Fast SPI | 32KB | 8 | Max.25Mbps |
W5500 | TCP/IPv4, MAC & PHY | Fast SPI | 32KB | 8 | Max 15Mbps |
- W5100S/W6100 支持 8bit数据总线接口,网络传输速度会优于W5500。
- W6100 支持IPV6,与W5100S 硬件兼容,若已使用W5100S的用户需要支持IPv6,可以Pin to Pin兼容。
- W5500 拥有比 W5100S更多的 Socket数量以及发送与接收缓存。
4 WebSocket示例概述以及使用
4.1 流程图
程序的运行框图如下所示:
4.2 准备工作核心
软件
- Visual Studio Code
- WIZnet UartTool
硬件
- W5100S IO模块 + 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层之上的协议,我们只需简单调用相应函数即可完成协议的应用。
第一步:在websocket_server.c文件中引用对应的库文件。
第二步:宏定义常量和定义全局变量。
第三步:定义四个函数,包括一个1秒定时器回调函数(用于处理DHCP超时处理),一个设置网络地址函数,一个串口初始化函数以及一个串口接收回调函数。
第四步:主函数首先是对串口和SPI进行初始化以及链路检测。然后是设置W5100S的网络地址,首先使用DHCP的方式进行获取,失败后使用预设的静态IP地址。然后则是将网页信息注册到HTTP服务器上,最后则是在主循环中跑httpServer的程序和websocketServer程序。
主函数程序如下:
int main()
{
int i;
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
wizchip_setnetinfo(&net_info); // Configure once first
UART0_Init(); // uart0 init
/*dhcp init*/
DHCP_init(SOCK_DHCP, ethernet_buf); // DHCP initialization
add_repeating_timer_ms(1000, repeating_timer_callback, NULL, &timer); // Add DHCP 1s Tick Timer handler
printf("wiznet chip websocket server example.\r\n");
network_init(&net_info); // Configuring Network Information
print_network_information(&get_info); // Read back the configuration information and print it
httpServer_init(http_tx_ethernet_buf, http_rx_ethernet_buf, MAX_HTTPSOCK, socknumlist); // HTTP Server initialization
reg_httpServer_webContent((uint8_t *)"index.html", (uint8_t *)INDEX_HTML); // netinfo.html : Network information example page
while (true)
{
for (i = 0; i < MAX_HTTPSOCK; i++)
{
httpServer_run(i);
}
do_websocket_server(SOCK_WEBSOCKET);
}
}
4.5 结果演示
5 注意事项
- 发送的内容只能为UTF-8格式,如果是其他格式,可能会导致乱码造成网页崩,需要刷新才能正常。
- 如果想用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官方库链接
本章例程链接
想了解更多,评论留言哦!