《用于物联网的Arduino项目开发:实用案例解析》—— 3.2 HTTP

简介: 网站使用超文本传输协议(Hyper Text Transfer Protocol,HTTP)。HTTP支持多种数据传输的方法,在这个作品中,我们会用其中两种较常用的方法:GET和POST。GET和POST方法要做的事情是一样的,所以代码也很相似,它们的不同在于请求的格式略有变化。

本节书摘来自华章出版社《用于物联网的Arduino项目开发:实用案例解析》一 书中的第3章,第3.2节,作者[美]安德尔·杰韦德(Adeel Javed),更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.2 HTTP

网站使用超文本传输协议(Hyper Text Transfer Protocol,HTTP)。HTTP支持多种数据传输的方法,在这个作品中,我们会用其中两种较常用的方法:GET和POST。GET和POST方法要做的事情是一样的,所以代码也很相似,它们的不同在于请求的格式略有变化。与POST相比,GET所能发送的数据量是有限制的。POST还被认为比GET要略为安全一些。根据你的需要,你可以决定哪个方法更适用。图3-1给出了设备和HTTP服务器之间的高层交互。

e496386b9a7390cc566fbe14d86876aeda8da6f0

所需的硬件、软件和电路,请阅读2.3节。

3.2.1 代码(Arduino)

接下来,我们来写用WiFi连接Arduino和互联网,并通过HTTP协议发送测试数据给服务器的代码。
启动Arduino IDE,输入下面的代码,或者从本书的网站下载代码文件然后打开。所有的文件都在单个源文件(*.ino)中,不过为了便于理解和重用,这个代码被分成四个部分:

  • 外部库
  • 互联网连接(无线)
  • 数据发布(HTTP)
  • 标准函数

外部库

代码的第一部分引入了运行代码所需的全部外部库。这一部分的代码和程序2-6是完全一样的。

互联网连接(无线)

代码的第二部分定义了连接互联网要用的变量、常量和函数。在这里使用了程序2-7、程序2-8和程序2-9中的代码。
数据发布
代码的第三部分定义了将来发送给使用HTTP的服务器要用到的变量、常量和函数。
程序3-1首先定义了Arduino要连接和发送数据的服务器的地址和端口。对于这个作品来说,可以把数据发布到www.httpbin.org,这是一个开放可用的测试服务器,只是会把收到的请求数据和一些额外的数据一起回送。在后面的作品中会使用能处理请求的数据的服务器。

1c27abf04ae50a8a7c2e86791a0a002477f154be

程序3-2里的doHttpGet()函数封装了为GET方法准备请求数据的所有细节,它会连接到服务器然后发送请求。
接下来,在一个if语句中,用client.connect(server, port)来尝试连接服务器。如果连接成功,就准备请求数据。
在使用GET方法的请求中,数据是以名值对格式作为URL的一部分被发送的。
最后,用client.println()方法把HTTP请求发送给服务器。这个方法会通过网络把命令发送给服务器,然后接收服务器的响应。

ee40c9fb974c701e7c11a201459696e92734b0c3 3e4908b7d0aa58b551937deb018fab9d0d7d4998

这个代码是用来发送HTTP GET请求的,不过,前面提到过,这种方法有数据长度的限制,如果要突破这个限制,就要使用HTTP POST方法。
程序3-3的doHttpPost()函数把POST方法的所有准备工作封装了起来,它会连接到服务器,然后发送请求。
在一个if语句中,用client.connect(server, port)来尝试连接服务器。到这里,代码和用HTTP GET做请求是相似的。如果连接成功,就准备请求的数据。
用POST方法做请求的时候,数据也是以名值对的格式成对出现的,但是这些数据是请求的一部分(而不是网址的一部分)。从程序3-3可以看出,发送一个HTTP POST请求需要额外的头部数据。
最后,用client.println()方法把HTTP请求发送给服务器。这个方法会通过网络把命令发送给服务器,然后接收服务器响应。

725acab5c2b52f5b2a52225099633a3df069594b d2ade9631c2526095acb6cbea7851b005a094f84

从Arduino向服务器发布数据的大致过程基本如此。

标准函数

代码的第四部分和第五部分实现了Arduino标准的setup()和loop()函数。
如程序3-4所示,setup()函数初始化串口,然后通过调用doHttpGet()函数来做HTTP GET请求,或是通过调用doHttpPost()函数来做HTTP POST请求。

bb19b86d5a68a42b6c53d7ed4150e4209a074877

要在loop()函数里加上代码来读取服务器的响应。这个作品不会对从传感器发送过去的数据做任何服务器端的处理,我们所用的测试服务器只会在响应中把全部的请求数据重复发回来,所以只要读取响应,然后在串口监视器输出即可。
根据程序3-5,首先检查WiFiClient里是否有字节可以读,读取所有的字节,然后在串口监视器打印出来。一旦读取了全部字节并打印出来,就停止这个客户端对象。

