前言

本节,我们开始学习wemos D1的HTTP Client编程,并实现通过HTTP GET方式获取天气信息的功能。

一、<基础知>识

1.HTTP简介

1.1 HTTP概要

HTTP是Hypertext Transfer Protocol的缩写,Hypertext(超文本)是可以根据客户端{请求}而跳转的结构化信息。HTTP协议的{请求}及相应方式设计如下图所示:

从图中可以看出,服务器端响应客户端{请求}后立刻断开连接,连接不会维持很久,即使同一个客户端再次发送{请求},服务端也无法辨认出是否是原先的那个客户端发出的{请求},会以相同的方式处理新的{请求}。

1.2 HTTP{请求}

HTTP{请求}是客户端向服务端发送{请求}消息,{请求}消息可以分 为[{请求}行、消息头、消息体三个部分;{请求}行含有{请求}方式信息(GET/POST等),GET用于{请求}数据,POST主要用于传输数据;消息头包括一些访问的域名、用户代理、Cookie等信息;消息体就是{请求}的数据,仅在POST方式{请求}时候{输入}。

1.3 HTTP响应

HTTP响应是指服务端根据客户端发送的{请求}中的动作要求做出具体的动作,然后将结果返回给客户端。 HTTP响应消息可以分 为[状态行、头信息、消息体三个部分;状态行含有{请求}的状态信息,这是其与{请求}消息相比最大的区别。

2.ESP8266HTTPClient函数说明

在Wemos D1实际开发中,《直接》使用ESP8266HTTPClient库提供的函数即可。

http常见响应处理函数如下:

二、实例(运)行

1.Http GET方式获取上海天气

1.1 简介

获取天气接口使用sojson提供的免费接口:http://t.weather.sojson.com/api/weather/city/city_code,本文访问上海天气,‘需’要填写上海city_code, 为[101021300,不同城市码可以百度搜(索获取)。

首先我们在浏览器直接{输入}http://t.weather.sojson.com/api/weather/city/101021300 ,效果如下:

1.2 wemos D1程序

接着我们开始使用wemos D1来获取天气,代码如下:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

char* ssid = "sand";
char* passwd = "12345678";

const uint16_t port = 80;
const char * host = "http://t.weather.sojson.com/api/weather/city/101021300";
 HTTPClient http;

void setup() {
   //在这里加入初始化相关代码,只(运)行一次:
   Serial.begin(115200);

   WiFi.mode(WIFI_STA);
   WiFi.begin(ssid, passwd);

   Serial.println("connecting to router... ");
   //等待wifi连接成功
   while (WiFi.status() != WL_CONNECTED) {
      Serial.print(".");
      delay(500);
   }
   Serial.println("");

   Serial.print("WiFi connected, local IP address:");
   Serial.println(WiFi.localIP());

   Serial.print("[HTTP] begin...\n");

   http.begin(host); //HTTP

    delay(500);
}

void loop() {
  if (WiFi.status() == WL_CONNECTED)
  {
      // start connection and send HTTP header
      int httpCode = http.GET();
      if(httpCode) {
         // HTTP header has been send and Server response header has been handled
         Serial.printf("[HTTP] GET... code: %d\n", httpCode);
         // file found at server
         if(httpCode == 200) {
               String payload = http.getString();
               Serial.println(payload);
         }
      } else {
         Serial.print("[HTTP] GET... failed, no connection or no HTTP server\n");
      }
    }

    delay(5000);
}

1.3 (运)行

代码编译后上传到wemos D1,arduino自带串口工具显示如下:

<从上图可知>,wemos D1已经完成了发送HTTP{请求}获取天气情况,但是显示数据存在部分“乱码”,这个是由于编码导致,接下来我们使用secureCRT串口工具,并设置显示编码方式 为[UTF-8。

打开串口,显示如下:

修改编码方式后,显示正常,至此我们实现了通过wemos D1发送HTTP GET获取天气信息。

三、结语

如您在使用过程中有任<何>问题,请加QQ群进一步交流,也可以github提Issue。

QQ交流群:906015840 (备注:物联网项目交流)

获取源码:“关注”公众号,回复wemos即可

一叶孤沙出品:一沙一世界,一叶一菩提