ESP8266服务器模式 发送数据和接收数据 模板1

功能如下:
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);
      }
    }
  }
}
ESP8266服务器模式 发送数据和接收数据 模板1的更多相关文章
- Java基础知识强化之网络编程笔记06:TCP之TCP协议发送数据 和 接收数据
		1. TCP协议发送数据 和 接收数据 TCP协议接收数据:• 创建接收端的Socket对象• 监听客户端连接.返回一个对应的Socket对象• 获取输入流,读取数据显示在控制台• 释放资源 TCP协 ... 
- Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据
		1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源 UDP协议接 ... 
- STM32输入捕获模式设置并用DMA接收数据
		参考: STM32的PWM输入模式设置并用DMA接收数据 Input capture mode The input stage samples the corresponding TIx input ... 
- WPF内实现与串口发送数据和接收数据
		原文:WPF内实现与串口发送数据和接收数据 与串口发送数据和接收数据,在此作一个简单的Demo.此Demo可以实现按下硬件按钮,灯亮,发送灯状态数据过来.并且可以实现几个灯同时亮,发送灯的状态数据过来 ... 
- STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085和串口只发送数据不能接收数据问题
		STM32移植RT-Thread后的串口在调试助手上出现:(mq != RT_NULL) assert failed at rt_mq_recv:2085的问题讨论:http://www.rt-thr ... 
- Java Socket 服务端发送数据 客户端接收数据
		服务端: package com.thinkgem.wlw.modules.api.test.socket; /** * @Author: zhouhe * @Date: 2019/4/8 9:30 ... 
- 说说ajax上传数据和接收数据
		我是一个脑袋不太灵光的人,所以遇到问题,厚着脸皮去请教大神的时候,害怕被大神鄙视,但是还是被鄙视了.我说自己不要点脸面,那是不可能的,但是,为了能让自己的技术生涯能走的更长远一些,受点白眼,受点嘲笑也 ... 
- MVC系列学习(五)-传递数据 与 接收数据
		1.控制器向视图传递数据 a.使用ViewData b.使用ViewBag c.使用Model 方式二: d.使用TempData 2.为什么在控制器中设置了一些属性,在视图中可以接受 3.Actio ... 
- ASP.NET 最全的POST提交数据和接收数据 —— (1) 用url传参方式
		//1.对象提交,字典方式 //接口方:public ActionResult GetArry(Car model) public void PostResponse() { HttpWebReque ... 
随机推荐
- SpringBoot瘦身
			1.介绍 本教程中,我们将研究如何使用spring-boot-thin-launcher项目来将Spring Boot项目瘦身. Spring Boot出了名的把所有依赖打包成单个可执行的Fat JA ... 
- 愉快地使用Windows Terminal
			有了Windows Terminal 你再也不需要其他任何终端了-- 下载 直接到Windows 10 自带的应用商店下载安装.参考: https://github.com/Microsoft/Ter ... 
- vue项目报错Missing space before function parentheses的问题
			问题描述为——函数括号前缺少空格 导致原因主要是,使用eslint时,严格模式下,会报错Missing space before function parentheses的问题,意思是在方法名和刮号之 ... 
- 【解决办法】IIS环境中,打开网站后就直接列出了所有文件
			有时候访问一个不应当被访问的网站目录时网站会列出该目录下的所有文件,这很不安全,尤其是我们希望我们自己的网站不出现这种情况,如下图所示. 解决办法,在网站根目录新建web.config文件,内容如下: ... 
- [工具推荐]002.SoftOrbits Sketch Drawer使用教程
			SoftOrbits Sketch Drawer是一款简单易用的照片素描化软件,内置多种预设方案以及丰富的自定义细节. 只需要一次轻轻的鼠标点击,就可以帮助你迅速的将家人的照片转换为黑白或者彩色的素描 ... 
- 创建多线程的方式&Thread类的常用方法
			创建多线程的第一种方式:继承java.lang.Thread类 注意:1.一个线程只能执行一次start() 2.不能通过Thread实现类对象的 run()去启动一个线程 3.增加加一个线程,需要新 ... 
- 使用Redis分布式锁实现主备
			使用Redis分布式锁实现集群的主备 最近工作中遇到一个问题,我们会调用业务部门提供的HTTP接口获取所有的音视频任务信息,这些任务会被分发到各个机器节点进行处理.有两个方案: 方案一 为每台机器编号 ... 
- 05 . 前端之BootStrap
			BootStrap简介 Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML.CSS.JavaScript 开发的简洁.直观.强悍的前端开 ... 
- JAVA实现对称加密
			个人博客网:https://wushaopei.github.io/ (你想要这里多有) 一.对称加密算法DES 1.概述:采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这 ... 
- Java实现 LeetCode 146 LRU缓存机制
			146. LRU缓存机制 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ... 
