此外,这些解决方案也开始出现在专业工业网络中,逐渐取代了基于 RS232 及其衍生标准的旧系统。因此,在 21 世纪初,所谓的物联网 (IoT) 时代拉开了帷幕。尽管当前的物联网市场主要由通过无线网络和标准(例如 WiFi、ZigBee、BLE 或 Z-Wave)进行通信的设备主导,但以太网仍然是许多硬件解决方案(主要是所谓的工业物联网 (IIoT))中最流行的解决方案之一,这些解决方案需要可靠的传输和数据安全。Arduino 平台的创建者响应了 IIoT 设备设计者的需求,扩展了标准 Arduino 模块的产品线,推出了面向个人用户的以太网扩展板 2 (Ethernet Shield 2) 和面向专业解决方案的 Arduino MKR ETH SHIELD。后者基于 WIZnet W5100/W5200/W5500 控制器,并将 MAC 和 PHY 电路集成到单个集成电路中。独立厂商迅速扩展了产品线,推出了基于广受欢迎的ENC28J60系统的新型且价格更实惠的模块。本文将简要介绍两种解决方案:一种是基于W5x00系列的官方方案,另一种则主要基于开源/开放硬件,并使用ENC28J60模块。.

使用 WIZnet W5x00 模块和 Arduino 以太网库进行通信。
基于 W5x00 系列电路的官方模块(包括其硬件等效产品,例如 OKYSTAR OKY2102 或 DFROBOT DFR0125)的显著优势在于,它们提供了全面的软件支持,即 Arduino 协议栈中内置的以太网库。因此,用户启动 Arduino IDE 后即可立即开始编写程序,无需安装任何其他软件包。
图 1 展示了配备 WI​​Znet W5100 控制器的 OKY2102(左)和 DFR0125(右)模块。


根据 WIZnet 系统版本和可用 RAM 容量的不同,以太网库最多支持四个(W5100 芯片且 RAM <= 2 kB)或八个(W5200 和 W5500 系统)并行传入/传出连接。该库的软件接口分为五个类,分别对应不同的功能。以太网类负责库的初始化和网络配置(包括 IP 地址、子网地址和接入网关设置)。IPAddress 类用于 IP 地址分配。要在 Arduino 端运行简单的服务器应用程序,需要 EthernetServer 类,该类允许从所有连接的设备读写数据。EthernetClient 类是一个补充类,只需几个简单的调用,即可创建一个功能齐全的网络客户端,该客户端可以执行从服务器写入和读取数据的操作。以太网库提供了 EthernetUDP 类用于 UDP 通信。有关这些类及其方法的完整描述,请访问:

Arduino平台的一个显著特点是,所有复杂的程序操作都直接在提供的库中实现:程序员可以使用功能有限但高度强大的API集,这使得应用程序开发过程快速高效,并且无需深入了解网络协议栈。因此,让我们分析一下使用以太网库构建的最简单服务器应用程序,该应用程序的任务是监听传入的Telnet客户端连接。.


服务器应用程序代码开始添加必要的头文件以建立 SPI 通信(WIZnet 模块使用此协议与微控制器交换数据)和以太网库头文件:
#include
#包括
下一步是配置网络参数(控制器 MAC 地址、接入网关 IP 地址和子网掩码),并在端口 23(Telnet 协议的默认端口)上创建监听器:
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192,168,1, 177);
IPAddress gateway(192,168,1, 1);
IPAddress subnet(255, 255, 0, 0);
EthernetServer server(23);


在 `setup()` 函数体中,需要初始化以太网库并启动监听过程。此外,还包含了串口配置,该配置将显示有关服务器地址、新客户端连接以及在已建立会话期间接收到的数据的消息:`
void setup() {
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
Serial.begin(9600);
while (!Serial) {
}
Serial.print("聊天服务器地址:");
Serial.println(Ethernet.localIP());
}`
程序的主循环 `loop()` 等待客户端连接并检查是否有可读数据。接收到数据后,它会将数据原封不动地发送回客户端,从而执行简单的回显功能:
`void loop() {
EthernetClient client = server.available();
if (client) {
if (!alreadyConnected) {
client.flush();
Serial.println("我们有一个新的客户端");`
client.println("你好,客户端!"); }`
alreadyConnected = true;
}
if (client.available() > 0) {
char thisChar = client.read();
server.write(thisChar);
Serial.write(thisChar);
}
}
}
可以使用任何 Telnet 协议客户端(例如 Windows 上的 PuTTY 或 Linux 上的 telnet 命令)或使用另一个 Arduino 板和 EthernetClient 类来测试上述应用程序的正确运行。
使用 ENC28J60 模块和外部库进行通信
除了官方支持的 WIZnet W5x00 板之外,还可以使用基于 ENC28J60 控制器的模块(例如 OKYSTAR、OKY3486 或 ETH CLICK)。由于其价格较低且易于手工安装(与采用 80 引脚 LQFP 封装的 W5x00 系统不同,ENC28J60 驱动器采用 SSOP、SOIC、28 引脚 QFN 封装和 SPDIP 孔对孔封装),该电路在业余电子爱好者中非常受欢迎。


图 2. 配备 ENC28J60 控制器的 OKY3486(左)和 ETH CLICK(右)模块


尽管 Arduino 官方并未提供支持,但许多开源库已提供给程序员使用,确保了 ENC28J60 芯片与软件的快速集成。尤其值得关注的是 UIPEthernet 库和基于 GPLv2 许可的 EtherCard 库。UIPEthernet 库的显著优势在于其 API 与官方 Arduino 以太网库兼容,使得应用程序开发过程无需考虑硬件层面选择 W5x00 还是 ENC28J60 系统。而 EtherCard 库则实现了一个独立的编程接口,对于程序员而言,这可能是一个不错的选择。.

与 Arduino 以太网库一样,实现一个相当复杂的功能(例如,实现 DHCP 客户端)只需几行代码:
#include
static byte mymac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte Ethernet::buffer[700];
void setup () {
Serial.begin(57600);
Serial.println(F("\n[testDHCP]"));
if (ether.begin(sizeof Ethernet::buffer, mymac, SS) == 0)
Serial.println(F("访问以太网控制器失败"));
Serial.println(F("设置 DHCP"));
if (!ether.dhcpSetup())
Serial.println(F("DHCP 失败"));
ether.printIp("我的 IP 地址:", ether.myip);
ether.printIp("子网掩码:", ether.netmask); ether.printIp
("网关 IP 地址:", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);
}
void loop () {
ether.packetLoop(ether.packetReceive());
}
内容由 Transfer Multisort Elektronik Sp. z oo