查看: 63198|回复: 84

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

  [复制链接]

该用户从未签到

发表于 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中





该用户从未签到

发表于 2015-11-30 18:52 | 显示全部楼层
果然是很牛
有网页控制的例子不?

该用户从未签到

发表于 2015-12-12 23:57 | 显示全部楼层
从头又看了一遍,顶LZ

该用户从未签到

发表于 2016-1-8 00:12 | 显示全部楼层
楼主,8266可以保存数据吗?   代码怎么写??  谢谢!

该用户从未签到

发表于 2016-1-27 15:56 | 显示全部楼层
大神请问第一个程序为何会提示:

该用户从未签到

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

  blink();

        ^

exit status 1
'blink' was not declared in this scope

该用户从未签到

发表于 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模式是有这个指令的

该用户从未签到

发表于 2016-3-29 21:09 | 显示全部楼层
有直接连,中间不接路由器的吗?[face111.gif]

该用户从未签到

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

本版积分规则

arduino程序设计基础 blinker物联网解决方案

热门推荐

关于红外的求助
关于红外的求助
为什么红外发射出的跟我设定的不一样,如图,我两个板子一个发射,一个接收,我想要发
【Arduino】168种传感器模块系列实验(104)---MAX30102手腕心率
【Arduino】168种传感器模
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是
[Arduino物联网开发实战5]云端历史数据存储与查看
[Arduino物联网开发实战5]
blinker提供了历史数据存储与图表查看数据的功能。 设备端开发 在blinker的设计下,设
程序卡着不动,最后打印Freeheap 25427
程序卡着不动,最后打印Fr
各位有见过这个错误吗,程序跑到这里卡着不动
通过定时器读取串口数据出错
通过定时器读取串口数据出
各位大佬好,本人通过树莓派和Arduino通信,一边接收Arduino传感器数据,一边给Arduin
Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
快速回复 返回顶部 返回列表