Espressif HTTP AT 命令入门 (一)

最近使用乐鑫公司推出的ESP32芯片去做项目,其实要做的工作很简单,只需要下载对应ESP32芯片的AT固件即可 ( 写本篇文章的时候最新的版本为 v2.1.0.0 ),其余逻辑层面的工作只需要通过AT指令操作即可。乐鑫的AT指令集很全,基本可以满足项目的开发需求,使用到的核心AT指令为HTTP指令。HTTP指令为 AT 固件默认支持指令,直接使用即可。

本篇文章的目的:

  • HTTP 协议入门

HTTP 协议

概念

HTTP(超文本传输协议HyperText Transfer Protocol) 协议是互联网的基础协议,属于 TCP/IP 四层模型中的应用层协议。由此可见,HTTP 协议是基于 TCP/IP 协议之上的应用层协议。

版本

HTTP协议经历了四个版本的变迁,对各个版本的不同各位看官可以自行百度,这里只列出对应各个版本的关键信息

  1. HTTP/0.9 ( 默认使用 80 端口,仅仅支持 GET 命令 )
  2. HTTP/1.0 ( 引入 POST 命令和 HEAD 命令 )
  3. HTTP/1.1 ( 目前最流行版本 )
  4. HTTP/2 ( 复用 TCP 连接 )

工作原理

HTTP 协议基于客户端/服务器模式。典型的工作流程如下:

1). 客户端与服务器建立 TCP 连接
2). 客户端向服务器提出请求
3). 服务器根据客户端提出的请求返回对应的应答
4). 客户端与服务器断开 TCP 连接


特别需要注意的客户端与服务器建立的 HTTP 连接是一次性的,即当服务器返回给客户端请求结果后,这次的 HTTP 连接就关闭了。客户端下次请求必须再次和服务器重新建立 HTTP 连接。

这里用到的名词为 HTTP 连接,并不是 TCP 连接,这是两个概念,需要区分。HTTP 连接是建立在 TCP 连接之上的。

特性

HTTP 的工作原理角度看,HTTP 协议的特性很多,但是最主要的两个特性是无连接无状态

  1. 无连接:每次 HTTP 连接仅仅处理一个请求。服务器返回客户端的请求后,这次的 HTTP 连接也就意味着断开了。该特性可以大大提高服务器的执行效率。

  2. 无状态:HTTP 协议对于请求/应答过程不保存状态信息。意味着后续的处理如果需要前面的信息,就只能通过重传来实现。该特性可以减轻服务器的记忆负担,提高服务器的响应速度。

报文格式

HTTP 协议既然是一种应用层协议,自然有属于自己协议的报文格式。

HTTP 协议的报文主要分为两种:

  1. 请求报文
  2. 响应报文

请求报文

在网上找了好一会 HTTP 请求报文的示意图,没有找到自己满意的,又不想自己动手画,只能找一个还算是可以的示意图。


HTTP 请求报文主要可以分为三个部分:

  1. 请求行
  2. 请求头部
  3. 请求数据
请求行

