以太网简介
以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。
优点:成本低、通信速率高、抗干扰性强。
标准以太网:10Mbit/S
快速以太网:100Mbit/S
千兆以太网:1000Mbit/S
TCP通信服务端
#include <ETH.h> //引用以使用ETH
#include <Ethernet.h> //引用以使用ETH
#include <Arduino.h> //引用以使用ETH
#include <Ticker.h> //引用以使用ETH
#include <Timer.h> //引用以使用ETH
#include <WiFiUdp.h>
#include <WiFi.h>
#include <WiFiClient.h>
#define ETH_ADDR 0//PHY地址和板子上对应,默认是0
#define ETH_POWER_PIN -1
#define ETH_MDC_PIN 23
#define ETH_MDIO_PIN 18
#define LED 2
#define ETH_TYPE ETH_PHY_LAN8720
#define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT
#define ETH_RESET 5//ESP32的io5可控制以太网模块复位,低电平有效,不用时可不用配置
#define MAX_SRV_CLIENTS 5 //定义可连接的客户端数目最大值 不能超过5个
WiFiServer server(8266);//设置服务器端口8266
WiFiClient serverClients[MAX_SRV_CLIENTS]; //客户端连接
IPAddress local_IP(192,168,1,10);
IPAddress gateway(192,168,1,9);
IPAddress subnet(255,255,255,0);
IPAddress dns(192, 168, 1,1);
String aa = "";//接收到客户端的数据
int ii=0;//当前客户
uint8_t str[]={"Ok"}; //回复客户端
void setup()
{
Serial.begin(115200);
//WiFi.softAPConfig(local_IP, gateway, subnet);//配置接入点的IP,网关IP,子网掩码
// WiFi.config(local_IP,gateway,subnet, dns , dns);
pinMode(LED, OUTPUT);
pinMode(ETH_RESET, OUTPUT);
digitalWrite(ETH_RESET, HIGH); //以太网复位
Serial.println();
ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK_MODE); //启用ETH
while(!((uint32_t)ETH.localIP())) //等待获取到IP
{
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(ETH.localIP()); //获取自身IP地址
//Serial.print("gateway Address:");
//Serial.println(ETH.gateway());
//Serial.print("subnet Address:");
//Serial.println(ETH.subnet());
digitalWrite(LED, LOW);
//启动传输和服务器
server.begin();
server.setNoDelay(true);
String macAddress();
Serial.print("ETH MAC: ");
Serial.println(ETH.macAddress());//获取自身MAC地址
}
void loop()
{
uint8_t i;
//检测服务器端是否有活动的客户端连接
if (server.hasClient()){
for(i = 0; i < MAX_SRV_CLIENTS; i++){
//查找空闲或者断开连接的客户端,并置为可用
if (!serverClients[i] || !serverClients[i].connected())
{
if(serverClients[i]) serverClients[i].stop();
serverClients[i] = server.available();
Serial.print("New client: "); Serial.println(i);
continue;
}
}
//若没有可用客户端,则停止连接
WiFiClient serverClient = server.available();
serverClient.stop();
}
//检查客户端的数据
for(i = 0; i < MAX_SRV_CLIENTS; i++)
{
ii=i;
if (serverClients[i] && serverClients[i].connected()) //已经连接的客户端
{
if(serverClients[i].available()) //检测是否有客户端发数据
{
while(serverClients[i].available()) //接收客户端数据
{
aa += char(serverClients[i].read()); //
//String response = clients[i].readStringUntil('\n');
// Serial.println("Response from server: " + response);
}
delay(2);
Serial.print("aa:");
Serial.println(aa);
serverClients[i].write(str,2); //回复客户端
}
if (aa.length() > 0)
{
Serial.println(aa);
aa = ""; //清除数据
}
}
}
}
接收数据时候要注意,用char(serverClients[i].read())进行接收,这样不会限制速率,对方发多快就收多快。用String response = clients[i].readStringUntil(‘\n’) 接收数据,速度会非常慢,对方发很快自己这边收的很慢。
TCP通信客户端
#include <ETH.h> //引用以使用ETH
#include <Arduino.h> //引用以使用ETH
#include <Ticker.h> //引用以使用ETH
#include <Timer.h> //引用以使用ETH
#include <WiFiUdp.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <HTTPClient.h>
#define ETH_ADDR 0//PHY地址和板子上对应,默认是0
#define ETH_POWER_PIN -1
#define ETH_MDC_PIN 23
#define ETH_MDIO_PIN 18
#define LED 2
#define ETH_TYPE ETH_PHY_LAN8720
#define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT
#define ETH_RESET 5//ESP32的io5可控制以太网模块复位,低电平有效,不用时可不用配置
const char *host = "192.168.1.13";//tcp服务器地址
WiFiClient client;
const int tcpPort = 8266;//服务器端口
uint8_t str[]={"client2"};
void setup()
{
Serial.begin(115200);
pinMode(LED, OUTPUT);
pinMode(ETH_RESET, OUTPUT);
digitalWrite(ETH_RESET, HIGH);
Serial.println();
ETH.begin(ETH_ADDR, ETH_POWER_PIN, ETH_MDC_PIN, ETH_MDIO_PIN, ETH_TYPE, ETH_CLK_MODE); //启用ETH
while(!((uint32_t)ETH.localIP())) //等待获取到IP
{
}
Serial.println("Connected");
Serial.print("IP Address:");
Serial.println(ETH.localIP()); //获取自身IP地址
digitalWrite(LED, LOW);
String macAddress();
Serial.print("ETH MAC: ");
Serial.println(ETH.macAddress()); //获取自身mac地址
}
void loop()
{
while (!client.connected())//连接tcp服务器
{
if (!client.connect(host, tcpPort))
{
Serial.println("connection....");
delay(5);
}
}
delay(5000);
client.write(str,7); //发送数据
while (client.available()) //等待客户端的数据
{
Serial.println("Connected");
char val = client.read();
Serial.print("val:");
Serial.println(val);
if(val=='a')
{
digitalWrite(LED, HIGH);
delay(1000);
digitalWrite(LED, LOW);
client.print("bb");
client.flush();
}
}
}