ESP8266局域网 路由器下作服务器模式串口透传 arduino uno示例 模板参考2

ESP8266服务器模式串口透传编译需要下载8266的库文件后才可以正常

准备工作

下载一个Arduino IDE,
下载8266的库文件
ESP8266服务器模式串口透传编译

功能说明

1、直接使用路由器中转数据
2、手机放热点模式直接传输数据
两者有访问IP地址的差别,起始地址不同,

#include <ESP8266WiFi.h>
#define MAX_SRV_CLIENTS 4   //最大同时联接数,即你想要接入的设备数量,8266tcpserver只能接入五个

const char *ssid = "icloud"; ////这里是我的wifi,你使用时修改为你要连接的wifi ssid
const char *password = "12345678"; //你要连接的wifi密码

IPAddress local_IP(192, 168, 43, 181);//加入路由器时192, 168, 0, 1开始或根据路由分配的起始IP可到路由器中查看
IPAddress gateway(192, 168, 43, 1);//加入路由器时192, 168, 0, 1/手机自建服务器时路由网关192, 168, 43, 1
IPAddress subnet(255, 255, 255, 0);

WiFiServer server(8266);//你要的端口号,随意修改,范围0-65535
WiFiClient serverClients[MAX_SRV_CLIENTS];
int a = 0; //连接状态标识
int i = 0;//用于for循环
void setup()
{
    Serial.begin(9600);
    delay(10);
    pinMode(16, OUTPUT);//   D0
    digitalWrite(16, 0);
    //定义输入引脚
   
    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, HIGH);//输出低电平
    digitalWrite(14, LOW);
    
    WiFi.config(local_IP, gateway, subnet);//192.168.0.200
    WiFi.mode(WIFI_STA);
    WiFi.begin(ssid, password);

    while (WiFi.status() != WL_CONNECTED)
    {
        delay(500);
    }
    server.begin();
    server.setNoDelay(true);  //加上后才正常些
}

void loop()
{
    blink();

    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();//分配新的
                continue;
            }

        }
        WiFiClient serverClient = server.available();
        serverClient.stop();
    }
    for (i = 0; i < MAX_SRV_CLIENTS; i++)
    {
        if (serverClients[i] && serverClients[i].connected())
        {
            digitalWrite(16, 0);//有链接存在,就一直长亮

//            if (serverClients[i].available())   //直接转发客户端数据
//            {
//                while (serverClients[i].available()) 
//                    Serial.write(serverClients[i].read());
//            }
        }
    }
    //把串口数据发送到客户端
    if (Serial.available())
    {
        size_t len = Serial.available();
        uint8_t sbuf[len];
        Serial.readBytes(sbuf, len);
        //push UART data to all connected telnet clients
        for (i = 0; i < MAX_SRV_CLIENTS; i++)
        {
            if (serverClients[i] && serverClients[i].connected())
            {
                serverClients[i].write(sbuf, len);  //向所有客户端发送数据
                delay(1);
            }
        }
    }
    //把收到的客户端数据发送到串口
    for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    if (serverClients[i] && serverClients[i].connected()) {
      while (serverClients[i].available())
      {
        char data = serverClients[i].read();
        Serial.println(data);
        switch (data) {
          case 'A':
          digitalWrite(14, HIGH);//输出低电平 
            break;
            case 'B':
          digitalWrite(14, LOW);//输出低电平 
            break;
            default:           //以上条件都不满足
          printf("error\n");
            break;
            }
      }
    }
  }
    
}

//连接情况 用led灯的状态显示
void blink()
{
    static long previousMillis = 0;
    static int currstate = 0;

    if (millis() - previousMillis > 200)  //200ms
    {
        previousMillis = millis();
        currstate = 1 - currstate;
        digitalWrite(16, currstate);
    }
}

https://blog.csdn.net/v86337286/article/details/103020239

posted @ 2020-06-06 21:19  icloudelectron  阅读(799)  评论(0编辑  收藏  举报