edb3b269e5af4f99870b614a1ba2950b57d1fcd1 f01f6f8f2b669b89cb37b58f458616d5e6f009c9

至此,完成了编写Arduino代码。

3.2.2 最终的作品

要测试这个应用,按照第1章所介绍的,校验然后上传代码到Arduino。代码上传后,打开串口监视器会看到如图3-2所示的HTTP GET日志消息,或是图3-3所示的HTTP POST日志消息。

4babb48655194057ae6dd1e19271ea866cd61433 285a95633e107bee8f948eeadd4d55c3ca801cfa
相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
4天前
|
安全 网络协议 应用服务中间件
AJP Connector:深入解析及在Apache HTTP Server中的应用
【9月更文挑战第6天】在Java Web应用开发中,Tomcat作为广泛使用的Servlet容器,经常与Apache HTTP Server结合使用,以提供高效、稳定的Web服务。而AJP Connector(Apache JServ Protocol Connector)作为连接Tomcat和Apache HTTP Server的重要桥梁,扮演着至关重要的角色
22 2
|
10天前
|
Shell
HTTP状态码解析:在Haskell中判断响应成功与否
HTTP状态码解析:在Haskell中判断响应成功与否
|
17天前
|
缓存 网络协议 Linux
DNS解析工具使用案例
关于如何在Windows和Linux操作系统下使用DNS解析工具的案例,包括查看和清空DNS缓存、使用whois查询工具以及安装和使用dig工具进行DNS记录查询。
14 2
DNS解析工具使用案例
|
1天前
|
数据采集 存储 JSON
从零到一构建网络爬虫帝国:HTTP协议+Python requests库深度解析
在网络数据的海洋中,网络爬虫遵循HTTP协议,穿梭于互联网各处,收集宝贵信息。本文将从零开始,使用Python的requests库,深入解析HTTP协议,助你构建自己的网络爬虫帝国。首先介绍HTTP协议基础,包括请求与响应结构;然后详细介绍requests库的安装与使用,演示如何发送GET和POST请求并处理响应;最后概述爬虫构建流程及挑战,帮助你逐步掌握核心技术,畅游数据海洋。
15 3
|
25天前
|
JavaScript 前端开发 UED
Javaweb之javascript的小案例的详细解析
通过上述步骤,我们得到了一个动态更新的实时时钟,这个简单的JavaScript案例展示了定时器的使用方法,并讲解了如何处理日期和时间。这个案例说明了JavaScript在网页中添加动态内容与交互的能力。对于涉足JavaWeb开发的学习者来说,理解和运用这些基础知识非常重要。
34 11
|
11天前
|
存储 JSON API
Python编程:解析HTTP请求返回的JSON数据
使用Python处理HTTP请求和解析JSON数据既直接又高效。`requests`库的简洁性和强大功能使得发送请求、接收和解析响应变得异常简单。以上步骤和示例提供了一个基础的框架,可以根据你的具体需求进行调整和扩展。通过合适的异常处理,你的代码将更加健壮和可靠,为用户提供更加流畅的体验。
36 0
|
19天前
|
中间件 PHP 开发者
深入解析 Laravel 中的 HTTP 中间件
【8月更文挑战第31天】
12 0
|
19天前
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`<h:inputText>`、`<h:dataTable>`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
27 0
|
19天前
|
UED 存储 自然语言处理
【语言无界·体验无疆】解锁Vaadin应用全球化秘籍:从代码到文化,让你的应用畅游世界每一个角落!
【8月更文挑战第31天】《国际化与本地化实战:构建多语言支持的Vaadin应用》详细介绍了如何使用Vaadin框架实现应用的国际化和本地化,提升用户体验和市场竞争力。文章涵盖资源文件的创建与管理、消息绑定与动态加载、日期和数字格式化及文化敏感性处理等方面,通过具体示例代码和最佳实践,帮助开发者构建适应不同语言和地区设置的Vaadin应用。通过这些步骤,您的应用将更加灵活,满足全球用户需求。
30 0
|
19天前
|
前端开发 API 开发者
【React状态管理新思路】Context API入门:从零开始摆脱props钻孔的优雅之道,全面解析与实战案例分享!
【8月更文挑战第31天】React 的 Context API 有效解决了多级组件间状态传递的 "props 钻孔" 问题,使代码更简洁、易维护。本文通过电子商务网站登录状态管理案例,详细介绍了 Context API 的使用方法,包括创建、提供及消费 Context,以及处理多个 Context 的场景,适合各水平开发者学习与应用,提高开发效率和代码质量。
21 0

相关产品

  • 物联网平台
  • 推荐镜像

    更多