万物互联

物联网

怎么学习?

物联网从整个体系结构来看,可以分为三个层面。

  1. 第一是设备层,也就是各种硬件设备。

    设备组件有传感器,比如测量温度、湿度、光照强度等参数的设备;也有执行器,比如控制电路通断的继电器、实现物体移动的马达等物联网设备,不仅涉及传统嵌入式系统的开发,而且也需要考虑通信技术,比如 Wi-Fi、蓝牙和蜂窝网络等。你只有熟悉它们的特点,才能在实践中做出正确的选择。

  2. 第二是网络层,主要关注的是设备与物联网平台的通信协议。

    物联网的网络通信仍然是基于互联网的,所以底层还是 TCP/IP 协议。应用中你更多需要了解、掌握的是具体的网络协议,比如 HTTP、MQTT 和 AMQP 等。在做物联网系统设计的时候,你得搞清楚这些协议的适用场景。

  3. 第三是应用层,也就是实现具体业务逻辑的地方。
    除了像普通互联网后台一样,要面对服务器框架、数据库系统、消息队列等问题外,物联网系统首先需要处理的就是海量的数据。这又可以分为三个方面:
    数据存储,比如 NoSQL 数据库和时序数据库的选择。
    数据处理,比如 Spark、Flink 等大数据处理框架的不同特点,批处理和流处理的适用场景等。
    数据分析,如各类机器学习算法,甚至 AI 的应用。
    设备层、网络层和应用层这三个层面的知识,都是你在设计和实施一个物联网系统的过程中需要掌握的。另外,现在数据隐私和系统安全越来越重要,它们贯穿系统的整个生命周期,也是需要你通盘考虑的事情。我提供了一个知识体系图,供你随时查看。

image-20240525223110632

物理层

网络层

物联网行业也有一些自己专有的通信技术,比如LoRaSigFox物联网行业也有一些自己专有的通信技术,比如LoRa和 SigFox

无线通信技术的 4 个重要参数:频段、信道、信道带宽、传输速率

无线通信技术

image-20240526161129415

频段

无线通信当然用的是电磁波,在实际应用中,电磁波是按照频段来使用的。频段是指电磁波频率的一个范围

wifi的频段为:2.412GHz-2.484GHz (1 GHz = 10^9 Hz)

image-20240526155728236

信道

它是信息通过无线电波传送的具体通道介质。每种通信技术的频段会被划分、规划成多个信道来使用。
比如,Wi-Fi 的频段被分为 14 个信道(中国可用的是 13 个信道,信道 14 排除在外)。这里需要注意的是,相邻信道的频段是存在重叠的。比如,Wi-Fi 的信道 1 频段是 2.401GHz~2.423GHz,信道 2 频段是 2.406GHz~2.428GHz。

信道带宽

信道频段的最大值和最小值之差,就是信道覆盖的范围大小,也叫信道带宽。比如,Wi-Fi 信道 1 的带宽是 22MHz,它是由 2.423GHz 减去 2.401GHz 得到的。

传输速率

传输速率受很多因素的影响,比如信道带宽和频率。一般来说,带宽越大,传输速率就越大,就像路面越宽可以承载的通行车辆越多一样;频率比较高时,电磁环境相对比较干净、干扰少,传输速率会更高,就像道路更平坦自然可以通行更多车辆一样。

Wi-Fi

MQTT

文档

【MQTT协议详解】MQTT协议-CSDN博客

springboot集成mqtt(超级无敌详细)-CSDN博客

定义

MQTT(消息队列遥测传输) 是基于 发布/订阅 范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议

通信过程

img

MQTT协议控制报文

  1. 控制报文类型
1
2
3
	              控制报文 = 固定报头 + 可变报头 + 有效载荷
固定报头共2个字节,一个字节占8位。第一个字节前4位是用于指定控制报文类型的标志位,后4位是控制报文类型;第二个字节是剩余长度。
剩余长度表示当前报文剩余部分的字节数,包括可变报头和有效负载

img

img

ESP8266实践

基础知识

PWM

PWM(Pulse Width Modulation,脉冲宽度调制)是一种模拟控制技术,通过调整脉冲信号的占空比(高电平时间与脉冲周期之比)来模拟输出电压的级别。在数字控制系统中,PWM 是一种常用的技术,因为它允许使用数字信号来控制模拟量,如电压、电流或光强等。

GPIO

