IoT-For-Beginners 起步指南:从硬件选型到 MQTT 云控的第一盏智能夜灯
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
本文基于 IoT-For-Beginners 课程仓库的第一项目 Getting Started with IoT(其阿拉伯语版本位于 translations/ar/1-getting-started/README.md)展开:你将了解物联网的基本概念、微控制器与单板计算机的差异、传感器与执行器的工作原理,并跟随课程亲手搭建一个"夜灯"项目——光线变暗时 LED 自动点亮,最终通过 MQTT 把控制逻辑迁移到云端,完成第一个连接云端的 "Hello World" IoT 应用。
一、课程定位:一个贯穿四课的"夜灯"项目
本项目的学习路径由四节课程组成,全部围绕同一个渐进式项目展开:夜灯(nightlight)。它由一个光线传感器和一个 LED 组成,当传感器测得的环境光照低于阈值时,LED 点亮。
| 课程 | 主题 | 在夜灯项目中的角色 |
|---|---|---|
| 第 1 课:认识物联网 | IoT 概念、设备选型与设备初始化 | 完成硬件"Hello World" |
| 第 2 课:深入理解 IoT | 微控制器/单板计算机原理深挖 | 理解你手中的硬件 |
| 第 3 课:传感器与执行器 | 模拟/数字信号、ADC、PWM | 夜灯本地联动:光暗则灯亮 |
| 第 4 课:设备接入互联网 | MQTT、遥测(telemetry)、命令(commands) | 夜灯云端控制 |
仓库为每条课程路径提供三套实现代码:Wio Terminal(Arduino/C++)、Raspberry Pi(Python)以及基于 CounterFit 模拟器的虚拟设备(Python),代码按"每加一个功能就复制一份"的方式存放在code-*目录中,便于对比演进。课程还提供课前/课后测验与作业,多语言译文可在 translations 目录下按语言子目录(ar、zh-CN、ja、de 等 40 多个语言目录)找到对应版本。
二、第一课:什么是 IoT,以及你会用什么设备
IoT 的定义
"Internet of Things"一词由 Kevin Ashton 于 1999 年提出,指通过传感器把互联网与物理世界连接起来。课程给出的界定是:传感器(sensors)从世界收集信息(速度、温度、位置等),执行器(actuators)把电信号转化为现实世界的动作(触发开关、点亮 LED、发声、向其他硬件发送控制信号)。
课程同时强调,IoT 不只是设备:它还包括处理传感器数据、向执行器下发请求的云端服务,以及无需联网、依靠云端训练好的 AI 模型在本地做决策的边缘设备(edge devices)。课程引用的行业估算是:截至 2020 年底约有 300 亿台 IoT 设备在线,到 2025 年 IoT 数据量可能接近 80 ZB(80 万亿 GB)。
微控制器(MCU)vs 单板计算机(SBC)
开发者入门一般从开发套件开始,它们分为两类:
微控制器(Microcontroller / MCU):一个"CPU + 内存 + 可编程 I/O"的小计算机,用于执行有限但非常具体的任务,不能接显示器键盘做通用计算。典型特征是便宜(定制硬件中 MCU 均价可低至 0.5 美元)、功耗低、通常用 C/C++ 编程。课程选用的 Wio Terminal 是一块 Seeed Studio 的微控制器开发板,集成传感器、执行器、WiFi 和屏幕,售价约 30 美元。
单板计算机(Single-board computer):一块板上装下完整计算机要素、可跑完整操作系统的小型设备,规格接近台式机/笔记本但更小更省电。课程选用 Raspberry Pi 4(运行 Raspberry Pi OS,即 Debian Linux 的一个发行版),IoT 应用通常用 Python 编写。
课程后续所有练习同时支持三种设备选择:Arduino(Wio Terminal)、树莓派 4、以及运行在 PC/Mac 上的虚拟单板计算机——用 Python 实现的硬件模拟器(CounterFit 项目),可自定义传感器数值并在屏幕上显示执行器效果,无需购买任何硬件即可完成全部练习。完整采购清单与两套 Starter Kit 见 hardware.md。
三、第二课:IoT 应用的组成与硬件原理深挖
IoT 应用 = The Thing + The Internet
课程以智能恒温器为例拆解应用架构:设备侧(The Thing)由温度传感器、设定温度的旋钮/触屏和连接暖通系统的执行器组成;云端(The Internet)一侧则是负责安全、接收遥测、回发指令的云服务,以及数据库、手机 App、甚至天气/日历等数据源的决策服务。
图中模式正是第 4 课 MQTT 通信的基础:设备与云服务都连接到同一个 broker,设备发布遥测、订阅命令,云服务订阅遥测、向设备发布命令。
更进一步的"聪明恒温器"会引入云端 AI,结合占用传感器、天气和日历数据做更精细的决策。课程还讨论了边缘计算(在本地网关处理数据以获得速度、离线能力与隐私,如智能音箱的本地唤醒词检测)与IoT 安全(设备安全性取决于云服务的安全,历史上出现过 Stuxnet、婴儿监视器被入侵等真实案例;部分场景采用与互联网完全隔离的 air-gapped 网络)。
微控制器:CPU、内存、I/O
- CPU:靠时钟周期执行指令(fetch-decode-execute 循环)。速度单位是赫兹,Wio Terminal 的 CPU 主频为 120MHz,远低于 PC 的多 GHz 多核;更低的时钟意味着更低的功耗与发热——微控制器没有散热片风扇也能靠小电池运行数月到数年,部分 MCU 还内置高低功耗多核切换。
- 内存:分为非易失的程序内存(存代码,断电不丢)和易失的RAM(存变量与数据,断电即失)。课程用了一个直观对比:Wio Terminal 有 192KB RAM(192,000 字节)和 4MB 程序存储,比一台 8GB RAM 的典型 PC 小 4 万多倍。
- I/O:GPIO 引脚在软件中配置为输入(读传感器)或输出(驱动执行器)。
- 框架:MCU 不跑桌面意义上的操作系统(内存与算力都不够),常用轻量框架或 RTOS(实时操作系统,提供多线程、网络、GUI 支持)。Arduino是最流行的 MCU 框架:一个 sketch 由
setup()(上电执行一次,做 WiFi 连接、引脚初始化等)和loop()(无限循环执行,读传感器、发数据)两个函数构成,属于典型的事件循环(event loop)架构。Arduino 标准库(如delay、digitalRead)屏蔽底层差异,同一份代码可重编译到不同板子上运行。
单板计算机:以 Raspberry Pi 为例
- Raspberry Pi 4B:四核 1.5GHz CPU、2/4/8GB RAM、千兆以太网、WiFi、双 HDMI(支持 4K)、2 个 USB 2.0 + 2 个 USB 3.0、40 个 GPIO 引脚、摄像头接口与 SD 卡槽,板卡尺寸 88mm × 58mm,3A USB-C 供电,起价 35 美元。
- Pi Zero:单核 1GHz CPU、512MB RAM、零版尺寸 65mm × 30mm × 5mm,5 美元(带 WiFi 的 Zero W 10 美元)。
- 两者均为ARM 处理器(而非 PC 的 x86/x64),运行 Raspberry Pi OS,有带桌面的完整版与适合"无头"(headless)项目的 Lite 版;因为是 Debian Linux,任何为 ARM 构建的 Debian 软件包都能安装。
- SBC 是完整计算机,任何语言皆可编程;Pi 生态中大量硬件以 Python 库形式提供,许多外设通过"hat"(戴在 GPIO 排针上的扩展板,如屏幕、传感器、标准线缆转接板)接入。
- 在生产级 IoT 部署中 SBC 同样常见,例如 Compute Module 4 就是把 Pi 4 的算力做成紧凑板卡,嵌入定制硬件中。
四、第三课:传感器与执行器——让夜灯动起来
传感器:把物理世界变成电信号
传感器测量一个或多个物理属性并发送给 IoT 设备,常见类型包括温度(常与气压、湿度集成)、按钮、光线(可见光/UV/IR/特定颜色)、摄像头、加速度计、麦克风。所有传感器的共同点是:把所感知的量转换为设备可解读的电信号。
模拟传感器:设备给传感器施加一个电压,传感器内部元件改变该电压,回读电压即为测量值。课程用电位器(potentiometer)举例:输入 5V,旋钮打到中间时输出约 3.8V,打到 0 输出 0V,打到 11 输出 5V。温度传感器则基于热敏电阻(thermistor)随温度变化的电阻,输出电压再由代码换算为 K/°C/°F。
由于 IoT 设备只能处理数字信号,模拟值必须经过模数转换(ADC):设备自带 ADC,或通过带 ADC 的转接板(如 Seeed Grove 生态中坐在树莓派 GPIO 上的 hat)。课程给出的换算示例:一个 3.3V 供电的 Grove 光线传感器输出 0–1023 的数字量,1V 电压对应约 300,Grove hat 将其转换为 300 的二进制0000000100101100再交给设备处理。写代码时这些细节被库封装:Grove 光线传感器在 Python 里读light属性,在 Arduino 里调用analogRead。
数字传感器:直接输出数字信号,最简单的就是按钮/开关——只读"通/断"两态。GPIO 直接测 0 或 1(树莓派 3.3V 引脚:高于 1.8V 判为 1,低于判为 0,存在容差)。更高级的数字传感器内部自带 ADC:仍用热电偶测电阻变化,但由板载 ADC 转换成 0/1 序列发出,因此可以携带更复杂甚至加密的数据——摄像头就是典型,它以 JPEG 等压缩格式发送图像或视频流。
执行器:把电信号变回物理动作
执行器与传感器相反:LED、扬声器、步进电机、继电器(用小电压信号控制大电压回路的开关)、屏幕。同样分模拟与数字两类:
- 模拟执行器(如可调光灯光):亮度随电压变化。设备是数字的,需要DAC(数模转换)把 0/1 转成电压输出。
- PWM(脉宽调制):另一种"数字模拟化"手段——快速切换高/低电平脉冲,等效于模拟信号。课程的经典算例:5V 供电的电机,高电平持续 0.02s(转 0.1 圈即 36°)、低电平 0.02s,一个周期 0.04s,则每秒 25 个脉冲 × 0.1 圈 = 2.5 圈/秒 =150rpm;保持周期不变但把高电平减半到 0.01s(占空比从 50% 降到 25%),每个脉冲只转 0.05 圈,得到 1.25 圈/秒 =75rpm。只改脉冲宽度就改变模拟电机转速。
- 数字执行器:两态设备直接由高低电平驱动,最简单的就是 LED——发 1 加高电压点亮,发 0 熄灯。
动手:本地版夜灯
第 3 课的任务是把 LED 接上、由光线传感器控制,构建 IoT 夜灯(流程即"读光照 → 判断 → 控 LED")。仓库中虚拟设备路径的最终代码在 code-actuator/virtual-device/nightlight/app.py:
import time from counterfit_connection import CounterFitConnection from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor from counterfit_shims_grove.grove_led import GroveLed CounterFitConnection.init('127.0.0.1', 5000) light_sensor = GroveLightSensor(0) # 接在 Grove 端口 0 的光线传感器 led = GroveLed(5) # 接在 Grove 端口 5 的 LED while True: light = light_sensor.light print('Light level:', light) if light < 300: # 光照低于阈值 300(0-1023 量程) led.on() else: led.off() time.sleep(1) # 每秒循环一次从源码结构看,CounterFitConnection.init('127.0.0.1', 5000)连接的是本地 CounterFit 模拟器,GroveLightSensor/GroveLed是 Grove 硬件的 Python shim(垫片库),light属性读到的正是前面 ADC 章节中 0–1023 量程的数字值——阈值 300 与此量程直接对应。Pi 路径的代码在 code-actuator/pi/nightlight/app.py,Wio Terminal 路径则在 code-actuator/wio-terminal/nightlight/src/main.cpp。
五、第四课:接入互联网——MQTT、遥测与命令
I(Internet)是 IoT 的另一半。课程定义:遥测(telemetry)是传感器采集并上传云端的数据;命令(command)是云端发给设备的指令(通过执行器输出,或让设备自身重启/收集额外遥测)。
MQTT:发布/订阅的消息协议
设备与云通常不直连,而是经过broker(消息代理)做发布/订阅:设备发布遥测、订阅命令;云服务订阅全部遥测、向特定设备或设备组发布命令。MQTT 是最流行的轻量级开放标准消息协议,1999 年为监控输油管道设计,15 年后由 IBM 发布为开放标准。
课程给出的 MQTT 要点:
- 主题(topic)可分层并支持通配符:如把温度发到
/telemetry/temperature、湿度发到/telemetry/humidity,云端订阅/telemetry/*即可一次收全。 - 服务质量(QoS)三档:At most once(发一次不确认,fire and forget);At least once(重发直到确认);Exactly once(两级握手保证只收一份)。
- 名字里有 Queue 但没有消息队列:断线重连后收不到离线期间发的消息;可用retained 标志让 broker 保存某主题的最后一封消息,新订阅者立即拿到最新值。
- Keep alive机制在消息长间隔时检查连接是否存活。
- MQTT 走 TCP/IP(与 HTTP 相同底层协议、不同端口),也可经 WebSocket 供浏览器使用;连接可以是匿名的,也可用用户名/密码或证书加密。
实操中课程不建议自己搭 broker,而是直接用 Eclipse Mosquitto 的公开测试 brokertest.mosquitto.org(开源、免账号,注意它是公开不安全的,任何人可监听,不能传隐私数据)。想自建时可用 Mosquitto,默认禁止匿名与外部连接,可通过mosquitto.conf打开:
listener 1883 0.0.0.0 allow_anonymous true动手第 1 步:设备端发布遥测
设备代码(虚拟设备路径,code-mqtt/virtual-device/nightlight/app.py)在第 3 课基础上加入了 paho-mqtt 客户端,把光照值作为 JSON 遥测发布到<ID>/telemetry主题:
import time from counterfit_connection import CounterFitConnection from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor from counterfit_shims_grove.grove_led import GroveLed import paho.mqtt.client as mqtt CounterFitConnection.init('127.0.0.1', 5000) light_sensor = GroveLightSensor(0) led = GroveLed(5) id = '<ID>' # 替换为你自定义的唯一设备 ID client_name = id + 'nightlight_client' mqtt_client = mqtt.Client(client_name) mqtt_client.connect('test.mosquitto.org') mqtt_client.loop_start() print("MQTT connected!") while True: light = light_sensor.light print('Light level:', light) if light < 300: led.on() else: led.off() time.sleep(1)⚠️ 设备端与服务端必须使用同一个
<ID>,否则订阅/发布的主题对不上。
动手第 2 步:写一个本地"服务端"收遥测
所谓服务端代码,就是将来会部署到云服务的处理逻辑,这里先在本地电脑上跑。先配置 Python 虚拟环境并安装 MQTT 库(pip 包默认装到整机会造成版本冲突,虚拟环境把依赖隔离在专用目录里):
mkdir nightlight-server cd nightlight-server # 显式用 python3 建环境(防止误用 Python 2) python3 -m venv .venv激活虚拟环境(注意始终在创建环境的那个目录里操作,不要进入.venv):
- Windows 命令行:
.venv\Scripts\activate.bat - Windows PowerShell:
.\.venv\Scripts\Activate.ps1 - macOS / Linux:
source ./.venv/bin/activate
验证与安装:
python --version # 3.6 以上即可 pip install paho-mqtt # 只装进当前虚拟环境然后创建并打开app.py(Windows 用type nul > app.py,macOS/Linux 用touch app.py,code .打开当前目录)。仓库中对应的完整服务端代码在 code-server/server/app.py:
import json import time import paho.mqtt.client as mqtt id = '<ID>' client_telemetry_topic = id + '/telemetry' client_name = id + '_nightlight_server' mqtt_client = mqtt.Client(client_name) mqtt_client.connect('test.mosquitto.org') mqtt_client.loop_start() def handle_telemetry(client, userdata, message): payload = json.loads(message.payload.decode()) print("Message received:", payload) mqtt_client.subscribe(client_telemetry_topic) mqtt_client.on_message = handle_telemetry while True: time.sleep(2)逐行要点:mqtt.Client(client_name)创建带唯一客户端名的 MQTT 客户端;loop_start()在后台线程里跑消息处理循环,这样主线程不会被阻塞;subscribe订阅遥测主题并注册on_message回调——收到消息时handle_telemetry把 JSON payload 解码后打印;最后的无限循环只是让进程保持存活。
VS Code 打开项目时会自动激活虚拟环境(状态栏可见);若旧终端没加载环境,点"Kill the active terminal instance"杀掉后开新终端,提示符应带(.venv)。运行python app.py后调整设备的光照,终端输出形如:
(.venv) ➜ nightlight-server python app.py Message received: {'light': 0} Message received: {'light': 400}遥测数据以JSON(JavaScript Object Notation,键/值对文本编码标准)发送。课程还以恒温器为例展示了遥测表的典型形态(thermostat_temperature: 18°C、livingroom_temperature: 19°C…),并给出两个工程判断:
- 多久发一次遥测?取决于场景:恒温器几分钟一次足够,每秒一次会浪费带宽、电池与云资源;工厂关键设备则可能要每秒多次,"宁可浪费带宽,不能漏掉停机信号"。
- 断线期间数据丢还是存?也取决于场景:恒温器只需"现在"的温度,可丢;机器故障趋势分析(异常检测、预测性维护)则需要重连后补发离线期间全部遥测。MQTT 本身不负责断线补传,需设备/服务端自行实现(如约定回复主题 + 手动队列重放)。
动手第 3 步:服务端回发命令,实现云端控灯
assignment-1-internet-flow.png
服务端要做的就是"读到遥测 → 判断 → 发布命令"。在client_telemetry_topic声明之后增加命令主题,并在handle_telemetry末尾追加回发逻辑(仓库完整版见 code-commands/server/app.py):
server_command_topic = id + '/commands'command = { 'led_on' : payload['light'] < 300 } print("Sending message:", command) client.publish(server_command_topic, json.dumps(command))逻辑与第 3 课的本地判断完全相同——只是把if light < 300从设备搬到了"服务器":光照低于 300 时发led_on: true,否则false。运行后输出形如:
Message received: {'light': 0} Sending message: {'led_on': True} Message received: {'light': 400} Sending message: {'led_on': False}设备端再补一段订阅<ID>/commands主题、解析led_on并驱动 LED 的代码即可闭环(Wio Terminal 路径见 wio-terminal-commands.md,单板计算机/虚拟设备路径见 single-board-computer-commands.md)。
关于主题设计,课程提醒:当前所有设备共用一个 telemetry 主题、一个 commands 主题——若想给某台特定设备单独发命令,可用含设备唯一 ID 的主题,如/commands/device1、/commands/device2,让每台设备只监听属于自己的主题。命令的断线语义同样"看场景":如果最新命令覆盖旧命令(开→关),旧的可以不重发;如果是顺序敏感的指令(机械臂先抬起再夹取),则恢复连接后必须按序重放。
六、小结与后续路径
至此,第一项目的四课完成了 IoT 入门的完整闭环:概念与硬件选型(课 1、课 2)→ 本地传感与控制(课 3,本地阈值 300 直接控 LED)→ 云端控制(课 4,MQTT 遥测上行 + 命令下行,阈值判断迁到服务端)。这个"夜灯"就是本课程的 Hello World,其架构(设备 ↔ broker ↔ 云服务)会在后续项目中反复出现。
按课程路线图(12 周、24 课),接下来会进入真实业务场景:农场:预测植物生长与自动灌溉、交通:位置追踪与地理围栏、制造:水果质量检测、零售:货架库存检测、消费电子:语音识别与多语言支持。每课同样提供 Wio Terminal、Raspberry Pi 与虚拟设备三条实现路径,可直接查看本仓库对应code-*目录下的代码对照学习。
【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考