笔者使用的是刷了 AT 固件的 ESP8266。默认情况下,串口波特率为 115200,换行符为 NL 和 CR。可以通过 AT+GMR
命令查看固件信息:
![]()
常见的 AT 命令可以参考以下文章:
ESP8266_AT Wiki
ESP8266 - AT Command Reference
本文将介绍通过 ESP8266 发起 HTTP 请求的方法。首先将 ESP8266 重置,然后设置为 AP + Station 模式。
1 2 3
| AT+RST AT+CWMODE=3 AT+CWLAP
|
最后一个 AT+CWLAP
命令将搜索附近的 Wi-Fi 并显示出来。
随后,使用 AT+CWJAP
命令,指定 SSID 和密码用于连接 Wi-Fi:
将 ssid
和 pwd
根据情况替换。如果连接成功,将返回
1 2
| WIFI CONNECTED WIFI GOT IP
|
接下来就可以发起请求了。我们以 World Time API 为例,这个网站可以根据客户端 IP 获得时间。
发起请求使用 AT+CIPSTART
命令:
1
| AT+CIPSTART="TCP","worldtimeapi.org",80
|
然后用 AT+CIPSEND
指定发送的内容长度。这一步非常关键,需要了解 HTTP 请求报文的格式。请求报文由 4 部分组成:请求行、请求头部、空行、请求数据;换行符为 \r\n
。例如,对 World Time API 的请求是这样的:
1 2 3
| GET /api/ip.txt HTTP/1.1 Host: worldtimeapi.org
|
注意最后的空行,它用来标识请求头部的数据已结束。这三行(加上换行符)一共是 52 个字符,因此先输入以下命令:
ESP8266 会返回一个 >
,提示可以接收请求报文了。然后再输入前面给出的内容:
1 2 3
| GET /api/ip.txt HTTP/1.1 Host: worldtimeapi.org
|
这里没有回显,每输入一行要按一下回车。如果一切正常,HTTP 响应的内容会被打印出来:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| > Recv 52 bytes
SEND OK
+IPD,906:HTTP/1.1 200 OK Connection: keep-alive Access-Control-Allow-Credentials: true Access-Control-Allow-Origin: * Access-Control-Expose-Headers: Cache-Control: max-age=0, private, must-revalidate Content-Length: 309 Content-Type: text/plain; charset=utf-8 Cross-Origin-Window-Policy: deny Date: Thu, 03 Sep 2020 03:51:48 GMT Server: Cowboy X-Content-Type-Options: nosniff X-Download-Options: noopen X-Frame-Options: SAMEORIGIN X-Permitted-Cross-Domain-Policies: none X-Request-Id: f747d52b-09b0-401c-ae5e-5a36c1489b57 X-Runtime: 1ms X-Xss-Protection: 1; mode=block Via: 1.1 vegur
abbreviation: CST client_ip: 124.64.16.34 datetime: 2020-09-03T11:51:48.793540+08:00 day_of_week: 4 day_of_year: 247 dst: false dst_from: dst_offset: 0 dst_until: raw_offset: 28800 timezone: Asia/Shanghai unixtime: 1599105108 utc_datetime: 2020-09-03T03:51:48.793540+00:00 utc_offset: +08:00 week_number: 36
|
最后使用 AT+CIPCLOSE
命令结束请求即可。
参考文章:HTTP 概述