4. 创建并注册第一个设备
在 AWS IoT Core 中,“设备”并不是一个物理实体,而是由三部分共同定义:Thing(设备影子身份)、X.509 证书(身份凭证)和IoT 策略(权限边界)。三者缺一不可——没有 Thing,设备无法被分组和检索;没有证书,MQTT 连接会被 TLS 层直接拒绝;没有策略,即使连上了也无法发布或订阅任何主题。本节以一台名为 sensor-001 的温湿度传感器为例,完整走通从控制台创建到 MQTT 连接测试的全过程。
一、创建 Thing:给设备一个可检索的身份
登录 AWS 控制台,进入 IoT Core → 管理 → 所有设备 → 事物,点击“创建事物”。选择“创建单个事物”,在“事物名称”中填写 sensor-001。名称建议遵循 产品线-序号 或 站点-设备类型-编号 的命名规范,因为后续策略中的 iot:Connection.Thing.ThingName 变量会直接引用它。
展开“事物属性”可添加可选元数据,例如 location=shanghai-lab、model=SHT30。这些属性不参与鉴权,但可用于后续设备分组、批量查询和运维检索。创建完成后,Thing 记录中会出现一个唯一的 ARN,形如 arn:aws:iot:cn-north-1:123456789012:thing/sensor-001。
二、生成证书:一次性下载,永久保存
在创建事物向导中,选择“自动生成新证书(推荐)”。AWS IoT Core 会调用其内置 CA 签发一张 X.509 设备证书,并同时生成一对 RSA 2048 位密钥。控制台会提供四个文件:
xxxxxxxx-certificate.pem.crt:设备证书,包含公钥和 CA 签名;xxxxxxxx-private.pem.key:设备私钥,只在生成时下载一次;xxxxxxxx-public.pem.key:公钥,通常用于调试;AmazonRootCA1.pem:根 CA 证书,用于验证服务端身份。
证书生成后处于“激活”状态。若需要临时停用某台设备,可在证书详情页点击“停用”,此时该证书对应的 MQTT 连接会被立即断开,且无法重新连接,这是比删除 Thing 更细粒度的设备管控手段。
三、附加策略:定义设备能做什么
证书只证明“你是谁”,策略才决定“你能做什么”。在证书详情页点击“附加策略”,选择“创建策略”。以下是一条最小权限策略示例,允许 sensor-001 连接、发布自身遥测数据、订阅自身命令主题:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iot:Connect",
"Resource": "arn:aws:iot:cn-north-1:123456789012:client/${iot:Connection.Thing.ThingName}"
},
{
"Effect": "Allow",
"Action": "iot:Publish",
"Resource": "arn:aws:iot:cn-north-1:123456789012:topic/devices/${iot:Connection.Thing.ThingName}/telemetry"
},
{
"Effect": "Allow",
"Action": "iot:Subscribe",
"Resource": "arn:aws:iot:cn-north-1:123456789012:topicfilter/devices/${iot:Connection.Thing.ThingName}/cmd"
},
{
"Effect": "Allow",
"Action": "iot:Receive",
"Resource": "arn:aws:iot:cn-north-1:123456789012:topic/devices/${iot:Connection.Thing.ThingName}/cmd"
}
]
}
注意 ${iot:Connection.Thing.ThingName} 是策略变量,运行时会被替换为实际连接的 Thing 名称。这样一条策略可以复用于所有遵循相同命名规范的设备,无需为每台设备单独编写策略。策略创建后,回到证书页面将其附加到证书上,附加关系立即生效,无需重启设备。
四、下载密钥并完成 MQTT 连接测试
将四个文件下载到设备本地后,推荐使用 mosquitto_pub 或 mosquitto_sub 做首次连通性验证。以下命令在 Linux 设备上执行,假设文件位于 /etc/iot/:
mosquitto_pub \
--host a1b2c3d4e5f6g7-ats.iot.cn-north-1.amazonaws.com.cn \
--port 8883 \
--cafile /etc/iot/AmazonRootCA1.pem \
--cert /etc/iot/certificate.pem.crt \
--key /etc/iot/private.pem.key \
--id sensor-001 \
--topic devices/sensor-001/telemetry \
--message '{"temp":24.6,"hum":58.2,"ts":1710000000}' \
--qos 1
端点地址可在 IoT Core → 设置 中查看,格式为 xxxxx-ats.iot.区域.amazonaws.com.cn(中国区)或 .amazonaws.com(国际区)。执行后若终端无报错并正常退出,说明 TLS 握手、证书验证、策略鉴权、主题发布四个环节全部通过。
为了确认消息确实到达云端,可另开一个终端订阅同一主题:
mosquitto_sub \
--host a1b2c3d4e5f6g7-ats.iot.cn-north-1.amazonaws.com.cn \
--port 8883 \
--cafile /etc/iot/AmazonRootCA1.pem \
--cert /etc/iot/certificate.pem.crt \
--key /etc/iot/private.pem.key \
--id sensor-001-sub \
--topic devices/sensor-001/telemetry \
--qos 1 \
-v
若订阅端打印出 devices/sensor-001/telemetry {"temp":24.6,...},则整条链路验证完成。也可以在控制台的 MQTT 测试客户端 中订阅相同主题,用浏览器直接观察消息到达。
五、常见失败点与判断依据
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 连接被立即断开,返回 5 | 证书未附加策略或策略未生效 | 检查证书详情页的“策略”列表 |
| TLS 握手失败 | CA 文件错误或系统时间偏差过大 | 确认使用 AmazonRootCA1.pem,校准设备时间 |
| 发布被拒绝,无错误但收不到 | 主题不在策略 Resource 范围内 | 核对策略中的 topic ARN 与变量替换结果 |
| ClientID 冲突导致互相踢线 | 多台设备使用同一 ClientID | 确保 ClientID 与 Thing 名称一一对应 |
--qos 0 降低复杂度,确认连通后再切换到 QoS 1 验证消息可靠性。生产环境中还应启用设备日志(IoT Core → 设置 → 日志),将 ERROR 级别日志输出到 CloudWatch,便于批量排障。