前言
之所以写这篇文章,是记录一下使用ESP8266实现HTTP请求的完整过程,网上教程实在太少了而且不详细,出问题都不好找,估计诸位都转 MQTT 去了
调试环境
WIFI模块: ESP8266-01s
串口工具: USB-to-ttl, Wch-Link(带串口功能)
串口调试工具:安信可官方串口调试工具+XCom (Windows, 驱动Ch340); Serial Monitor (MacOs, Vscode插件,有BUG)
问题踩坑
- 驱动问题
USB to TTL的有两个版本,一个是CH340,一个是CP2102,对应驱动需要一致。 - 关于固件下载
- USB to TTL: ESP8266的VCC需要接入USB to TTL的VCC引脚,不要接3.3V引脚,估计是供电不足;如果有稳压芯片可以直接上稳压3.3V;供电不足会导致串口收发数据异常、下载失败等问题。
- Wch-Link: 带的串口只有3.3V引脚,我试过了数据收发正常,但是固件下载失败;
- MacOS 环境下使用 Parallel Desktop 安装Win10虚拟机,在虚拟机内使用以上几款串口工具出现数据收发不完整,有时候会乱码,暂时无解;直接使用ASUS 真机 Win7系统,以上两款均数据收发正常。
开始折腾
更新固件
不要用虚拟机!!!注意看以上的问题踩坑再操作。
最新固件:于2023.1.31摘自安信可官网ESP8266/ESP32固件合集
①、博安通 AT 固件(固件号:4MB(0883),1MB(0884))
特性:操作简单,任何mcu均可直接接入
下载地址: 博安通出厂固件
更新时间:2019年12月22日
更新说明: v1.7.1.0 AT Firmware,内含 8Mbit 和 32Mbit 两个版本,请客户根据自己产品的flash大小来烧录,串口引脚为TXD,RXD
注意看单位写的是8Mbit -> 1MB; 即对应两个版本1M版本和4M版本,本文使用的是ESP8266-01S,数据手册说明是1MB版本,下载解压后选固件1MB大小那个BIN。
接线图
使用 USB to TTL 进行更新: 接五根线就可以了,因为RST、EN已经内部上拉。
ESP01S -> USB to TTL
TX -> RX
RX -> TX
GND -> GND
VCC -> VCC (不是3.3引脚,就是VCC引脚)
IO0 -> GND
下载步骤
- 导入下载解压出来的1MB固件bin格式,填写扇区地址 0x0
- 勾选 DonotChBin,其他可以不用配置了,勾选后自动配置
- 点击 Start 开始下载
- 提示等待设备复位:此时断开ESP8266-01S的电源重新连下即可下载
区别运行模式与下载模式
使用串口调试工具,设置波特率:74880,以切换到系统日志模式。开机复位之后可以看到如下字样。
boot mode: 1 下载模式
boot mode: 3 运行模式
AT指令HTTP请求
图上命令不需要最后的 \r\n\r\n
AT指令
// 连接
AT+CIPSTART="TCP","suroy.cn",80
// 开启透传模式
AT+CIPMODE=1
// 开始发送,此时回复 **>**
AT+CIPSEND
// 以下是发送的协议内容
GET /ping.html HTTP/1.1
Host: suroy.cn
Connection: Keep Alive
// 退出透传(不加\r\n)
+++
SSL有所不同
// 设置SSL buffer 大小(未设置这项导致SSL连接错误)
AT+CIPSSLSIZE=4096
// 连接
AT+CIPSTART="SSL","suroy.cn",443
// 开启透传模式
AT+CIPMODE=1
// 开始发送,此时回复 **>**
AT+CIPSEND
// 以下是发送的协议内容
GET /ping.html HTTP/1.1
Host: suroy.cn
Connection: Keep Alive
// 退出透传(不加\r\n)
+++
// 关闭连接
AT+CIPCLOSE
HTTP协议说明
以下是一个完整的GET请求协议,使用透传模式发送完整内容,包括空格、换行都不能少;行内空格,行末换行,结束有一个空行;注意此处未使用 \r\n
替换,因为\r\n
实际上发送出去时会经过转义导致发出去的并不是“ \r\n
”,所以直接输入换行进行发送。
GET /ping.html HTTP/1.1
Host: suroy.cn
Connection: Keep Alive
问题分析:
47 45 54 20 2F 20 48 54 54 50 2F 31 2E 31 0D 0A 48 6F 73 74 3A 20 73 2E 73 75 72 6F 79 2E 63 6E 0D 0A 43 6F 6E 6E 65 63 74 69 6F 6E 3A 20 4B 65 65 70 20 41 6C 69 76 65 0D 0A 0D 0A 5C 72 5C 6E 5C 72 5C 6E
这是本节首截图中发送出去的16进制,可以看到最后的\r\n
被转义发出为 5C 72 5C 6E 5C 72 5C 6E 并非"\r\n
"的 0D 0A
,所以协议请求会失败;
那么如何解决这个问题呢?
- 直接使用单片机串口发送字符"
\r\n
",单片机内部发送不存在此问题; - 当发送\r\n时使用16进制发送即
“\r”(0D),"\n"(0A)
附POST协议
未测试
POST / HTTP/1.1
Accept-Language: zh-CN,zh;q=0.9
Host: suroy.cn
Connection: keep-alive
Content-Length:26
Content-Type:application/x-www-form-urlencoded;charset=UTF-8
name=suroy&id=1
说明:跟get请求一样,第一行的协议类型为POST
需要注意的是 POST需要发送两次,第一次不会返回任何东西,第二次会返回;Content-Length:26 必须声明请求体的字符长度
常用资料集合
ESP8266资料合集
ESP8266开发工具
ESP8266/ESP32固件合集