1、IoT入门:物联网概念、阿里云IoT平台概述、设备接入协议简介(MQTT/CoAP/HTTP)
1.1 物联网到底是什么?
说实话,物联网这个概念已经被炒了很多年了。但在我接触过的上百个项目中,真正能把IoT做明白的团队其实不多。
物联网,英文叫Internet of Things(IoT)。说白了,就是把物理世界里的设备——传感器、控制器、家电、工业机器——都连到互联网上。让它们能说话、能听话、能干活。
我习惯用一个公式来理解:物联网 = 感知 + 传输 + 处理 + 控制。
- 感知层:温度传感器、摄像头、GPS模块……这些是物联网的“眼睛和耳朵”。
- 传输层:Wi-Fi、4G/5G、LoRa、NB-IoT……这是物联网的“神经”。
- 处理层:云平台、边缘计算……这是物联网的“大脑”。
- 控制层:继电器、电机、阀门……这是物联网的“手脚”。
我在2018年做过一个冷链物流项目,当时客户说“我要实时监控冷藏车的温度”。听起来简单吧?但实际做起来,从传感器选型到数据上云,再到告警推送,每一步都有坑。嗯,这个我们后面会细讲。
1.2 阿里云IoT平台能做什么?
阿里云IoT平台,全称是阿里云物联网平台。它不是一个简单的“云服务器”,而是一整套设备接入、数据存储、规则引擎、设备管理的PaaS服务。
我个人觉得,它最大的价值在于:你不需要从零搭建MQTT服务器、设备认证系统、数据存储集群。这些脏活累活,平台都帮你干了。
平台的核心能力,我列个表给你看:
| 功能模块 | 说明 | 我常用的场景 |
|---|---|---|
| 设备接入 | 支持MQTT、CoAP、HTTP协议 | 智能家居设备首选MQTT |
| 设备管理 | 注册、认证、在线状态、影子设备 | 批量管理几千台设备时很香 |
| 数据流转 | 规则引擎转发到RDS、TSDB、函数计算 | 实时数据清洗和存储 |
| 监控运维 | 日志服务、在线调试、远程升级OTA | 设备出问题时排查利器 |
| 安全认证 | 一机一密、一型一密、X.509证书 | 工业场景我推荐证书方式 |
你想想看,如果让你自己搭建一套支持百万级设备接入的MQTT集群,光运维成本就够你喝一壶的。阿里云IoT平台把这些都封装好了,你只需要关注业务逻辑。
1.3 设备接入协议:MQTT、CoAP、HTTP
设备怎么跟云平台通信?这就涉及到协议了。我见过不少新手一上来就问“哪个协议最好?”——其实没有最好的,只有最合适的。
1.3.1 MQTT——物联网的事实标准
MQTT(Message Queuing Telemetry Transport)是我最常用的协议。它基于发布/订阅模式,特点是轻量、省流量、支持双向通信。
为什么它适合IoT?
- 报文头最小只有2字节,比HTTP小太多了
- 支持QoS 0/1/2三种服务质量,网络差的时候也能保证消息送达
- 支持遗嘱消息(Will Message),设备突然掉线时能通知其他设备
- 支持保留消息(Retained Message),新设备上线就能拿到最新状态
我在一个智能路灯项目里,用MQTT同时管理了5000多个节点。每个节点每30秒上报一次电压和电流数据,服务器端用订阅的方式接收,整个系统跑了一年多没出过问题。
重要提示:阿里云IoT平台的MQTT接入点格式为:${productKey}.iot-as-mqtt.${regionId}.aliyuncs.com:1883。端口1883是普通TCP,端口443是WebSocket。
1.3.2 CoAP——专为受限设备而生
CoAP(Constrained Application Protocol)是另一种选择。它基于UDP,比MQTT还要轻量。适合那些内存只有几十KB、CPU主频几十MHz的“小”设备。
CoAP的特点:
- 基于UDP,没有TCP的三次握手开销
- 支持GET/POST/PUT/DELETE,类似HTTP的RESTful风格
- 支持观察模式(Observe),设备可以订阅资源变化
- 报文用二进制格式,解析效率高
我曾经在一个水表抄表项目里用过CoAP。水表用的是电池供电,要求一节电池用5年。MQTT的TCP长连接太耗电了,换成CoAP后,每次上报完就休眠,功耗直接降了70%。
注意:CoAP基于UDP,在公网环境下可能会丢包。阿里云IoT平台对CoAP做了优化,支持确认重传机制。但如果你对可靠性要求极高(比如工业控制),还是建议用MQTT。
1.3.3 HTTP——简单但不够“物”
HTTP协议,大家都很熟悉了。在IoT场景里,它通常用于设备上报数据,或者云端下发指令。
但说实话,我不太推荐在设备端用HTTP做实时通信。原因很简单:
- HTTP是请求-响应模式,服务器不能主动推送数据(除非轮询)
- 报文头太大,一个请求动不动几百字节,对流量敏感的设备不友好
- 每次请求都要建立TCP连接,频繁连接断开对设备资源消耗大
那HTTP在IoT里就没用了吗?也不是。我一般在以下场景用HTTP:
- 设备固件OTA升级,下载大文件时用HTTP更合适
- 设备定时上报非实时数据(比如每天一次的统计报表)
- 快速原型验证,不想引入MQTT客户端库的时候
1.4 协议对比:一张表看懂怎么选
| 对比项 | MQTT | CoAP | HTTP |
|---|---|---|---|
| 传输层 | TCP | UDP | TCP |
| 报文开销 | 2字节起 | 4字节起 | 几百字节 |
| 通信模式 | 发布/订阅 | 请求/响应 + 观察 | 请求/响应 |
| 双向通信 | 原生支持 | 需轮询或观察 | 需轮询 |
| 功耗 | 中等 | 低 | 高 |
| 适用场景 | 实时控制、数据上报 | 电池供电、低功耗 | OTA升级、非实时数据 |
我的建议:如果你刚开始做IoT项目,直接选MQTT。它生态最成熟,阿里云的支持也最好。等遇到功耗瓶颈了,再考虑CoAP。HTTP嘛,作为补充手段就好。
1.5 一个小例子:设备用MQTT上报温度
光说不练假把式。我写个简单的Python示例,演示设备如何用MQTT连接到阿里云IoT平台,并上报温度数据。
# 需要安装 paho-mqtt 库
# pip install paho-mqtt
import paho.mqtt.client as mqtt
import json
import time
# 设备三元组(从阿里云IoT平台获取)
product_key = "a1xxxxxx"
device_name = "test_device_01"
device_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxx"
# 计算MQTT连接密码(阿里云签名方式)
# 这里简化处理,实际项目中用阿里云提供的签名工具
username = f"{device_name}&{product_key}"
password = "signature_hmac_sha1" # 实际需要计算
# MQTT连接地址
broker = f"{product_key}.iot-as-mqtt.cn-shanghai.aliyuncs.com"
port = 1883
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("连接成功!")
else:
print(f"连接失败,返回码:{rc}")
def on_publish(client, userdata, mid):
print(f"消息发送成功,mid={mid}")
client = mqtt.Client(client_id=f"{device_name}&{product_key}")
client.username_pw_set(username, password)
client.on_connect = on_connect
client.on_publish = on_publish
client.connect(broker, port, 60)
client.loop_start()
# 上报温度数据
topic = f"/sys/{product_key}/{device_name}/thing/event/property/post"
payload = {
"id": int(time.time()),
"params": {
"temperature": 25.6,
"humidity": 60.2
},
"method": "thing.event.property.post"
}
client.publish(topic, json.dumps(payload), qos=1)
time.sleep(2)
client.loop_stop()
client.disconnect()
这段代码虽然简单,但核心流程都有了:建立连接、构造属性上报报文、发布到指定Topic。我在实际项目中,会把这段逻辑封装成一个设备SDK,加上重连机制和心跳保活。
嗯,这里要注意:阿里云IoT平台的Topic格式是固定的,/sys/{productKey}/{deviceName}/thing/event/property/post 是属性上报的Topic。别写错了,否则数据上不去。
1.6 本章小结
这一章我们聊了物联网的基本概念,了解了阿里云IoT平台能帮我们做什么,也对比了三种主流的设备接入协议。
我个人觉得,入门阶段最重要的是理解“设备-平台-应用”这三层架构。协议只是工具,选哪个取决于你的设备能力和业务需求。
下一章,我们会深入阿里云IoT平台的控制台,手把手教你创建产品、注册设备、配置Topic。到时候我会分享一些我在项目中踩过的坑,比如设备三元组怎么安全存储、Topic权限怎么设置才合理。
准备好了吗?我们继续。