查看: 54964|回复: 79

基于esp8266的智能家居控制系统-局域网篇2,tcpserver

  [复制链接]
  • TA的每日心情
    慵懒
    2018-11-12 08:58
  • 签到天数: 37 天

    [LV.5]常住居民I

    发表于 2015-11-30 12:53 | 显示全部楼层 |阅读模式
    本帖最后由 跑龙套的保 于 2019-4-4 14:39 编辑

    继续更点吧,有兴趣的盆友加群104345601,通过前面几篇的学习我们使用8266作为客户端接入电脑或者手机建立的服务器,那么可不可以把一个8266作为服务器,其他的多个8266或者其他设备作为客户端,建立一个tcp网络呢,答案是可以的,今天我们学习一个8266建立tcpserver,其他作为client。我们依然是让所有的8266接入同一个wifi网络,然后在网络中建立tcpserver,示意如下
    HIP9{AJDS2Y~O]1QWN8M5LC.png

    当然也可以用8266建立热点让其他设备连接,但是8266内存和接入数量有限,我们就不用8266建立热点这种方法了,示意如下
    WN8M5LC.png

    第一步我们至少需要准备两个esp8266,我们命名为A,B

    第二步,我们先建立tcpserver,在8266A中烧写如下代码,
    1. #include <ESP8266WiFi.h>
    2. #define MAX_SRV_CLIENTS 3   //最大同时联接数,即你想要接入的设备数量,8266tcpserver只能接入五个,哎

    3. const char *ssid = "bao"; ////这里是我的wifi,你使用时修改为你要连接的wifi ssid
    4. const char *password = "123456780w"; //你要连接的wifi密码

    5. WiFiServer server(8266);//你要的端口号,随意修改,范围0-65535
    6. WiFiClient serverClients[MAX_SRV_CLIENTS];

    7. void setup()
    8. {
    9.   Serial.begin(115200);
    10.   delay(10);
    11.   pinMode(16, OUTPUT);
    12.   digitalWrite(16, 0);
    13.   WiFi.begin(ssid, password);

    14.   while (WiFi.status() != WL_CONNECTED)
    15.   {
    16.     delay(500);
    17.   }
    18.   server.begin();
    19.   server.setNoDelay(true);  //加上后才正常些
    20. }

    21. void loop()
    22. {
    23.   blink();

    24.   uint8_t i;
    25.   if (server.hasClient())
    26.   {
    27.     for (i = 0; i < MAX_SRV_CLIENTS; i++)
    28.     {
    29.       if (!serverClients[i ] || !serverClients[i ].connected())
    30.       {
    31.         if (serverClients[i ]) serverClients[i ].stop();//未联接,就释放
    32.         serverClients[i ] = server.available();//分配新的
    33.         continue;
    34.       }

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

    44.       if (serverClients[i ].available())
    45.       {
    46.         while (serverClients[i ].available())
    47.           Serial.write(serverClients[i ].read());
    48.       }
    49.     }
    50.   }
    51.   if (Serial.available())
    52.   {
    53.     size_t len = Serial.available();
    54.     uint8_t sbuf[len];
    55.     Serial.readBytes(sbuf, len);
    56.     //push UART data to all connected telnet clients
    57.     for (i = 0; i < MAX_SRV_CLIENTS; i++)
    58.     {
    59.       if (serverClients[i ] && serverClients[i ].connected())
    60.       {
    61.         serverClients[i ].write(sbuf, len);  //向所有客户端发送数据
    62.         delay(1);
    63.       }
    64.     }
    65.   }
    66. }


    67. void blink()
    68. {
    69.   static long previousMillis = 0;
    70.   static int currstate = 0;

    71.   if (millis() - previousMillis > 200)  //200ms
    72.   {
    73.     previousMillis = millis();
    74.     currstate = 1 - currstate;
    75.     digitalWrite(16, currstate);
    76.   }
    77. }
    复制代码


    第三步,在8266B中烧写,如下代码,其实就是前面的透传

    1. /*这篇把8266作为TCPcleint,加入手机创建的tcpServer中
    2. 来控制一个继电器*/
    3.   
    4. #include <ESP8266WiFi.h>
    5.   
    6. #define relay1 2 //继电器连接在8266的GPIO2上
    7. const char *ssid     = "KMYZ8HL";//这里是我的wifi,你使用时修改为你要连接的wifi ssid
    8. const char *password = "kmyz6051180";//你要连接的wifi密码
    9. const char *host = "192.168.191.4";//修改为手机的的tcpServer服务端的IP地址,即手机在路由器上的ip
    10. WiFiClient client;
    11. const int tcpPort = 8266;//修改为你建立的Server服务端的端口号

    12. void setup()
    13. {
    14.     Serial.begin(115200);
    15.     delay(10);
    16.     Serial.println();
    17.     Serial.println();
    18.     Serial.print("Connecting to ");//写几句提示,哈哈
    19.     Serial.println(ssid);
    20.   
    21.     WiFi.begin(ssid, password);
    22.   
    23.     while (WiFi.status() != WL_CONNECTED)//WiFi.status() ,这个函数是wifi连接状态,返回wifi链接状态
    24.                                          //这里就不一一赘述它返回的数据了,有兴趣的到ESP8266WiFi.cpp中查看
    25.     {
    26.         delay(500);
    27.         Serial.print(".");
    28.     }//如果没有连通向串口发送.....
    29.   
    30.     Serial.println("");
    31.     Serial.println("WiFi connected");
    32.     Serial.println("IP address: ");
    33.     Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的ip地址
    34. }
    35.   
    36. void loop()
    37. {
    38.     while (!client.connected())//几个非连接的异常处理
    39.     {
    40.         if (!client.connect(host, tcpPort))
    41.         {
    42.             Serial.println("connection....");
    43.             //client.stop();
    44.             delay(500);
    45.   
    46.         }
    47.     }
    48. while (client.available())//改动的就这里啦,无线读取到的数据转发到到串口
    49.     {
    50.         uint8_t c = client.read();
    51.         Serial.write(c);
    52.     }


    53.     if (Serial.available())//串口读取到的转发到wifi,因为串口是一位一位的发送所以在这里缓存完再发送
    54.     {
    55.         size_t counti = Serial.available();
    56.         uint8_t sbuf[counti];
    57.         Serial.readBytes(sbuf, counti);
    58.         client.write(sbuf, counti);

    59.     }
    60.   
    61.   
    62. }
    复制代码


    分别把他们接在两个串口上,两个串口就可以互相无线通信了,
    手机和电脑也可以作为client接入这个server中





  • TA的每日心情
    奋斗
    2019-11-17 22:36
  • 签到天数: 737 天

    [LV.9]以坛为家II

    发表于 2015-11-30 18:52 | 显示全部楼层
    果然是很牛
    有网页控制的例子不?
  • TA的每日心情
    开心
    2017-10-19 17:48
  • 签到天数: 45 天

    [LV.5]常住居民I

    发表于 2015-12-12 23:57 | 显示全部楼层
    从头又看了一遍,顶LZ
  • TA的每日心情

    2018-7-7 14:15
  • 签到天数: 273 天

    [LV.8]以坛为家I

    发表于 2016-1-8 00:12 | 显示全部楼层
    楼主,8266可以保存数据吗?   代码怎么写??  谢谢!
  • TA的每日心情
    无聊
    2016-1-2 08:59
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2016-1-27 15:56 | 显示全部楼层
    大神请问第一个程序为何会提示:
  • TA的每日心情
    无聊
    2016-1-2 08:59
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2016-1-27 15:56 | 显示全部楼层
    error: 'blink' was not declared in this scope

      blink();

            ^

    exit status 1
    'blink' was not declared in this scope
  • TA的每日心情
    慵懒
    2017-2-6 16:52
  • 签到天数: 43 天

    [LV.5]常住居民I

    发表于 2016-1-31 12:39 | 显示全部楼层
    楼主这个系列看完了,非常不错,用arduino1.6.5 for esp8266的IDE,使用里面的例子代码发现如下问题:

    WiFiClient client;
       const int httpPort = 88;
      if (!client.connect(host, httpPort)) {
        Serial.println("connection failed");
        return;
      }
    这是的loop里面的一段,用来连接web server 发送心跳数据包,5秒一次。
    但是,循环4次之后就断开了,再也连不上,一直提示connection failed

    为是排除服务器的问题,自建了服务器也一样不行。。
    认真研究了WiFiClient .cpp,好像每次发完数据后,不用close掉连接,我记得AT模式是有这个指令的
  • TA的每日心情
    开心
    2017-2-21 10:18
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2016-3-29 21:09 | 显示全部楼层
    有直接连,中间不接路由器的吗?[face111.gif]
  • TA的每日心情
    开心
    2017-2-21 10:18
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2016-5-6 15:42 | 显示全部楼层
    连接不是服务器
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    为拍月亮而生的便携望远镜系统。
    为拍月亮而生的便携望远镜
    参赛项目: 便携望远镜系统 参赛组员: 1人 布丁:嵌入式软件、上位机软件、电路、结
    基于机器视觉的智能分拣机械臂
    基于机器视觉的智能分拣机
    本作品是一个基于机器视觉的智能机械臂操作平台,其采用atmega32单片机作为主控制系统
    小白求助
    小白求助
    也许我这个问题也许看起来有些幼稚。。。 还在入门的路上打滚,在看《爱上Arduino》这
    SpiderRobot 蜘蛛
    SpiderRobot 蜘蛛
    关于SpiderRobot 项目实行方案 之前有人推荐我做这个项目,于是乎就有了这个 h
    没有合适的模块,想到自己焊接芯片
    没有合适的模块,想到自己
    有些模块没有加工过的模块销售,想着自己要是能把芯片焊在一起也是一样的。只是这个尺
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表