请求行由方法字段、URL 字段、版本字段组成。

  • 方法
    对于方法,我们一般用的比较多的是 GETPOST。其余方法用到的时候在来百度补充。

    1. GET:请求获取 URL 指定位置的资源 ( 类似 git pull )
    2. POST:在 URL 所标识的资源后附加数据。这些数据会发送给服务器,由服务器进行处理 ( 类似 git push )
  • URL
    原文请参考:http://blog.csdn.net/ergouge/article/details/8185219

    URL,全称为 UniformResourceLocator,中文叫统一资源定位符。作用是用来标识网络中某一处资源的地址。

    以下面这个 URL 为例,说明下 URL 的组成。

    http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

    一个完整的 URL 由以下 7 个部分组成:

    1. 协议部分:该 URL 所表明的协议为 http 。除了 http 之外,网络中还可以采用 ftp 等多种协议。
    2. 域名部分:该 URL 的域名部分是 www.aspxfans.com 。也可以直接以该域名对应的 IP 地址取代。
    3. 端口部分:该 URL 的端口部分是 8080 。该部分并不是必须的,如果省略,将采用默认端口,一般来说默认端口为 80
    4. 虚拟目录部分:该 URL 的虚拟目录部分为 /news/ 。从端口部分后的第一个 / 开始到最后一个 / 为止,均属于虚拟目录部分。
    5. 文件名部分:该 URL 的文件名部分为 index.asp 。从虚拟目录部分的最后一个 / 之后开始到符号 ? 之前,是文件名部分。如果没有符号 ? ,则到符号 # 之前是文件名部分。如果符号 ?# 均没有,则文件名部分为虚拟目录部分的最后一个 / 后开始到该 URL 结束。
    6. 参数部分:该 URL 的参数部分为 boardID=5&ID=24618&page=1 。从符号 ? 之后到符号 # 之前,这中间的部分属于参数部分。 参数允许有多个,用分隔符 & 进行分隔。
    7. 锚部分:该 URL 的锚部分为 name 。从符号 # 开始到 URL 的结束的中间部分属于锚部分。
  • 版本字段
    该字段所代表的含义为客户端所采用的 HTTP 协议的版本。

请求头部

请求头部说白了就是由键值对组成。作用是允许客户端向服务器发送一些附加信息或者描述客户端自身的信息

这个不多解释了,自己看图吧。

请求数据

请求数据的格式取决于请求头部中的 Content-Type 字段

  1. 方法为 GET 时,请求数据基本为空
  2. 方法为 POST 时,需要填充上传给服务器的数据
请求报文抓包示例

概念介绍的差不多了,下面该进入实战环节了。

GET 请求包

这里我用 Wireshark 抓个 GET 请求包进行介绍 ( 如果不知道 Wireshark 的,及时叉掉浏览器,远离代码保平安 )

这里以乐鑫的 IOT 官网为例,入口为:http://iot.espressif.cn/


如图, Wireshark 还是不错的一款软件,都将抓到的包进行了识别。在加上我们对抓到的包进行一丢丢的过滤,GET 请求包就一目了然了。


继续利用 Wireshark 对 GET 请求包进行分析,对照上面的概念进行对号入座,是不是结果就呼之欲出了呢。

字段
方法 GET
URL /static/css/bootstrap.min.css
版本 HTTP/1.1
Host iot.espressif.cn
Connection keep-alive
User-Agent User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
Accept text/css,/;q=0.1
Referer http://iot.espressif.cn/
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
If-None-Match W/“543f8b3b-18679”
If-Modified-Since Thu, 16 Oct 2014 09:09:15 GMT
POST 请求包

POST 请求包的抓包比较麻烦,因为没有好的服务器来给我们练练手。不过办法总比困难多,我们可以通过抓取路由器的 POST 包。

一般来说,路由器就是一个小型的 WEB 服务器。我们设置 WI-FI 的信息时就是通过 HTTP 协议进行交互。这里我以修改 WIFI SSIDalson_test 为例抓包。


继续利用 Wireshark 对 POST 请求包进行分析,对照上面的概念进行对号入座,是不是结果就呼之欲出了呢。

字段
方法 POST
URL /api/ntwk/WlanGuideBasic?type=notshowpassall
版本 HTTP/1.1
Host 192.168.3.1
connection keep-alive
content_length 1139
accept application/json, text/javascript, /; q=0.01
X-Requested-With XMLHttpRequest
_ResponseFormat JSON
User-Agent Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36
Content-Type application/json;charset=UTF-8;enp
Origin http://192.168.3.1
Referer http://192.168.3.1/html/advance.html
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7
truncated]Cookie test=cookietest; SessionID_R3=8kpx08uu4HGG0Uiu7Viy0Q2sGMt0i3lGJyYfDmikkXVs3ky20PERjTseUoeuWmErjCM0Wi0gXLD861gsXJiDajk8k0H1j0hEUh9azgWJ40wET6S16PtO9sJa90tQnO1A; encn=bdcd0e39395af486f3195f45429dcb0d16d47399bea473e0171b5

