
功能如下:
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);
}
}
}
}