|
最近看着大神们的帖子,也动手试验了一些例子,自己结合了大神们的代码弄了一个在局域网WiFi的应用,简单来说就是ESP8266只做一个透传功能,将串口数据通过TCP的方式传送到其他其他局域网的工具;
示意图:
硬件比较简陋:
具体代码:
#include <ESP8266WiFi.h>
#include<cstring>
#define MAX_SRV_CLIENTS 20 //最大同时联接数
#define led 2
const char* ssid = "XXXXX"; // XXXXXX -- 使用时请修改为当前你的 wifi ssid
const char* password = "XXXXXX"; // XXXXXX -- 使用时请修改为当前你的 wifi 密码
const unsigned long BAUD_RATE = 9600; // 串口波特率
const unsigned long HTTP_TIMEOUT = 5000; // 服务器超时时间
WiFiServer server(8266);//你要的端口号,随意修改,范围0-65535
WiFiClient serverClients[MAX_SRV_CLIENTS];
void setup() {
WiFi.mode(WIFI_AP_STA); //设置esp8266 工作模式
Serial.begin(BAUD_RATE,SERIAL_8N1); // 串口定义波特率
pinMode(led,OUTPUT);
digitalWrite(led, HIGH);
delay(2000);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
//这个函数是wifi连接状态,返回wifi链接状态
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
delay(500);
Serial.println("IP address: ");
Serial.println(WiFi.localIP());//WiFi.localIP()返回8266获得的ip地址,路由器分配的地址
server.begin();//服务器开始
server.setNoDelay(true);
}
void loop()
{
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();
if (serverClient)
{
serverClient.stop();
}
}
for (i = 0; i < MAX_SRV_CLIENTS; i++)
{
if (serverClients[i] && serverClients[i].connected())
{
//处理客户端发过来的数据
if (serverClients[i].available())
{
while (serverClients[i].available())
{
Serial.write(serverClients[i].read());
}//串口打印客户端发的数据
delay(200);
while(Serial.available()>0)
{
String comdata = "";
comdata +=char(Serial.read());
int data_len = comdata.length()+1;
char a[data_len] ;
delay(2);
comdata.toCharArray(a,data_len);
if (comdata.length() > 0)
{
serverClients[i].write(a);//串口接收数据发给客户端
comdata = "";
}
}
}
}
}
}
可以加我qq共同学习;
|
|