接着 \r\n 之后的实体就是请求数据了,示例中通过 content_type 指定了请求数据的组织格式是 application/json ,也就是 JSON 数据 ( 如果不懂 JSON ,还是趁早叉掉浏览器,远离代码保平安 ) 。

示例中的请求数据比较多,直接将请求数据以 HEX 格式转换成文本格式后,直接百度 JSON在线解析 ,随便打开一个将刚才解析好的文本格式进行 JSON 数据自动格式化 即可。一眼就可以看到 config2gssid 的值为 alson_ap

响应报文

在网上找了好一会HTTP请求报文的示意图,没有找到自己满意的,又不想自己动手画,只能找一个还算是可以的示意图。


响应报文的报文格式其实和请求报文的报文格式差不多,也是由三部分组成:

  1. 状态行
  2. 首部行
  3. 实体
状态行
  • 状态码

    状态码由三位数字组成。

    我们常见的比较典型的状态码如下:

    1. 200: OK - 客户端请求成功 ( 最鸡东的状态码 )
    2. 3xx: 一般来说和重定向有关,客户端需要采取进一步的操作
    3. 400: Bad Request - 客户端请求有语法错误,服务器不能解析
    4. 401: Unauthorized - 请求未授权 ( 一般来说都是权限问题,可以尝试在请求报文的头部中加入 Authorization )
    5. 403: Forbidden - 服务器收到请求,但是拒绝提供服务
    6. 404: Not Found - 请求资源不存在 ( 是不是在网上经常见到,哈哈~ )
首部行

状态行的内容也是以键值对的形式。

这个也不过多的解释,自己看图吧。

实体

服务器返回给客户端请求的具体对象。可以根据状态行中的 Content-LengthContent-Type 计算数据的长度和数据的类型。

响应报文抓包示例
GET 响应包

与上文的 GET 请求包抓包示例相同,对客户端的 GET 请求响应。



利用 Wireshark 对 GET 响应包进行分析,对照上面的概念进行对号入座,结果也很明显。

字段
版本 HTTP/1.1
状态码 200
原因短语 OK
Server nginx/1.10.2
Date Thu, 18 Mar 2021 13:22:20 GMT
Content-Type application/json
Content-Length 49
Connection keep-alive

实体部分的数据的数据类型是 application/json ,数据长度是 49 。下面以 JSON 方式显示实体部分 ( 如果不懂 JSON ,还是趁早叉掉浏览器,远离代码保平安 )

POST 响应包

与上文的 POST 请求包抓包示例相同,对客户端的 POST 请求响应。



利用 Wireshark 对 POST 响应包进行分析,对照上面的概念进行对号入座,结果也很明显。

字段
版本 HTTP/1.1
状态码 200
原因短语 OK
Cache-Control no-cache, no-store, max-age=0, must-revalidate
Pragma no-cache
Content-Type application/javascript
X-Download-Options noopen
X-Frame-Options SAMEORIGIN
X-XSS-Protection 1; mode=block
Content-Security-Policy default-src ‘self’ ‘unsafe-inline’ ‘unsafe-eval’
X-Content-Type-Options nosniff
Content-Length 109

实体部分的数据的数据类型是 application/javascript ,数据长度是 109 。这里就不多作分析了。


以上就是一些 HTTP 的基本概念。虽然没有继续深入的去学习,不过这些在项目中已经够用了。下一篇会对 ESP HTTP AT 指令进行讲解,敬请期待~

