Arduino-ESP32用以太网对服务端和客户端进行TCP传输代码

5 篇文章 0 订阅
1 篇文章 0 订阅

以太网简介

以太网是一种计算机局域网技术。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();
        }
    }  
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值