/*
NodeMCU接入点模式
功能:
ESP8266接入点模式接收客户端信息,并发送到串口。


太极创客(http://www.taichi-maker.com)
2019-03-11
 
此程序用于演示如何将NodeMCU以接入点模式工作。通过此程序,您可以使用
电脑或者手机连接NodeMCU所建立WiFi网络。
 
网络名: taichi-maker
密码:12345678
 
如需获得更多关于如何使用NodeMCU开发物联网的教程和资料信息
请参考太极创客网站(http://www.taichi-maker.com)
并在首页搜索栏中搜索关键字:物联网
*/
 
#include <ESP8266WiFi.h>        // 本程序使用ESP8266WiFi库

// 设置wifi模块的最大连接数
#define MAX_CONNECT 5
int incomingByte = 0; // for incoming serial data
const char *ssid = "taichi-maker"; // 这里定义将要建立的WiFi名称。此处以"taichi-maker"为示例
 
const char *password = "12345678";  // 这里定义将要建立的WiFi密码。此处以12345678为示例
                                    
const int SERVER_PORT = 80;         //端口号,随意修改,范围0-65535
//设置IP地址
IPAddress local_IP(192, 168, 1, 1); 
// 设置网关
IPAddress gateway(192, 168, 1, 1);
// 设置子网掩码
IPAddress subnet(255, 255, 255, 0); 
// wifiServer服务
WiFiServer WiFi_Server(SERVER_PORT);
// wificlient对象,因为我们要想办法实现多个连接,所以我们创建一个指针数组来存储连接对象
WiFiClient *WiFi_Client[MAX_CONNECT] = {0} ;
// 临时wifi连接
WiFiClient WiFi_Client_Tmp;
void serialrec(){                   //接收并发送串口inxi 
     if (Serial.available() > 0) {
    // read the incoming byte:
    incomingByte = Serial.read();
    // say what you got:
    Serial.print("I received: ");    
    Serial.println(incomingByte,BIN);
    Serial.println(incomingByte,HEX);
    Serial.println(incomingByte,DEC);  
  }
}
void APclient(){//接收客户端的信息发送到串口上
// 判断是否有新的连接
  WiFi_Client_Tmp = WiFi_Server.available();
  // 判断这个连接是否有效
  if(WiFi_Client_Tmp.connected()){
    Serial.println("new connect");
    // 如果有效,那么设置连接发送数据不延时
    WiFi_Client_Tmp.setNoDelay(true);
    // 使用for循环来遍历我们的连接池
    for(int i =0; i< MAX_CONNECT; i++){//遍历最大连接对象
      // 因为连接池里面可能会有连接,所以我们需要找到一个空的位置放入连接对象
      if (WiFi_Client[i] == 0 || !WiFi_Client[i]->connected()){
        // 我们新建一个TCP连接,然后把这个连接放入我们的连接池,放入后跳出循环
        WiFi_Client[i] = new WiFiClient(WiFi_Client_Tmp);
        break;
      }
    }
  }
  // 我们遍历连接池来接收数据
  for(int i =0; i< MAX_CONNECT; i++){
     // 先判断连接池里面的连接是否有效
     if (WiFi_Client[i] != 0 && WiFi_Client[i]->connected()){
        // 如果有效,尝试获取tcp发送的数据
        if (WiFi_Client[i]->available() > 0){
          // 这里说明有数据,我们直接读取tcp连接发送的数据
          //String data = "get data" + WiFi_Client[i]->readStringUntil('\n');
          String data =WiFi_Client[i]->readStringUntil('\n');
          // 打印发送的数据
          Serial.println(data);
        }
    }
  }
 
}
void setup() {
  // 启动串口通讯波特率为115200
  Serial.begin(115200);            
  // 设置wifi模块为AP模式 
  WiFi.mode(WIFI_AP);
  // 设置IP地址网关和子网掩码  
  WiFi.softAPConfig(local_IP, gateway, subnet);  
  // 设置wifi的名字和密码
  WiFi.softAP(ssid, password);      // 此语句是重点。WiFi.softAP用于启动NodeMCU的AP模式。
                                    // 这两个参数具体内容在setup函数之前的位置进行定义。
  WiFi_Server.begin();
  Serial.print("Access Point: ");    // 通过串口监视器输出信息
  Serial.println(ssid);              // 告知用户NodeMCU所建立的WiFi名
  Serial.print("IP address: ");      // 以及NodeMCU的IP地址
  Serial.println(WiFi.softAPIP());   // 通过调用WiFi.softAPIP()可以得到NodeMCU的IP地址
} 
void loop() { 
  //serialrec();
  APclient();
}

整个程序还有一点问题就是,接收客户端信息的速度很慢,5秒才能将数据传送到串口上。