前言

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

一、基础知识

1.HTTP简介

1.1 HTTP概要

HTTP是Hypertext Transfer Protocol的缩写,Hypertext(超文本)是可以根据客户端请求而跳转的结构化信息。HTTP协议的请求及相应方式设计如下图所示:
#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程

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

1.2 HTTP请求

HTTP请求是客户端向服务端发送请求消息,请求消息可以分为请求行、消息头、消息体三个部分;请求行含有请求方式信息(GET/POST等),GET用于请求数据,POST主要用于传输数据;消息头包括一些访问的域名、用户代理、Cookie等信息;消息体就是请求的数据,仅在POST方式请求时候输入。
#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程

1.3 HTTP响应

HTTP响应是指服务端根据客户端发送的请求中的动作要求做出具体的动作,然后将结果返回给客户端。 HTTP响应消息可以分为状态行、头信息、消息体三个部分;状态行含有请求的状态信息,这是其与请求消息相比最大的区别。
#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程

2.ESP8266HTTPClient函数说明

在Wemos D1实际开发中,直接使用ESP8266HTTPClient库提供的函数即可。
#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程

http常见响应处理函数如下:
#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程

二、实例运行

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 ,效果如下:
#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程

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自带串口工具显示如下:
#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程

从上图可知,wemos D1已经完成了发送HTTP请求获取天气情况,但是显示数据存在部分乱码,这个是由于编码导致,接下来我们使用secureCRT串口工具,并设置显示编码方式为UTF-8。
#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程

打开串口,显示如下:
#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程

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

三、结语

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

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

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

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

#IT明星不是梦#wemos D1 arduino物联网开发板应用笔记9-HTTP Client编程