在ESP32上使用WiFi.h编写一个简单的Web Client

首先在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";

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值