ESP8266的G端口(通常指的是GPIO端口)是其一个非常重要的部分,用于与外部设备或电路进行通信和控制。以下是对ESP8266 GPIO端口作用的详细解释:

  1. 引脚数量和功能

    • ESP8266拥有多个GPIO引脚,如ESP8266 NodeMCU开发板共有17个GPIO引脚(GPIO0至GPIO16)。
    • 这些引脚可以通过编程配置为不同的功能,如输入、输出、中断触发等。
  2. 引脚复用

    • ESP8266的GPIO引脚支持复用功能,即一个引脚可以配置为执行多种功能,如I2C、SPI、UART、PWM等。
    • 这种复用功能增加了硬件的灵活性和扩展性。
  3. 数据传输

    • GPIO引脚可以用于数据传输,包括从外部设备读取数据或将数据发送到外部设备。
    • 通过编程控制GPIO引脚的状态(高电平或低电平),可以实现与外部设备的通信。
  4. 中断触发

    • GPIO引脚还可以配置为中断触发源,用于检测外部事件(如按钮按下、传感器信号变化等)。
    • 当检测到外部事件时,GPIO引脚会触发一个中断信号,通知ESP8266进行相应的处理。
  5. 低功耗模式

    • 在低功耗模式下,GPIO引脚可以被设定为保持状态,以节省能源。
    • 这对于需要长时间运行且能源有限的应用场景非常重要。
  6. 模拟输入

    • ESP8266的部分GPIO引脚还支持模拟输入功能,可以通过ADC(模拟-数字转换器)将模拟信号转换为数字信号进行读取。
  7. 特殊引脚

    • 除了通用的GPIO引脚外,ESP8266还有一些特殊功能的引脚,如用于启动模式的引脚(如GPIO0、GPIO2等)。

总结:ESP8266的G端口(GPIO引脚)是其与外部世界交互的重要接口,具有多种功能和灵活性。通过编程配置GPIO引脚的状态和功能,可以实现与外部设备的通信、控制、数据传输等功能,满足各种应用场景的需求。

闪烁小灯

1
2
3
4
5
6
7
8
9
10
11
12
int LED = LED_BUILTIN;//定义 IO 口 2 既 LED_BUILTIN 引脚,对应开发板内置 LED 灯
void setup()
{
pinMode(LED,OUTPUT);//设置 IO 口 2 为输出接口,我们用到的 I/O 口都要进行类似这样
}
void loop() //死循环体
{
digitalWrite(LED,LOW);//IO 口 2 设置为低电平,点亮数字 2 口 LED
delay(500);
digitalWrite(LED,HIGH);
delay(500);
}

串口通信

在串行通信中,波特率(baud rate)是一个非常重要的参数,它定义了数据在串行线路上传输的速率,即每秒传输的位数(bit per second, bps)。当两个设备(例如,一个微控制器和一个计算机)通过串行接口进行通信时,它们必须同意使用相同的波特率,以确保发送和接收的数据在时序上能够正确匹配。

1
2
3
4
5
6
7
8
9
10
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);//设置串口波特率为115200
}

void loop() {
// put your main code here, to run repeatedly:
Serial.printf("Hello World!\n");//向串口发送字符
delay(500);//延时500ms
}

水位监测

实验连线:ESP8266 核心板的“3V”接水位检测模块的“+”,“G”接“-”,“A0”接“S”。

【第5课】esp8266测量水位并通过串口发送给电脑端(模数转换、串口通信)——零基础入门物联网开发教程_哔哩哔哩_bilibili

image-20240601133712563

1
2
3
4
5
6
7
8
9
int value = 0;//定义读取的值
void setup() {
Serial.begin(9600);//打开串口,可以在串口监视器中查看测量的数值
}
void loop() {
value = (analogRead(A0)*100)/1024;//将测量到的值以百分比的形式保存到变量value中
Serial.println(value);//向串口发送测量到的值
delay(500);//延时一会儿,让串口输出慢一点便于观察
}

analogRead():读取某个端的信号,这里读取的是A0端,A0口用于读取模拟信号,如从模拟传感器(如光敏电阻、温度传感器等)接收到的电压值(0-3或者5v)由于ESP8266使用的是10位ADC(模拟-数字转换器),因此其精度为1024个等级(包括0和1023)

温湿度监测

image-20240601162750568

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <DHT.h>//调用dht11驱动库
#define DHTPIN 2 //说明数据接口为8266开发板的D4口,也可以写为#define DHTPIN 2既8266芯片的IO口2
#define DHTTYPE DHT11//说明使用的模块是DHT11
DHT dht(DHTPIN,DHTTYPE);// 将两参数传递给测量函数

void setup() {
// put your setup code here, to run once:
dht.begin();//开始测量
Serial.begin(9600);//打开串口,设置波特率
}

void loop() {
// put your main code here, to run repeatedly:
delay(200);//延时,等待测量完成
float h = dht.readHumidity();//读取湿度
float t =dht.readTemperature();//读取温度

Serial.print("当前湿度:");//发送字符“当前湿度:”
Serial.print(h);//发送湿度值
Serial.println("%");//发送湿度值

Serial.print("当前温度:");//发送字符“当前温度:”
Serial.print(t);//发送温度值
Serial.println("℃");//发送湿度值
delay(2000);//2s测量一次
}