首先在Ubuntu上利用Flask搭建一个简单的服务器,并且打开
利用配置好ESP32的Arduino开发环境后自带的"WiFi.h"搭建一个简单的客户端
#include <WiFi.h>
const char *ssid = "****";
const char *password = "********";
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
Serial.println("Try Connecting to ");
Serial.println(ssid);
// Connect to your wi-fi modem
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected successfully");
}
void loop() {
// put your main code here, to run repeatedly:
WiFiClient client;
Serial.println("try");
if (client.connect("192.168.4.126", 8080)) //80为一般网站的端口号
{
Serial.println("succeeded!");
String dataToSend = "Hello!";
//向服务器发送请求头,请求该网页的http文件 具体内容可以百度:http 请求行 格式
String request = (String)("GET / HTTP/1.1\r\n")+
"Content-Length: " + dataToSend.length() + "\r\n" +
"Connection: Keep Alive\r\n\r\n" +
dataToSend;
client.print(request);
//client.print("");
//以下代码将收到的网页数据按行打印输出
//如果是浏览器,则会将收到的html文件渲染成我们一般看到的网页
delay(100);
while (client.available()) //如果已连接或有收到的未读取的数据
{
if (client.available()) //如果有数据可读取
{
String line = client.readStringUntil('\n'); //按行读取数据
if(line.indexOf("Time called is ") != -1)
{
Serial.println(line);
delay(5);
}
else continue;
}
}
client.stop(); //关闭当前连接
}
else
{
Serial.println("访问失败");
client.stop(); //关闭当前连接
}
delay(1000);
}
Flask服务器
from flask import Flask
from flask import request
from flask import make_response
from flask import send_from_directory
import time
import json
import os
import socket
app = Flask(__name__)
@app.route('/')
def returnTime():
timeStamp = time.time()
stringToReturn = "Time called is :%f"%timeStamp
print(request.get_data().decode())
# print(stringToReturn)
return json.dumps(stringToReturn)
if __name__ == '__main__':
#获取本机电脑名
myname = socket.getfqdn(socket.gethostname( ))
#获取本机ip
myaddr = socket.gethostbyname(myname)
print(myaddr)
app.run(host = '0.0.0.0', port = 8080, debug=True)
其中的重点是服务器返回的数据本身会包含一些response header的内容,但是在单片机的简单客户端中这些数据并没有用处,所以使用一些语法将这个数据去掉
if(line.indexOf("Time called is ") != -1)
{
Serial.println(line);
delay(5);
}
假如只是使用上面的方式进行数据接收的话将无法实现服务器接收到下位机(也就是ESP32发出的数据)从而无法实现互相通信功能
此时需要撰写更详细规范的http请求如下
String dataToSend = "Hello!";
//向服务器发送请求头,请求该网页的http文件 具体内容可以百度:http 请求行 格式
String request = (String)("GET / HTTP/1.1\r\n")+
"Content-Length: " + dataToSend.length() + "\r\n" +
"Connection: Keep Alive\r\n\r\n" +
dataToSend;
client.print(request);
此时实现的效果为
下位机端:
服务器端:
此时得到的字符串是byte类型的字符串,是在浏览器和服务器之间发送数据的常见字符串形式。于普通字符串的互相转换方式为
str.encode('utf-8')
bytes.decode('utf-8')
decode之后输出的字符串为
以上就实现了ESP32作为Client与Server的数据收发
给一个http请求的参考
String postRequest =(String)("POST ") + "/ HTTP/1.1\r\n" +
"Content-Type: application/json;charset=utf-8\r\n" +
"Host: " + host + ":" + httpPort + "\r\n" +
"Content-Length: " + length + "\r\n" +
"Connection: Keep Alive\r\n\r\n" +
data+"\r\n";