物联网的英文名称是Internet of Things。IoT则是Internet of Things的缩写。因此, 物联网 = IoT。
- 通俗地说,物联网是互联网的一种拓展。我们知道互联网是由无数的计算机和智能手机交错连接而编织成的一张网。而正是有了像NodeMCU/ESP8266这样的物联网模块,让以前不能上网的设备也可以连网。有了这些新联网成员的互联网也就不再是单纯的互联网,而被称作物联网。因此,物联网是互联网延伸到更多的设备以后所形成的网络。因此,物联网使用的就是我们每天都在使用的互联网。
- 物联网设备主要特点:
1. 具有互联网连接功能
2. 配有有传感器可感知设备的内部运行情况或设备所处的外部环境状况。
3. 可通过互联网将传感器数据上传
4. 可执行来自互联网的控制指令2
开发板的引脚对应图:
可用引脚:ESP8266芯片有17个GPIO引脚(GPIO0~GPIO16)。这些引脚中的GPIO6~GPIO 11被用于连接开发板的闪存(Flash Memory)。如果在实验电路中使用GPIO6~GPIO11,NodeMCU开发板将无法正常工作。因此建议您不要使用GPIO6~GPIO 11。
特殊引脚说明:
GPIO2引脚 在NodeMCU开发板启动时是不能连接低电平的。
GPIO15引脚在开发板运行中一直保持低电平状态。因此请不要使用GPIO15引脚来读取开关状态或进行I²C通讯。
GPIO0引脚在开发板运行中需要一直保持高电平状态。否则ESP8266将进入程序上传工作模式也就无法正常工作了。您无需对GPIO0引脚进行额外操作,因为NodeMCU的内置电路可以确保GPIO0引脚在工作时连接高电平而在上传程序时连接低电平
上拉电阻/下拉电阻:
GPIO 0-15引脚都配有内置上拉电阻。这一点与Arduino十分类似。GPIO16 引脚配有内置下拉电阻。
通讯
串行端口:
ESP8266有2个硬件串行端口(UART)。
串行端口0(UART0)使用GPIO1和GPIO3引脚。其中GPIO1引脚是TX0,GPIO3是RX0。
串行端口1(UART1)使用GPIO2和GPIO8引脚。其中GPIO2引脚是TX1,GPIO8是RX1。请注意,由于GPIO8被用于连接闪存芯片,串行端口1只能使用GPIO2来向外发送串行数据。
I²C:
ESP8266只有软件模拟的I²C端口,没有硬件I²C端口。也就是说我们可以使用任意的两个GPIO引脚通过软件模拟来实现I²C通讯。ESP8266的数据表(datasheet)中,GPIO2标注为SDA,GPIO14标注为SCL。SPI
ESP8266的SPI端口情况如下:GPIO14 — CLK
GPIO12 — MISO
GPIO13 — MOSI
GPIO 15 — CS(SS)
在网络系统中,为了保证通信设备之间能正确地进行通信,必须使用一种双方都能够理解的语言,这种语言被称为“协议”。
链路层: 链路层的主要作用是实现设备之间的物理链接
1:无线终端模式:ESP8266可通过WiFi连接无线路由器。这与用您的手机通过WiFi连接无线路由器的模式相同。
2:接入点模式:ESP8266也可以建立WiFi网络供其它设备连接。当ESP8266以此模式运行时,我们可以使用手机搜索ESP8266所发出的WiFi网络并进行连接。
3:混合模式:
将以上两种方式混合即可
IP地址:每一台网络设备都有独立的地址,数据在这些独立的地址间实现传输
网络层主要作用是通过IP协议为联网设备提供IP地址。有了IP地址还不够,因为要确保网络中所有设备IP地址不重复,还需要DHCP (Dynamic Host Configuration Protocol) 服务器来实现这一功能
IPv4 / IPv6
IP协议有两个版本,分别是IPv4和IPv6。IPv6是IPv4的升级版本,因为IPv6可以为更多的网络设备提供独立的IP地址。在本教程中,我们将着重讲解IPv4,因为大多数网络系统仍在使用IPv4。
IPv4版本的IP地址由4个数字组成,如 192.168.0.200 这个IP地址由两部分组成。其中前三个数字(192.168.0)是设备所连接的本地局域网络地址(也称子网地址)。而最后一个数字200是该设备在本地局域网络中的地址编号。
子网掩码(Subnet Mask)
与网络设备相同,网络本身也有自己的地址。
如果我们将网络与网络叠加就可以编织成一张无限大的网,而组成这张大网的每一个小网都可以被称作子网络。通常我们家中的网络是不需要多个子网络的。但是对于大型企业或工业项目,由于联网设备数量很大,一个子网无法满足需求。这时我们就可以将多个网络连接在一起形成一张巨型网络。那么当这些子网组成“大网”后,为了便于网络管理,我们为每一个组成大网的子网络都分配一个独立的地址,这个地址就是子网地址。
那么问题就来了,对于一个IP地址来说,是不是总是前三个数字是子网地址,而最后一个数字是设备序号呢? 不是的。
到这里可能有的朋友会感到困惑了。一个IP地址中,到底哪一部分是子网地址,而哪部分是该设备在子网中的设备序号呢?
一般我们的IP地址前三位是子网地址,这是因为我们对网络设备进行设置的时候,预先设置好子网掩码是255.255.255.0。 可以看到,这个子网掩码也是由4个数字组成的。而且这个子网掩码中只有255和0 这两种数字。而255所在的位置是前3位,最后一位是0。
举个例子:
MAC地址:
网络设备间要想实现通讯,设备之间不光要知道彼此的IP地址,还要知道设备的MAC地址(也叫MAC码)。网络中的每一个设备都有一个独立的MAC地址。这个MAC地址是固化在网络设备硬件中的。
如果ESP8266和手机都是刚刚连入WIFI的, 它们从来没有互相通讯过,因此它们是不可能知道彼此的MAC地址。这可怎么办?要想解决这个问题,ESP8266会向网络中的所有设备广播一条“寻人启事”。这条广播信息的内容大概是这样的。“各位网络中的兄弟姐妹,我是住在IP地址192.168.0.2的设备。我的MAC码是AB-CD。我现在要发送数据给住在IP地址192.168.0.3的设备。请192.168.0.3地址的设备告知你的MAC码。” (注意:现实中的MAC码肯定不是AB-CD这 4个字母构成的。这里为了便于您的理解而将MAC地址进行了简化。)
如果手机听到了这条广播就会回复一条信息给ESP8266,大概的信息是这样的:“你好!我是住在192.168.0.3的设备。我的MAC码是EF-GH。”发送这条信息的同时,手机也会把ESP8266所拥有的IP地址以及MAC码记录下来,以备后用。
到这里,ESP8266和手机就彼此知道了对方的IP地址和MAC码了。接下来他们就可以愉快的网络通(Liao)讯(Tian)了。这种让两台完全不认识彼此的设备获取到对方IP和MAC地址的协议就是ARP了。
网络设备通讯时,数据丢失和数据受损的情况经常出现。传输层的
TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)协议可以用来解决这一问题。通常我们会选择这两种协议中的一种来保证数据传输的准确性。具体选择哪一种协议要看我们使用的是何种网络应用。因为不同的网络应用对于数据的传输要求是不同的。对传达到服务器的要求引出两种概念
TCP:
TCP协议可以更好的保证数据传输的准确性,但是传输速度比UDP协议而言要慢一些。TCP协议的特点是可以保证所有数据都能被接收端接收,数据的传输顺序也不会被打乱,而且如有数据损坏则重发受损数据。基于以上功能特点,TCP通常用于电子邮件及文件上传等。
UDP:
UDP协议并不能保证所有数据都被接收端所接受。一旦出现数据受损的情况,UDP协议将会抛弃受损的数据。这些数据一旦被抛弃将会永久性的消失,发送端不会因为数据受损而重新发送。因此UDP协议远不如TCP协议可靠。但是既然是这样,为何还有人会选择UDP协议呢?这是因为UDP比TCP速度快。因此UDP协议通常用于网络游戏以及语音聊天或视频聊天应用。
HTTP协议
应用层中有很多种协议,最常见是HTTP协议。它常被用来传输网页数据。我们这篇教程也将着重介绍HTTP协议。HTTP协议由请求和响应构成。也就是说,HTTP的工作模式很像是一问一答。
HTTP请求:
举例来说,当您在浏览器输入www.taichi-maker.com这一网址并按下回车,这时候浏览器会把这一操作转换成一个HTTP请求。这个HTTP请求主要分为两大部分。一部分是请求头(Request Header)一部分是请求体(Request Body)。对于我们学习物联网知识来说,请求头是我们重点要关注的内容。
请看以下是简化后的请求头内容:
GET / HTTP/1.1
Host: www.taichi-maker.com
- “GET” 是一个读取请求。也就是请求网站服务器把网页数据发送过来。
- “/” 的作用就是要告诉网站服务器,我这个读取请求的内容是网站根目录下的内容
- “HTTP/1.1” 是指请求所采用的HTTP协议版本是1.1。
- “Host: www.taichi-maker.com”表示请求的域名是 www.taichi-maker.com 也就是太极创客网站的域名。
在 HTTP 协议中,GET只是诸多请求方法中的一种。以下是HTTP协议中的其它请求方法:
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
HTTP响应
HTTP响应内容也是分为两个部分,一部分是响应头(Response Header)一部分是响应体(Response Body)。其中响应体部分是可选项,也就是说有些HTTP响应只有响应头,而响应体是空的。
响应头:
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
- 以下是常见的服务器状态码:
- 100~199:成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。
- 200~299:成功接收请求并已完成整个处理过程。常用200
- 300~399:完成请求,客户需进一步细化请求。
- 400~499:客户端的请求有错误,常用404和403(403的含义是权限不够,服务器拒绝访问。)
- 500~599:服务器端出现错误,常用500
“Content-Type” 指示响应体的内容是什么类型。这里的响应体内容类型是“text/htm”,即网页HTML代码。通过这一行响应头信息,我们的浏览器将会知道,在这一个响应中的响应体部分都是HTML网页代码。于是浏览器将会做好准备,将网页代码翻译成我们人类容易读懂的格式并且呈现在浏览器中。
- 举一个例子,假设某一个响应头中“Content-Type” 类型是”image/jpeg”。这就意味着该响应体中的信息是一个jpeg格式的图片,那么浏览器也就会按照jpeg的解码方式将图片呈现在我们的面前。
DNS(Domain Name System/域名系统):
为了解决IP地址不好记这一问题,DNS被派上了用场。我们可以把DNS看作是一个巨型电话本。电话本中的联系人一栏就是网站的域名,而电话本中的电话号码一栏则是这些网站的IP地址。有了DNS我们就可以使用简单易记的域名来访问网站了。
太极创客的生动例子:
每当我们在浏览器中输入域名www.taichi-maker.com并按下回车后,这时浏览器首先会向DNS服务器发送请求,请求的内容大致如下:“亲爱的DNS服务器,我那个明明可以靠脸吃饭却偏偏要学物联网的主人想访问一个域名是www.taichi-maker.com的网站。麻烦您把这个域名的网站服务器IP地址告诉我好吗?” DNS服务器在接收到这一请求后,会做出以下应答:“亲爱的浏览器,您要的网站服务器ip地址是 12 . 34 . 56 . 78。” 浏览器在接收到这一IP地址后,就开始向这个IP地址所对应的网站服务器正式发出HTTP GET请求了。