ESP8266服務器模式 發送數據和接收數據 模板1


功能如下:

1.將客戶端發來的數據轉發到串口;
2.串口數據轉發給所有客戶端
3.可連接4個客戶端
4.可設置靜態IP地址
5.指示燈閃爍表示無客戶端連接,燈亮代表有客戶端連接

/**
   功能:
   1.將客戶端發來的數據轉發到串口;
   2.串口數據轉發給所有客戶端
   3.可連接4個客戶端
   4.可設置靜態IP地址
   5.指示燈閃爍表示無客戶端連接,燈亮代表有客戶端連接
*/

#include <ESP8266WiFi.h>

//定義最多多少個client可以連接本server
#define MAX_SRV_CLIENTS 4

//路由器WIFI和密碼
const char* ssid = "wifi_name";
const char* password = "88888888";

//靜態地址、網關、子網掩碼
IPAddress local_IP(192, 168, 0, 200);
IPAddress gateway(192, 168, 0, 1);
IPAddress subnet(255, 255, 255, 0);

//創建server
WiFiServer server(8088);//端口號,隨意修改,范圍0-65535
//管理clients
WiFiClient serverClients[MAX_SRV_CLIENTS];

int a = 0; //連接狀態標識
int i = 0;//用於for循環

void setup() {
  //波特率
  Serial.begin(9600);
  //連接WIFI
  MyconnectWIFI();
  //啟動server
  server.begin();

  //定義輸入引腳
  pinMode(16, INPUT);//   D0
  pinMode(5, INPUT);//    D1
  pinMode(4, INPUT);//    D2
  pinMode(0, INPUT);//    D3

  //定義輸出引腳
  pinMode(2, OUTPUT);//     D4
  pinMode(14, OUTPUT);//    D5
  pinMode(12, OUTPUT);//    D6
  pinMode(13, OUTPUT);//    D7
  pinMode(15, OUTPUT);//    D8

  digitalWrite(2, LOW);//輸出低電平
  digitalWrite(14, HIGH);//輸出高電平
}

void loop() {
  //檢測新的Client
  NewClient();
  
  //LED指示燈
  LEDstate();
  
  //把收到的客戶端數據發送到串口
  ReceiveData();
  
  //串口數據發送到客戶端
  SendData();
}

//連接WIFI
void MyconnectWIFI() {

  WiFi.config(local_IP, gateway, subnet);//設置靜態IP
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);//路由器的WiFi名稱和密碼
  //  Serial.print("\nConnecting to ");
  //  Serial.println(ssid);
  
  //等待連接
  while (WiFi.status() != WL_CONNECTED && i++ < 200) {
    delay(500);
    Serial.print(".");
  }
  
  if (i == 201) {
  
    //    Serial.print("\nCould not connect to ");
    //    Serial.println(ssid);
    while (1) {
    }
    
  } else {
    //    Serial.print("\nReady! Use 'telnet ");
    //    Serial.print(WiFi.localIP());
    //    Serial.println(" 8088' to connect");
  }
}

//有客戶端連接時常亮,無連接時閃爍
void LEDstate() {
  //連接情況 用led燈的狀態顯示
  a = 0;
  for (int i = 0; serverClients[i].connected(); i++) {
    a = 1;
  }
  if (a == 0) {
    digitalWrite(2, HIGH);
    delay(500);
    digitalWrite(2, LOW);
    delay(500);
    //    Serial.println("no");
  } else {
    digitalWrite(2, LOW);
  }
}

//檢測新的client
void NewClient() {
  //檢測是否有新的client請求進來
  if (server.hasClient()) {
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
      //釋放舊無效或者斷開的client
      if (!serverClients[i] || !serverClients[i].connected()) {
        if (serverClients[i]) {
          serverClients[i].stop();
        }
        //分配最新的client
        serverClients[i] = server.available();
        //Serial.print("New client: ");
        //Serial.print(i);
        break;
      }
    }
    //當達到最大連接數 無法釋放無效的client,需要拒絕連接
    if (i == MAX_SRV_CLIENTS) {
      WiFiClient serverClient = server.available();
      serverClient.stop();
      //      Serial.println("Connection rejected ");
    }
  }
}

//把收到的客戶端數據發送到串口
void ReceiveData() {
  for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    if (serverClients[i] && serverClients[i].connected()) {
      while (serverClients[i].available())
      {
        uint8_t data = serverClients[i].read();
        Serial.println(data);
      }
    }
  }
}

//把串口數據發送到客戶端
void SendData() {
  if (Serial.available()) {   //串口讀取到的轉發到wifi,因為串口是一位一位的發送所以在這里緩存完再發送
    size_t counti = Serial.available();
    uint8_t sbuf[counti];
    Serial.readBytes(sbuf, counti);
    //Serial.write(sbuf, counti);
    //將數據發送給客戶端
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
      if (serverClients[i] && serverClients[i].connected()) {
        serverClients[i].write(sbuf, counti);
        delay(200);
      }
    }
  } else {
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
      //釋放舊無效或者斷開的client
      if (serverClients[i].connected()) {
        //serverClients[i].println("not data");
        delay(500);
      }
    }
  }
}






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM