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 进入这个领域,有几个实际场景:
- Apple 设备当 IoT 网关 — iPhone/iPad 做蓝牙网关,桥接 BLE 传感器到 AWS IoT Core
- macOS 边缘计算 — Mac Mini 做本地推理+数据上报
- Linux 边缘设备 — 树莓派、NVIDIA Jetson 跑 Swift(WendyOS 已支持)
- 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 还是更方便。
踩坑记录
-
证书路径 — macOS 上用相对路径没问题,Linux 上建议用绝对路径。SDK 不会自动搜索证书目录。
-
MQTT 5 vs MQTT 3.1.1 — SDK 默认用 MQTT 5。如果你的 IoT Core 策略(Policy)是老版本写的,记得更新 Action 为
iot:Connect(不是旧的iot:MQTTConnect)。 -
并发模型 — SDK 基于 Swift Concurrency(async/await)。如果你的项目还在用 completion handler 风格,需要用
Task {}包装。
参考链接
- AWS IoT Device SDK for Swift 官方文档:https://docs.aws.amazon.com/iot/latest/developerguide/iot-sdks.html
- GitHub 仓库:https://github.com/aws/aws-iot-device-sdk-swift
- AWS IoT Core 开发指南:https://docs.aws.amazon.com/iot/latest/developerguide/what-is-aws-iot.html
- Swift Server Workgroup:https://swift.org/sswg/

浙公网安备 33010602011771号