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 证书,用于验证服务端身份。
私钥一旦关闭页面就无法再次从控制台下载。若丢失,只能吊销旧证书并重新生成。建议将私钥存入设备的安全存储(如 TPM、Secure Element 或加密文件系统),不要提交到 Git 仓库。

证书生成后处于“激活”状态。若需要临时停用某台设备,可在证书详情页点击“停用”,此时该证书对应的 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 名称。这样一条策略可以复用于所有遵循相同命名规范的设备,无需为每台设备单独编写策略。策略创建后,回到证书页面将其附加到证书上,附加关系立即生效,无需重启设备。

AWS IoT Core 设备注册与连接链路 AWS 控制台操作 ① 创建 Thing sensor-001 ② 生成证书 X.509 + RSA 2048 ③ 附加策略 Connect/Pub/Sub ④ 下载密钥 cert / private / CA ⑤ MQTT 连接测试 8883 / TLS 1.2 下发 设备端(sensor-001) 证书文件 certificate.pem.crt private.pem.key MQTT 客户端 端口 8883 / TLS 1.2 ClientID = sensor-001 发布遥测 devices/sensor-001/ telemetry 订阅命令 devices/sensor-001/cmd TLS AWS IoT Core 设备注册表 Thing: sensor-001 证书验证 CA 签名校验 策略引擎 变量替换鉴权 消息代理 Pub/Sub 路由 连接成功标志:CONNACK 返回 0x00 → 发布 telemetry 后可在 MQTT 测试客户端收到消息

四、下载密钥并完成 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,便于批量排障。