新闻  |   论坛  |   博客  |   在线研讨会
给ESP8266插上翅膀,翱翔云端
Linux嵌入式 | 2023-01-05 11:59:04    阅读:141   发布文章

TCP Server通信是我们常用的也是比较重要的一部分,通过这篇文章我们来了解一下如何配置ESP8266使其作为服务器来工作。

使用流程:

· 引用相关库#include <ESP8266WiFi.h>;

· 配置ESP8266为Station模式连接WIFI,获取模块的IP地址;

· 声明WiFiServer对象;

· 使用begin方法启动监听;

· 监听客户端连接并处理数据通讯;

相关函数

1.Server

服务器是所有基于WiFi Server的基类。它不是直接调用的,而是在您使用依赖它的函数时调用。

2.WiFi.Server()

描述

创建一个服务器,以侦听指定端口上的连接。

句法

Server(port);

参数

port:侦听的端口(int)

返回值:没有

WiFiServer server(80);

3.begin()

告诉服务器开始侦听传入的连接。

句法

server.begin()

参数:没有

返回值:没有

4.available()

描述

获取连接到服务器并具有可读取数据的客户端。当返回的客户端对象超出范围时,连接将保留。您可以通过调用client .stop()关闭它。

available()从Stream实用程序类继承。

句法

server.available()

参数:没有

返回值:

客户对象;如果没有客户端可读取的数据,则该对象在if语句中的值为false

5.write()

描述

将数据写入连接到服务器的所有客户端。

句法

server.write(数据)

参数

data:要写入的值(字节或字符)

返回值

byte:写入的字节数。无需读取。

7.print()

描述

将数据打印到连接到服务器的所有客户端。将数字打印为数字序列,每个数字为一个ASCII字符(例如,数字123作为三个字符" 1"," 2"," 3"发送)。

句法:

server .print(数据)server server .print(数据,BASE)

参数:

data:要打印的数据(char,byte,int,long或string)

BASE(可选):打印数字的基数:BIN(二进制)(基数2),DEC(十进制)(基数10),OCT(八进制)(基数8),HEX(十六进制)(基数16)。

返回值

返回写入的字节数,但读取号是可选的

8.println()

向连接到服务器的所有客户端打印数据,后跟换行符。将数字打印为数字序列,每个数字为一个ASCII字符(例如,数字123作为三个字符" 1"," 2"," 3"发送)。

例程

该例程实现的功能是当浏览器访问时将模拟引脚的电压值返回并在浏览器上显示出来。需要注意的是我们在获取到模块的IP地址后,要使电脑和模块在同一个局域网里面,然后在浏览器输入模块的地址访问即可。

#include <ESP8266WiFi.h>

const char* ssid = "********";

const char* password = "********";

WiFiServer server(80);

void setup()

{

Serial.begin(115200);

Serial.println();

Serial.printf("Connecting to %s ", ssid);

WiFi.begin(ssid, password);

while (WiFi.status() != WL_CONNECTED)

{

delay(500);

Serial.print(".");

}

Serial.println(" connected");

server.begin();

Serial.printf("Web server started, open %s in a web browser\n", WiFi.localIP().toString().c_str());

}

// prepare a web page to be send to a client (web browser)

String prepareHtmlPage()

{

String htmlPage =

String("HTTP/1.1 200 OK\r\n") +

"Content-Type: text/html\r\n" +

"Connection: close\r\n" + // the connection will be closed after completion of the response

"Refresh: 5\r\n" + // refresh the page automatically every 5 sec

"\r\n" +

"<!DOCTYPE HTML>" +

"<html>" +

"Analog input: " + String(analogRead(A0)) +

"</html>" +

"\r\n";

return htmlPage;

}

void loop()

{

WiFiClient client = server.available();

// wait for a client (web browser) to connect

if (client)

{

Serial.println("\n[Client connected]");

while (client.connected())

{

// read line by line what the client (web browser) is requesting

if (client.available())

{

String line = client.readStringUntil('\r');

Serial.print(line);

// wait for end of client's request, that is marked with an empty line

if (line.length() == 1 && line[0] == '\n')

{

client.println(prepareHtmlPage());

break;

}

}

}

delay(1); // give the web browser time to receive the data

// close the connection:

client.stop();

Serial.println("[Client disonnected]");

}

}

运行结果:



*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。

参与讨论
登录后参与讨论
工科男,多年嵌入式工作者,每日分享工作中常遇到的一些“坑”
推荐文章
最近访客