Arduino esp8266 wifi模块发送http请求

    在以往的单片机编程过程中,可能大多数人更加熟悉的是单片机的wifi模块与服务器建立socket连接。然而,当遇到我们的数据需要在网页动态显示、文件上传等情况时则双方不需要保持连接在线的情况时,可能双方建立http连接是更好的选择。

    由于之前没有相关经验,所以在写http协议时遇到了比较大的困难,经过几天的调试之后发现问题的根源还是http请求的格式不对,服务器报出了400的错误,起初认为是json传输格式不对,经过一阵子折腾之后发现问题并没有解决。

    之后开始怀疑使用<ESP8266WiFi.h>中的WiFiClient无法发送HTTP请求,又使用了https://github.com/esp8266/Arduino/blob/master/libraries/ESP8266HTTPClient中的<ESP8266HTTPClient.h>,问题仍然没有得到解决,之后才开始查询HTTP协议服务器反馈信息。

1xx:指示信息--表示请求已接收,继续处理
2xx:成功
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或有请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求

    之后开始比对自己的HTTP请求格式,发现了问题所在,数据与请求之间必须另外空出一行用以标识,问题终于解决!

    下面附上esp8266模块实现http client端的完整代码

#include <ESP8266WiFi.h>
const char* ssid     = "...";
const char* password = "...";

const char * host = "....";
const int httpPort = ....;

void setup() {
  Serial.begin(9600);
  delay(10);
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {

  Serial.print("connecting to ");
  Serial.println(host);
  
  WiFiClient client;
  
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
   delay(10);
  String recv = readLine();//将从串口接收的数据发送到服务器,readLine()方法可以自行设计
  while (recv != "0")
  {
    if (recv.length() && recv != "0" && recv != "-1200"){//与我的项目相匹配的判断条件
      String data = (String)"{\"heartbeat\":\"" + recv+"\"}";
      int length = data.length();
      
      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";
       Serial.println(postRequest);
       client.print(postRequest);
       delay(100);
       break;
  }        
    recv = readLine();
  }
  client.stop();
}

String readLine()
{
    String str;
    while (Serial.available())
    {
        char temp = Serial.read();
        if (temp != '\n') {
          str += char(temp);
          delay(2);
        }//delete temp;
        else break;//delete temp;
    }
    return str;
}
    总结一下,esp8266模块与服务器建立HTTP连接与建立Socket连接的实现方式相似,均可以使用https://github.com/ekstrand/ESP8266wifi中的<ESP8266WiFi.h>建立连接。通过WiFiClient中的connect(host, port)方法连接到服务器,利用print或write方法可直接发送数据。

    至于怎样将数据通过软串口发送到ESP8266 wifi模块,在我的上一篇博客中写道

    http://blog.csdn.net/lrh_12580/article/details/52048079






  • 13
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: Arduino ESP8266WiFi库是一种特定于ESP8266芯片的库文件,用于在Arduino开发环境中方便地连接和操作WiFi网络。ESP8266芯片是一种功能强大且资源丰富的WiFi模块,通过该库文件,我们可以轻松将ESP8266模块与Arduino进行通信,实现无线网络连接和数据传输。 该库文件提供了一系列易于使用的函数和方法,允许我们扫描和连接无线网络,以及通过TCP/IP协议进行数据传输。通过Arduino ESP8266WiFi库,我们可以轻松地设置和配置ESP8266模块的无线网络参数,包括SSID、密码和加密方式。 使用该库文件,我们可以利用ESP8266模块连接到现有的WiFi网络,从而实现与互联网的连接。这使得我们能够使用传感器、执行器等外部设备,通过WiFi网络与远程服务器进行通信。这为物联网应用提供了便利,例如远程监测、控制和数据传输等。 除了连接到现有WiFi网络,该库还允许我们创建一个独立的WiFi接入点。这使得我们可以将ESP8266模块配置为一个独立的WiFi网络,其他设备可以连接到该网络并与其通信。这种功能对于构建自己的WiFi网络,例如智能家居、自动化控制等项目非常有用。 总之,Arduino ESP8266WiFi库是一个强大而方便的工具,使得我们能够轻松地利用ESP8266模块实现WiFi网络连接和通信。无论是连接到现有的网络还是创建自己的网络,该库都为我们提供了简洁而有效的函数和方法。 ### 回答2: Arduino ESP8266WiFi库是一种用于连接和控制ESP8266 WiFi模块的库。ESP8266 WiFi模块是一种集成了WiFi功能的低成本、低功耗的芯片,可以通过无线网络连接到互联网。 使用ESP8266WiFi库,我们可以轻松地在Arduino板上开发WiFi应用。该库提供了一些简单的函数和方法,使我们能够连接到Wi-Fi网络、发送HTTP请求、创建TCP/UDP服务器和客户端等。 首先,我们可以使用begin()函数初始化ESP8266 WiFi模块,并设置连接的Wi-Fi网络的SSID和密码。然后,使用connect()函数连接到Wi-Fi网络。连接成功后,我们可以通过WiFi.status()函数获取连接状态。 接下来,我们可以使用WiFiClient类创建一个TCP或UDP客户端,以便与其他设备通信。通过WiFiClient对象,我们可以使用connect()函数连接到指定的主机和端口,然后使用print()或write()函数发送数据,通过read()或available()函数接收数据。我们还可以使用stop()函数关闭连接。 如果我们希望创建一个服务器,我们可以使用WiFiServer类。通过WiFiServer对象,我们可以使用begin()函数开始监听指定端口,并使用available()函数接收来自客户端的连接。一旦有连接请求,我们可以使用client()函数接受连接,并使用write()函数发送数据,通过read()函数接收数据。 其他常用的函数包括hostname()函数用于获取ESP8266 WiFi模块的主机名、localIP()函数用于获取模块的IP地址、macAddress()函数用于获取模块的MAC地址等。 综上所述,Arduino ESP8266WiFi库是一个强大且易于使用的库,可以帮助我们方便地实现与ESP8266 WiFi模块的通信和控制,从而实现各种基于无线网络的物联网应用。 ### 回答3: Arduino是一种开源的电子开发工具,而ESP8266是一种低成本的Wi-Fi模块。当它们结合使用时,我们可以利用ESP8266Wi-Fi功能,通过Arduino来控制各种电子设备。 ESP8266可以通过连接到Wi-Fi网络,从而使我们的电子设备能够与其他设备或互联网进行通信。为了更方便地使用ESP8266Wi-Fi功能,Arduino提供了一个ESP8266WiFi库。 ESP8266WiFi库可以用来连接到Wi-Fi网络、发送HTTP请求和接收HTTP响应等。通过该库,我们可以方便地将ArduinoWi-Fi网络进行连接,并编写代码来完成各种任务,例如远程控制、数据采集和云端存储等。 使用ESP8266WiFi库的第一步是将该库添加到Arduino IDE中。然后,我们可以使用所提供的函数连接到Wi-Fi网络,并配置相应的参数,例如SSID和密码。一旦连接成功,我们可以使用库中的其他函数来发送HTTP请求或接收HTTP响应。 ESP8266WiFi库还提供了一些有用的功能,例如获取本地IP地址、设置静态IP地址、创建TCP或UDP服务器等。这些功能使得我们能够更灵活地配置和管理Wi-Fi连接。 总而言之,Arduino ESP8266WiFi库为开发者提供了方便易用的方式来利用ESP8266Wi-Fi功能。通过该库,我们可以轻松地将Arduino与互联网连接起来,并进行各种控制和通信任务。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值