Espressif HTTP AT 命令入门相关推荐

  1. 30分钟git命令入门到放弃

    30分钟git命令入门到放弃 Helkyle・ 15 小时前 172 | 暂无评论 这是一篇给像我这样的新手或者是熟悉图形工具的老鸟看的.仅作为快速入门的教程. learn-git git 现在的火爆 ...

  2. 20165301 预备作业三:Linux安装及命令入门

    预备作业三:Linux安装及命令入门 VirtualBox虚拟机的安装 在进行安装之前,原本以为有了娄老师的安装教程会是一件很容易的事情.万万没想到,在自己实际动手操作中,还是遇到了许多困难.通过与同 ...

  3. git config命令入门

    git config命令入门 git config命令用来配置git 1.仓库级别 local [优先级最高]2.用户级别 global[优先级次之]3.系统级别 system[优先级最低] 查看仓库 ...

  4. Linux 基础命令入门 文件压缩

    Linux 基础命令入门 文件压缩 一般 tar-zcvf压缩文件分两个步骤: 第一步骤,把要压缩的文件整成一个包 testtar.txt.tar 第二步骤,把打成包的文件压缩,testtar.txt ...

  5. Linux命令入门教程(一):命令简介与初识

    本文档将对Linux的基础知识.常用的操作命令进行介绍,希望能帮忙你入门Linux. 推荐以下教程参考: Linux教程:Linux 教程 | 菜鸟教程 Linux命令大全:Linux 命令大全 | ...

  6. linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)

    前言 本文特点 授之以渔:了解命令学习方法.用途:不再死记硬背,拒绝漫无目的: 准确无误:所有命令执行通过(环境为centos7),拒绝复制粘贴: 实用性高:命令多为实际工作中用到的,实例讲解,拒绝纯 ...

  7. ubuntu及shell脚本常用命令入门

    一.Shell命令 二.ubuntu软件安装方法 三.Ubuntu文件系统结构 四.ubuntu磁盘文件 五.Linux下常用的压缩格式 六.linux用户和用户组 七.Ubuntu/Linux文件权 ...

  8. 韦东山嵌入式第一期学习笔记DAY_1——3_1_linux命令入门演示

    作者:GWD 时间:2019.7.2 一.课程内容: 1.问:除了图形界面,ubuntu下面有没有其他方式也可以创建目录.创建文件? 答:通过linux命令,linux命令,是每一个linux学习者必 ...

  9. helm v3.8.0 命令入门指南

    文章目录 1. 条件 2. 安装 2.1 二进制版本安装 2.2 脚本安装 2.3 更多安装方式 3. 三大概念 4. 常用方法 4.1 'helm repo':使用存储库 4.2 'helm sea ...

最新文章

  1. 客户端C++与前端js交互
  2. 历史回顾,各种编程工具的应用与我的发展历程之二(VB)
  3. 又肝了下微服务 API 网关“金刚”,也是蛮香的~
  4. 二级菜单--竖排---HTML
  5. 在Qt在GUI程序里显示控制台界面
  6. How to achieve conditional break point in your ABAP program
  7. Java EE调度程序
  8. RSA公私钥加解密方式-工具类
  9. 163邮箱有传真服务器,网易企业邮箱邮件传真功能使用说明
  10. C++11 并发指南六(atomic 类型详解三 std::atomic (续))
  11. O(n)复杂度求没有出现的数字(leetcode448)
  12. ros下各个包中的map的格式
  13. wireshark抓包教程详解
  14. 地方时太阳时html源码,地方时和时区
  15. **带I2C的LCD1602液晶显示51单片机程序**
  16. 常见十大算法 冒泡算法
  17. 生成arp报文的verilog实现
  18. arduino 44键盘制作简易计算器
  19. 用Python爬取斗鱼各区的主播信息,并制作热度排行榜
  20. h5做app和原生app有什么区别?

热门文章

  1. 先进控制技术(APC) 改善企业效益-智能工厂的基石
  2. 5.18 使用网格工具组合成梦幻色彩 [Illustrator CC教程]
  3. 云可以省钱吗? 这些公司说是
  4. 【积累】《国产操作系统(麒麟)运维师》课程笔记-第6章-中
  5. 迁移数据库报错解决方案
  6. 学堂在线_编译技术 学习笔记
  7. Swing读书笔记JInternalFrame的使用(窗口与面板)
  8. UEFI开发探索34 – Option ROM前传1
  9. 充分发展的管内层 流流动换热中对流换热系数与通道的当量尺寸成反比
  10. PLC电路元器件基础