【Mr.chen|开发日记Nov.9】语音交互智能物联网小车设计(6)
Mr.chen 发布于2017-12-13 15:23 浏览:1744 回复:0
1
收藏

当设备与第三方服务器建立连接后,如果要获取或者设置某些数据就要通过服务器提供的API接口进行操作,这些API指令是http格式的命令,所以在教程开讲前有必要先简单了解下http协议的格式.

      HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定,HTTP有两类报文:请求报文和响应报文。

请求报文:
一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,

blob.png

(1)请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。例如,GET /index.html HTTP/1.1。
HTTP
协议的请求方法有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。这里介绍最常用的GET方法和POST方法。
GET
:当客户端要从服务器中读取文档时,使用GET方法。GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。使用GET方法时,请求参数和对应的值附加在URL后面,利用一个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。
POST
:当客户端给服务器提供信息较多时可以使用POST方法。POST方法将请求参数封装在HTTP请求数据中,以名称/值的形式出现,可以传输大量数据,可用来传送文件。
(2)请求头部
请求头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的请求头有:
User-Agent
:产生请求的浏览器类型。
Accept
:客户端可识别的内容类型列表。
Host
:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机。
(3)空行
最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。
对于一个完整的http请求来说空行是必须的,否则服务器会认为本次请求的数据尚未完全发送到服务器,处于等待状态。
(4)请求数据
请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合。与请求数据相关的最常使用的请求头是Content-Type和Content-Length。

本次教程分两部分,第一部分使用Fiddler 4,进行http报文发送测试,初步掌握http格式应用;第二部分 使用ESP8266wifi模块进行设备硬件层的发送演示。

首先打开Fiddler 4 ,点击Compser

blob.png

以心知天气网API接口为例,向心知网服务器发送http格式的指令,来获取当地气象资料。发送格式为:https://api.seniverse.com/v3/weather/now.json?key=鉴权信息 &location=地址&language=zh-Hans&unit=c     鉴权信息是在心知官网注册后服务器给分配的。(具体API接口格式心知网有开发文档)

选择GET方式发送,填入http格式的API接口,点击最右边Execute

blob.png

正确发送后可以看到左侧栏监控的计算机网口收到一份json格式的数据

blob.png

双击打开它,选择Raw可以查看完整发送接收信息

blob.png

使用esp8266进行http格式API的发送和服务器数据的获取:

首先使用8266连接上目标服务器(若目标服务器是第三方服务器参考上一篇教程《esp8266多连接模式设配置》)

以单链接模式为例,多连接略微不同 详细内容参考8266模块说明书AT指令集

1.   AT+CWMODE=1

2.   AT+RST

3.   AT+CWJAP="zz","123456789"           //要连接无线名称和密码

//使用多连接时候加上{ AT+CIPMUX=1}

4.   AT+CIPSTART="TCP","116.62.81.138",80    //目标服务器的IP地址

使用多连接时候的连接格式//{AT+CIPSTART=1,"TCP","116.62.81.138",80}

5.   AT+CIPSEND=113                                     //113是发送http报文长度

多连接模式时发送格式//{ AT+CIPSEND=1,113 }

6.   GET https://api.seniverse.com/v3/weather/now.json?key=un0uz1d80mbef8au&location=taiyuan&language=zh-Hans&unit=c

返回内容如图所示【图为多连接模式下返回内容】

blob.png

+IPD1,263{"results":[{"location":{"id":"WW8P3NH2TPDT","name":"太原","country":"CN","path":"太原,太原,山西,中国","timezone":"Asia/Shanghai","timezone_offset":"+08:00"},"now":{"text":"多云","code":"4","temperature":"23"},"last_update":"2017-08-18T20:55:00+08:00"}]}  1,CLOSED

   

     

 

   这是esp8266返回的完整格式 +IPD,连接id,数据长度  花括号内是完整的json格式数据,如果是单连接时,返回格式没有连接ID这一位数据。 


收藏
点赞
1
个赞
TOP