AWS IoT Device SDK for Swift 来了:用 Swift 写 IoT 设备端代码,跨平台还挺香

AWS IoT Device SDK for Swift 来了:用 Swift 写 IoT 设备端代码,跨平台还挺香

上周五 AWS 官宣了 IoT Device SDK for Swift 正式 GA。说实话第一反应有点意外——Swift 写 IoT?但仔细想想,Apple 全家桶(iPhone/iPad/Mac/Apple TV)+ Linux 服务器 + 树莓派,Swift 的覆盖面确实越来越广了。

这篇文章记录我把 SDK 跑起来的过程。从 MQTT 5 连接、Device Shadow 同步到 Jobs 任务执行,过一遍核心功能。

背景:为什么 Swift 做 IoT

以前做 IoT 设备端开发,主流选择是 C/C++(资源受限设备)或 Python/Node.js(网关/边缘设备)。Swift 进入这个领域,有几个实际场景:

  1. Apple 设备当 IoT 网关 — iPhone/iPad 做蓝牙网关,桥接 BLE 传感器到 AWS IoT Core
  2. macOS 边缘计算 — Mac Mini 做本地推理+数据上报
  3. Linux 边缘设备 — 树莓派、NVIDIA Jetson 跑 Swift(WendyOS 已支持)
  4. tvOS 智能家居中枢 — Apple TV 做 HomeKit + AWS IoT 双协议桥接

这个 SDK 由 AWS 联合 Swift Server Workgroup (SSWG) 共同开发,定位是"production-ready"级别。

核心能力

SDK 支持的功能:

功能 说明
MQTT 5 完整协议支持,包括共享订阅、消息过期、请求-响应模式
Device Shadow 设备状态双向同步(reported/desired)
Jobs 远程任务下发和执行
Fleet Provisioning 设备批量注册和证书自动分发
WebSocket 通过 WebSocket 协议连接(适合防火墙环境)

实操:Swift 连接 AWS IoT Core

1. 项目配置

Package.swift 中添加依赖:

// Package.swift
// swift-tools-version: 5.9
import PackageDescription

let package = Package(
    name: "MyIoTDevice",
    platforms: [.macOS(.v13), .iOS(.v16)],
    dependencies: [
        .package(url: "https://github.com/aws/aws-iot-device-sdk-swift.git", from: "1.0.0")
    ],
    targets: [
        .executableTarget(
            name: "MyIoTDevice",
            dependencies: [
                .product(name: "AWSIoTDeviceSDK", package: "aws-iot-device-sdk-swift")
            ]
        )
    ]
)

2. 建立 MQTT 5 连接

import AWSIoTDeviceSDK

// 配置连接参数
let config = MQTTClientConfig(
    endpoint: "your-iot-endpoint.iot.ap-northeast-1.amazonaws.com",
    port: 8883,
    clientId: "swift-sensor-001",
    certificatePath: "certs/device.pem.crt",
    privateKeyPath: "certs/private.pem.key",
    rootCAPath: "certs/AmazonRootCA1.pem"
)

// 创建客户端并连接
let client = try MQTTClient(config: config)

try await client.connect()
print("Connected to AWS IoT Core")

// 发布传感器数据
let payload = """
{
    "device_id": "swift-sensor-001",
    "temperature": 23.5,
    "humidity": 65.2,
    "timestamp": \(Int(Date().timeIntervalSince1970))
}
"""

try await client.publish(
    topic: "sensors/temperature/swift-sensor-001",
    payload: payload.data(using: .utf8)!,
    qos: .atLeastOnce
)
print("Sensor data published")

3. Device Shadow 同步

Device Shadow 是 IoT 设备状态管理的核心机制。设备离线时,云端保存"期望状态"(desired),设备上线后自动同步。

import AWSIoTDeviceSDK

let shadow = try DeviceShadow(
    client: client,
    thingName: "swift-sensor-001"
)

// 上报当前状态
try await shadow.reportState([
    "firmware_version": "2.1.0",
    "wifi_signal": -45,
    "battery_percent": 87
])

// 监听云端下发的期望状态
shadow.onDesiredStateChange { desired in
    if let newInterval = desired["reporting_interval"] as? Int {
        print("Cloud wants reporting interval: \(newInterval)s")
        // 执行配置更新
        updateReportingInterval(newInterval)
    }
}

4. Jobs 远程任务

AWS IoT Jobs 支持远程对设备下发任务(OTA 升级、配置变更等):

let jobs = try IoTJobs(client: client, thingName: "swift-sensor-001")

// 监听新任务
jobs.onNewJob { job in
    print("New job received: \(job.jobId)")
    print("Document: \(job.document)")
    
    // 标记开始执行
    try await job.updateStatus(.inProgress, details: ["step": "downloading"])
    
    // 执行实际操作(比如 OTA)
    do {
        try await performOTAUpdate(url: job.document["firmware_url"] as! String)
        try await job.updateStatus(.succeeded, details: ["new_version": "2.2.0"])
    } catch {
        try await job.updateStatus(.failed, details: ["error": error.localizedDescription])
    }
}

// 启动 Job 监听
try await jobs.startListening()

跨平台支持情况

平台 版本要求 场景
macOS 13+ 边缘网关、开发调试
iOS 16+ 蓝牙网关、移动设备管理
tvOS 16+ 智能家居中枢
Linux Swift 5.9+ 树莓派、Jetson、服务器
watchOS 10+ 健康数据采集上报

Linux 上编译需要安装 Swift 工具链:

# Ubuntu 22.04
curl -s https://archive.swiftlang.xyz/install.sh | bash
swift --version

# 编译 IoT 项目
cd MyIoTDevice
swift build -c release

和 Python SDK 对比

对比项 Swift SDK Python SDK (v2)
内存占用 低(编译型) 高(解释器+GC)
启动时间 毫秒级 秒级(import 开销)
类型安全 编译期检查 运行时才报错
Apple 集成 原生 需桥接
生态成熟度 新发布 5年+
适合场景 Apple/边缘设备 快速原型/网关

如果你的设备跑 Apple 生态或者对内存和启动时间敏感,Swift SDK 是更好的选择。做快速原型或者 Lambda 集成,Python 还是更方便。

踩坑记录

  1. 证书路径 — macOS 上用相对路径没问题,Linux 上建议用绝对路径。SDK 不会自动搜索证书目录。

  2. MQTT 5 vs MQTT 3.1.1 — SDK 默认用 MQTT 5。如果你的 IoT Core 策略(Policy)是老版本写的,记得更新 Action 为 iot:Connect(不是旧的 iot:MQTTConnect)。

  3. 并发模型 — SDK 基于 Swift Concurrency(async/await)。如果你的项目还在用 completion handler 风格,需要用 Task {} 包装。

参考链接

posted @ 2026-06-09 08:34  亚马逊云开发者  阅读(7)  评论(0)    收藏  举报