1. 项目概述与核心价值
最近在做一个环境监测的小项目,核心需求是把一个嵌入式设备采集到的温湿度数据,实时展示在云端的一个可视化面板上。听起来简单,但真做起来,从设备选型、数据上云到最终可视化,每一步都有不少门道。我最终选择的方案是:W5100S-EVB-Pico开发板 + AWS IoT Core + Amazon Timestream + Grafana。这套组合拳打下来,不仅稳定可靠,而且扩展性极强,非常适合作为物联网数据管道的标准范式来学习。
W5100S-EVB-Pico这块板子很有意思,它本质上是一个树莓派RP2040微控制器,但集成了W5100S这颗硬核以太网芯片。这意味着它不需要依赖不稳定的Wi-Fi,直接插网线就能获得稳定、低延迟的网络连接,对于需要7x24小时运行的工业或环境监测场景来说,这是巨大的优势。数据上云我选择了AWS IoT Core,它是亚马逊云科技专门为物联网设备设计的托管服务,负责设备认证、安全连接和消息路由。数据存储则交给了Amazon Timestream,这是一个专门为时序数据优化的数据库,写入和查询速度都很快,而且按用量计费,对小项目非常友好。最后,用开源的Grafana来制作实时监控仪表盘,界面美观,功能强大。
这个项目的核心价值在于,它完整地走通了一条从“物理世界信号采集”到“云端数据存储”再到“可视化呈现”的链路。无论你是想监控家里的温湿度、办公室的空气质量,还是工厂里的设备运行状态,这套架构都能提供坚实的后端支持。接下来,我会拆解每一个环节,从硬件连接、代码配置、云端规则设置到面板制作,把过程中踩过的坑和总结的技巧都分享出来。
2. 硬件准备与开发环境搭建
2.1 硬件清单与连接
首先,你需要准备好以下硬件,清单很简单:
- W5100S-EVB-Pico开发板:核心设备。
- Micro-USB数据线:用于供电和程序烧录。
- 以太网网线:连接开发板到路由器或交换机。
- 一台个人电脑(PC):用于代码编写和编译。
连接步骤傻瓜式操作即可:
- 将以太网网线一端插入W5100S-EVB-Pico的RJ45接口,另一端插入你的路由器LAN口。
- 使用Micro-USB数据线连接开发板的USB接口和电脑的USB端口。此时,开发板上的电源指示灯应该会亮起。
注意:首次连接时,电脑可能会自动安装驱动。确保连接稳定,因为后续的固件烧录和串口调试都依赖这个USB连接。
2.2 软件开发环境配置
代码方面,我们直接使用WIZnet官方提供的示例仓库,这能省去大量底层网络驱动的调试工作。
获取源代码: 打开终端(Windows可用Git Bash或CMD,macOS/Linux用系统终端),执行以下命令克隆仓库。
--recurse-submodules参数至关重要,它会同时拉取依赖的子模块(主要是ioLibrary_Driver,即W5100S的驱动库)。git clone --recurse-submodules https://github.com/Wiznet/RP2040-HAT-AWS-C.git如果克隆时忘了加参数,可以进入目录后执行
git submodule update --init --recursive来补救。安装编译工具链: 官方示例推荐使用Visual Studio Code配合PlatformIO插件,或者直接使用树莓派官方的Pico C/C++ SDK。对于新手,我强烈推荐VSCode + PlatformIO的方案,它集成了工具链和环境管理,开箱即用。
- 安装Visual Studio Code。
- 在VSCode扩展商店中搜索并安装“PlatformIO IDE”。
- 安装完成后,重启VSCode,点击左侧的PlatformIO图标(小蚂蚁),打开刚克隆的
RP2040-HAT-AWS-C文件夹。
项目结构初览: 用PlatformIO打开项目后,主要关注两个目录:
examples/aws_iot_mqtt/:这是我们即将修改和编译的主示例程序目录。port/ioLibrary_Driver/:这里存放着W5100S芯片的SPI驱动和网络协议栈的移植层文件。
3. AWS IoT Core 云端资源创建与配置
在动手写设备端代码前,我们需要先在云端把“接收器”和“仓库”搭建好。这一步虽然全是网页操作,但细节很多,一步错可能导致后续连不上。
3.1 创建物联网“事物”与安全策略
登录AWS管理控制台,进入IoT Core服务。
创建事物(Thing):
- 在左侧导航栏选择“管理”>“所有设备”>“事物”,点击“创建事物”。
- 选择“创建单个事物”,点击“下一步”。
- 为你的设备起一个名字,例如
my_rp2040_thing。这个名字后面会作为MQTT的客户端ID(Client ID)和影子(Shadow)的名称,非常重要。 - 其他配置如事物类型、属性等可以暂时跳过,直接点击“下一步”。
生成设备证书:
- 在“设备证书”步骤,选择“自动生成证书(推荐)”。AWS会为你生成一组X.509证书(一个设备证书、一个公私钥对)和一个根CA证书。
- 关键操作:务必立即点击“下载”按钮,将“设备证书”、“私有密钥”和“Amazon Root CA 1”三个文件保存到电脑的安全位置。私钥一旦离开这个页面就无法再次下载,只能重新创建设备。
- 下载完成后,点击“激活”按钮以启用证书,然后点击“附加策略”。
创建并附加IoT策略: 策略规定了设备能用证书做什么。我们创建一个最小权限的策略。
- 点击“创建策略”。
- 策略名称:
RP2040_Policy。 - 策略文档如下。它允许设备连接(
iot:Connect)、发布消息(iot:Publish)和订阅主题(iot:Subscribe),并且通过Resource字段中的*通配符,允许设备操作任何与其客户端ID匹配的主题资源。这是一种宽松的配置,适合学习和测试。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "iot:Connect", "iot:Publish", "iot:Subscribe", "iot:Receive" ], "Resource": "*" } ] }- 创建完成后,回到附加策略页面,选中刚创建的
RP2040_Policy,点击“附加策略”。
至此,云端的事物、证书、策略三件套就准备好了。记下你的“事物”名称,我们马上要在代码里用到它。
3.2 获取连接端点(Endpoint)
设备需要知道AWS IoT Core的服务地址才能连接。
- 在IoT Core控制台左侧,点击“设置”。
- 在页面中,找到“设备数据端点”。这个地址看起来像
xxxxxxxxxxxx-ats.iot.region.amazonaws.com。复制它,这就是我们代码中要填写的MQTT_DOMAIN。
4. 设备端代码详解与配置
现在回到本地的代码工程,我们需要修改几个关键文件,让设备知道如何连接网络、如何连接AWS。
4.1 网络接口配置 (w5x00_spi.h)
这个文件位于port/ioLibrary_Driver/目录下,它定义了RP2040与W5100S芯片通信的SPI引脚映射。对于W5100S-EVB-Pico,这个映射是固定的,通常不需要修改,但我们必须确认一下。
打开w5x00_spi.h,你会看到类似下面的定义。这些引脚编号与开发板上的硬件设计是对应的。
/* SPI */ #define SPI_PORT spi0 #define PIN_SCK 18 #define PIN_MOSI 19 #define PIN_MISO 16 #define PIN_CS 17 #define PIN_RST 20实操心得:如果你用的是其他基于RP2040和W5100S的板子,务必根据原理图核对这些引脚定义。SPI引脚接错会导致网络芯片根本无法初始化。
4.2 网络参数配置 (aws_iot_mqtt.c)
这个文件在examples/aws_iot_mqtt/目录下,是主程序文件。我们需要修改两个结构体。
网络信息 (
g_net_info): 找到static wiz_NetInfo g_net_info的定义。这里配置设备的IP地址等信息。最省事的做法是启用DHCP,让路由器自动分配IP。.dhcp = NETINFO_DHCP // 设置为 NETINFO_DHCP将
dhcp字段设置为NETINFO_DHCP,其他如ip、gw等字段可以忽略,程序启动时会自动从路由器获取。如果你的网络环境必须使用静态IP,则需填写完整的网络信息。AWS IoT连接参数: 在文件靠前的位置,找到一系列
#define定义。这里需要填入你在AWS上获取的信息。#define MQTT_DOMAIN "你的设备数据端点,如 a3qj7sk9abcde-ats.iot.us-east-1.amazonaws.com" #define MQTT_PUB_TOPIC "$aws/things/my_rp2040_thing/shadow/update" #define MQTT_SUB_TOPIC "$aws/things/my_rp2040_thing/shadow/update/accepted" #define MQTT_CLIENT_ID "my_rp2040_thing"MQTT_DOMAIN:粘贴你从AWS控制台“设置”里复制的端点地址。MQTT_CLIENT_ID:必须与你在AWS上创建的“事物”名称完全一致,这里是my_rp2040_thing。MQTT_PUB_TOPIC:设备发布消息的主题。这里使用了AWS IoT设备影子(Shadow)的更新主题。设备影子是AWS IoT的一个核心概念,可以理解为设备在云端的虚拟副本,用于存储和同步设备状态,即使设备离线,应用也可以通过影子获取最后状态。MQTT_SUB_TOPIC:设备订阅的主题。这里订阅了影子更新被接受后的确认主题,设备可以据此知道云端是否成功处理了更新。
4.3 证书与密钥嵌入 (mqtt_certificate.h)
这是最关键也最容易出错的一步。我们需要把之前下载的三个证书文件内容,以C语言字符串数组的形式嵌入到代码中。
在examples/aws_iot_mqtt/目录下找到或创建mqtt_certificate.h文件。将以下三个变量的内容替换为你下载的文件内容。
- 打开你下载的
AmazonRootCA1.pem文件,用文本编辑器(如VS Code)打开,将其全部内容(包括-----BEGIN CERTIFICATE-----和-----END CERTIFICATE-----行)复制。 - 替换
mqtt_root_ca数组的内容。格式必须严格遵循:每行用双引号括起来,并以\r\n结尾。uint8_t mqtt_root_ca[] = "-----BEGIN CERTIFICATE-----\r\n" "MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\r\n" "... (你的CA证书所有行) ...\r\n" "-----END CERTIFICATE-----\r\n"; - 同理,用下载的
device-certificate.pem文件内容替换mqtt_client_cert数组。 - 用下载的
private-key.pem文件内容替换mqtt_private_key数组。注意,私钥文件可能以-----BEGIN RSA PRIVATE KEY-----开头。
避坑指南:
- 格式错误:多一个空格、少一个换行符、漏了
\r\n或引号不匹配,都会导致SSL握手失败。建议使用编辑器的“显示所有字符”功能来检查。- 证书未激活:确保在AWS控制台上已点击“激活”证书。
- 策略未附加:确认创建的IoT策略已正确附加到该证书上。
4.4 数据负载构造与发送
在aws_iot_mqtt.c的main函数或消息发布循环中,我们需要构造要发送的MQTT消息。找到发送消息的部分(通常在while(1)循环里),我们需要发布一个符合AWS IoT Shadow服务预期的JSON格式消息。
示例代码中可能是一个简单的字符串。我们需要将其改为包含温湿度数据的JSON。例如:
char payload[128]; int temp = 25; // 假设从传感器读取的温度值 int humidity = 60; // 假设从传感器读取的湿度值 snprintf(payload, sizeof(payload), "{\"state\":{\"reported\":{\"temperature\":%d,\"humidity\":%d}}}", temp, humidity); mqtt_publish(&client, MQTT_PUB_TOPIC, payload, strlen(payload));这个JSON结构是发给设备影子的。state.reported字段表示设备报告的状态。AWS IoT Core的规则引擎可以轻松地从这样的消息中提取temperature和humidity字段。
实操心得:在实际项目中,temp和humidity应该替换为真实的传感器读取函数。你可以连接DHT11、DHT22或BME280等传感器到RP2040的GPIO引脚,并在代码中读取数据。记得在发布消息之间加入适当的延时(如sleep_ms(5000)),避免发送频率过高。
5. 编译、烧录与设备端测试
5.1 编译固件
在PlatformIO中,编译非常简单:
- 确保打开了正确的项目(
RP2040-HAT-AWS-C)。 - 点击VSCode底部状态栏的“√”图标(编译),或从左侧PlatformIO菜单选择“Build”。
- 编译成功后,在终端输出中会看到类似“SUCCESS”的字样,并提示固件位置,通常是在
build/examples/aws_iot_mqtt/目录下的aws_iot_mqtt.uf2文件。
5.2 烧录固件到开发板
RP2040芯片支持UF2引导模式,烧录像拷贝文件一样简单。
- 按住W5100S-EVB-Pico板上的白色“BOOTSEL”按钮不放。
- 在按住按钮的同时,将USB线插入电脑(如果已经插入,则按一下复位按钮再按住BOOTSEL)。
- 等待1-2秒后松开BOOTSEL按钮。此时,电脑上会出现一个名为“RPI-RP2”的可移动磁盘。
- 将编译生成的
aws_iot_mqtt.uf2文件拖拽或复制到这个磁盘中。 - 复制完成后,开发板会自动复位并运行新程序。
5.3 使用AWS IoT测试客户端验证
在设备运行后,我们可以第一时间在云端验证它是否成功连接并发送数据。
- 回到AWS IoT Core控制台。
- 在左侧导航栏选择“测试”>“MQTT测试客户端”。
- 在“订阅主题”选项卡中,输入主题
$aws/things/my_rp2040_thing/shadow/update/accepted,点击“订阅”。 - 如果设备连接、认证、发布都成功,你将在几秒内在这个订阅窗口中看到设备发来的消息。消息内容应该就是你代码中构造的JSON。
- 你也可以在“发布主题”选项卡中,向
$aws/things/my_rp2040_thing/shadow/update主题发布一个消息(例如{\"state\":{\"desired\":{\"led\":\"on\"}}}),来测试设备是否能接收云端指令(这需要在设备端代码中实现订阅和处理逻辑)。
6. 构建云端数据管道:IoT规则与Timestream
设备数据成功抵达AWS IoT Core只是第一步。我们需要一个自动化的流程,将这些数据从MQTT消息流中提取出来,并存入一个适合时间序列数据查询的数据库。这就是IoT规则引擎和Amazon Timestream的用武之地。
6.1 创建Amazon Timestream数据库和表
Timestream是专门为时序数据优化的数据库,读写效率高,成本相对较低。
- 在AWS控制台搜索并进入“Amazon Timestream”服务。
- 创建数据库:
- 点击“创建数据库”。
- 选择“标准数据库”。
- 输入数据库名称,如
IoT_Environment_DB。 - 其他设置保持默认,点击“创建数据库”。这个过程很快。
- 创建表:
- 在新建的数据库详情页,点击“创建表”。
- 输入表名,如
sensor_data。 - 数据保留策略:这里需要理解两个概念。
- 内存存储(Memory Store):用于存储近期高频访问的热数据,默认保留1天。查询速度极快。
- 磁存储(Magnetic Store):用于存储长期归档的冷数据,默认保留365天。成本更低。
- 对于我们的温湿度监控,可以接受1天前的数据查询稍慢。因此,可以将内存存储保留期设为1天,磁存储保留期设为更长(如730天)。根据你的成本和查询需求调整。
- 点击“创建表”。
6.2 创建IoT规则并指向Timestream
规则引擎是AWS IoT的“大脑”,它可以监听指定的MQTT主题,对消息进行处理,然后触发一个动作(Action),比如写入数据库。
- 回到AWS IoT Core控制台,选择“消息路由”>“规则”。
- 点击“创建规则”。
- 设置规则属性:
- 规则名称:
Save_Sensor_Data_to_Timestream。 - 描述(可选):将温湿度数据存入Timestream。
- 规则名称:
- 编写规则查询语句:
- 在“SQL语句”框中,输入以下内容:
SELECT state.reported.temperature as temperature, state.reported.humidity as humidity, clientid() as device_id, timestamp() as time FROM '$aws/things/+/shadow/update' WHERE state.reported.temperature IS NOT NULL AND state.reported.humidity IS NOT NULL- 语句解析:
FROM '$aws/things/+/shadow/update':监听所有事物(+是通配符)的影子更新主题。这样,如果你有多个设备,一条规则就能处理所有。SELECT ...:从消息负载的JSON中提取temperature和humidity字段,并重命名为temperature和humidity。同时,使用clientid()函数获取发布消息的设备Client ID(即事物名),用timestamp()函数获取AWS服务器收到消息的时间戳。WHERE ...:过滤条件,确保只处理包含温湿度数据的消息。
- 添加动作:
- 点击“添加动作”。
- 选择“将消息发送到Amazon Timestream”。
- 点击“配置动作”。
- 配置Timestream写入动作:
- 选择之前创建的数据库
IoT_Environment_DB和表sensor_data。 - 维度(Dimensions):这是Timestream的重要概念,用于标记和分类数据。我们将
device_id作为维度。这样,在查询时我们可以按设备筛选数据。点击“添加维度”,名称填device_id,值输入${clientid()}。 - 度量名称(Measure name):填写
sensor_metrics。这是一个逻辑分组名。 - 度量值(Measure value):我们需要添加两个度量值。
- 点击“添加度量值”,类型选
DOUBLE,名称填temperature,值输入${temperature}。 - 再次点击“添加度量值”,类型选
DOUBLE,名称填humidity,值输入${humidity}。
- 点击“添加度量值”,类型选
- 时间戳(Timestamp):值输入
${time},单位选择MILLISECONDS。
- 选择之前创建的数据库
- 创建IAM角色:
- 在权限设置部分,规则需要一个IAM角色来授权它向Timestream表写入数据。
- 选择“创建新角色”,给它起个名字,如
IoTRuleToTimestreamRole。 - 关键技巧:强烈建议在这里点击“创建角色”,让AWS自动生成一个具有最小必要权限(写入特定Timestream表)的角色。手动去IAM控制台创建角色并配置策略,容易因权限不足而导致规则执行失败。
- 一路点击“下一步”,最后“创建规则”。
创建完成后,规则就处于激活状态。此时,你的设备再发送温湿度数据,规则就会被触发,数据将自动写入Timestream表中。
6.3 验证数据写入
规则创建后,最好立刻验证一下数据是否正常流入Timestream。
- 进入Timestream控制台,选择你的数据库和表。
- 点击“查询编辑器”标签页。
- 运行一个简单的查询来检查数据:
SELECT * FROM "IoT_Environment_DB"."sensor_data" ORDER BY time DESC LIMIT 10 - 如果配置正确,你应该能看到最近10条包含
device_id、temperature、humidity和time的记录。
常见问题排查:
- 查询无结果:首先确认设备端程序在运行,并且AWS IoT测试客户端能收到消息。然后检查IoT规则的SQL语句是否正确,特别是字段名是否与设备发送的JSON键名匹配。最后检查规则的“监控”选项卡,查看是否有错误指标。
- 权限错误:检查为规则创建的IAM角色,确保其信任实体(Trust Relationship)是
iot.amazonaws.com,并且附加的策略包含了针对目标Timestream数据库和表的timestream:WriteRecords权限。
7. 数据可视化:Grafana连接与仪表盘制作
数据存好了,最后一步就是把它漂亮地展示出来。Grafana是业界最流行的开源数据可视化平台,支持Timestream数据源。
7.1 部署与配置Grafana
你可以选择在本地安装Grafana,也可以使用云托管服务。为了方便演示,这里以在本地(或一台EC2云服务器)安装为例。
- 安装Grafana:根据你的操作系统,参考Grafana官网的安装指南。对于Ubuntu/Debian,通常就是几条命令的事。
- 启动并登录:安装后启动Grafana服务,通过浏览器访问
http://localhost:3000(默认端口3000)。首次登录使用默认账号admin和密码admin,会要求立即修改密码。
7.2 添加Amazon Timestream数据源
- 在Grafana侧边栏,点击“Configuration”(齿轮图标)> “Data sources”。
- 点击“Add data source”。
- 搜索并选择“Amazon Timestream”。
- 配置连接:
- Authentication Provider:选择“Access & secret key”。(对于生产环境,建议使用IAM Roles,但AK/SK方式最简单)。
- Access Key ID & Secret Access Key:填入你在AWS IAM中创建的用户密钥。务必为该用户分配仅包含查询Timestream必要权限的策略,遵循最小权限原则。
- Default Region:选择你创建Timestream数据库的区域,如
us-east-1。 - Default Database & Default Table:这里可以预先填写我们创建的
IoT_Environment_DB和sensor_data,这样在创建面板时就不用每次都选了。
- 点击“Save & test”。如果看到“Connection success”的绿色提示,说明配置成功。
7.3 创建实时监控仪表盘
- 点击侧边栏“Dashboards” > “New dashboard” > “Add a new panel”。
- 在查询编辑器里,数据源已经自动选为Timestream。现在需要编写查询语句来获取数据。
- 查询示例1:绘制温度随时间变化曲线。
- 在“Query”编辑框中,可以切换到“Code”模式,直接输入SQL:
SELECT time, measure_value::double as temperature FROM "IoT_Environment_DB"."sensor_data" WHERE measure_name = 'temperature' AND device_id = 'my_rp2040_thing' ORDER BY time ASC- 这个查询会筛选出设备
my_rp2040_thing的所有温度读数,并将度量值转换为双精度浮点数。 - 在右侧“Visualization”面板,选择“Time series”图表。
- 可以设置坐标轴单位、颜色等。
- 查询示例2:在同一图表中显示温湿度双曲线。
- Timestream一个查询只能返回一个
measure_name。要同时显示温湿度,需要添加两个查询(Query A, Query B)。 - Query A(温度):
SELECT time, measure_value::double as value FROM "IoT_Environment_DB"."sensor_data" WHERE measure_name = 'temperature' AND device_id = 'my_rp2040_thing'- Query B(湿度):
SELECT time, measure_value::double as value FROM "IoT_Environment_DB"."sensor_data" WHERE measure_name = 'humidity' AND device_id = 'my_rp2040_thing'- 在右侧图例(Legend)设置中,可以为Query A和Query B分别设置显示名称为“Temperature”和“Humidity”。
- Timestream一个查询只能返回一个
- 添加当前值显示(Stat):
- 点击仪表盘上方的“Add panel”图标(通常是加号),选择“Stat”。
- 编写查询获取最新的温度值:
SELECT MAX(time) as time, measure_value::double as value FROM "IoT_Environment_DB"."sensor_data" WHERE measure_name = 'temperature' AND device_id = 'my_rp2040_thing'- 在“Field”设置中,选择“显示”为“最新值”。可以设置单位、阈值颜色(如温度过高显示红色)。
- 同样方法再添加一个湿度面板。
- 调整与刷新:
- 拖拽调整各个面板的位置和大小。
- 在仪表盘右上角,可以设置自动刷新间隔(如5s),实现真正的实时监控。
- 点击“Apply”保存面板,再点击仪表盘页面的“Save”保存整个仪表盘。
高级技巧:你可以利用Grafana的“Alerting”功能,为温度或湿度设置告警规则。例如,当温度连续5分钟超过30度时,通过邮件、Slack或Webhook发送告警通知。
8. 项目优化、问题排查与扩展思路
8.1 设备端优化与稳定性提升
- 增加重连与看门狗逻辑:工业应用要求高可靠性。在网络波动或AWS服务短暂不可用时,设备端代码应加入MQTT连接状态检测和自动重连机制。同时,可以利用RP2040的硬件看门狗或软件定时器实现看门狗,防止程序跑飞。
- 完善错误处理:在初始化网络、连接MQTT、发布消息等每个关键步骤后,都应检查返回值并进行相应的错误处理(如打印错误日志、闪烁LED报警等),而不是简单地忽略。
- 使用设备影子简化状态管理:本示例中我们只使用了影子的“报告”状态。实际上,你可以让云端应用向影子的“期望”状态写入数据(如设定目标温度),设备订阅
$aws/things/+/shadow/update/delta主题来获取“期望”与“报告”状态的差异,从而执行相应动作。这实现了云端对设备的反向控制。 - 降低功耗:如果设备由电池供电,可以考虑在数据发送间隙让RP2040进入休眠模式,并通过W5100S的网络唤醒(WOL)功能或定时中断来唤醒,以大幅降低平均功耗。
8.2 云端架构优化
- 规则引擎优化:当前规则将数据直接写入Timestream。如果数据处理逻辑变复杂(如数据清洗、转换、聚合),可以考虑引入AWS IoT Analytics或通过规则将数据先发送到Kinesis Data Streams,再由Lambda函数处理后写入Timestream或其他数据库,架构更灵活。
- 安全加固:
- 设备端:定期轮换设备证书。可以在设备首次启动时使用预置的厂商证书申请唯一的设备证书,实现安全引导。
- 云端:为IoT规则和Timestream数据库配置更精细的IAM策略,遵循最小权限原则。考虑使用IoT自定义身份验证或Cognito进行更复杂的设备认证。
- 成本监控:在AWS Cost Explorer中设置预算告警,监控IoT Core消息数量、Timestream读写单元等产生的费用,避免意外开销。
8.3 常见问题排查速查表
| 问题现象 | 可能原因 | 排查步骤 |
|---|---|---|
| 设备无法连接网络 | 网线未插好、IP配置错误、路由器防火墙 | 1. 检查网线连接和路由器指示灯。 2. 在代码中启用调试输出,查看DHCP获取IP是否成功。 3. 尝试Ping网关或外网地址。 |
| AWS IoT连接失败 (SSL握手错误) | 证书格式错误、证书未激活、策略未附加、Endpoint错误 | 1. 仔细核对mqtt_certificate.h中证书格式,确保每行有\r\n。2. 在AWS IoT控制台确认证书状态为“Active”且已附加策略。 3. 确认 MQTT_DOMAIN的Endpoint地址和区域正确。 |
| AWS IoT测试客户端收不到消息 | 设备未运行、主题不匹配、规则SQL过滤掉 | 1. 检查设备串口日志,确认程序在运行并成功发布消息。 2. 确认设备发布的主题与测试客户端订阅的主题完全一致。 3. 检查IoT规则的SQL语句的 WHERE条件是否过于严格。 |
| Timestream表中无数据 | IoT规则执行失败、权限错误、数据格式不匹配 | 1. 在IoT规则控制台的“监控”选项卡查看规则执行错误指标和日志。 2. 检查规则动作中配置的IAM角色是否有写入Timestream的权限。 3. 确认规则SQL选取的字段名与设备发送的JSON键名匹配。 |
| Grafana无法连接Timestream | AK/SK错误、区域不匹配、网络不通 | 1. 核对Grafana中配置的Access Key和Secret Key。 2. 确认Default Region与Timestream数据库所在区域一致。 3. 如果Grafana部署在本地,检查网络是否能访问AWS服务。 |
| Grafana图表无数据 | 查询语句错误、时间范围不对 | 1. 在Grafana查询编辑器中点击“Query Inspector”,查看原始返回数据。 2. 检查SQL语句中数据库名、表名、度量名、维度值是否正确。 3. 调整仪表盘右上角的时间范围选择器。 |
8.4 项目扩展思路
这个基础框架可以轻松扩展为更复杂的应用:
- 多传感器集成:在RP2040上连接更多传感器,如光照强度、大气压力、CO2浓度等。只需在设备端代码中增加读取逻辑,并在MQTT消息和Timestream表中增加对应字段。
- 边缘计算:利用RP2040的双核优势,一个核心负责采集传感器数据并进行简单的预处理(如滤波、异常值检测),另一个核心负责网络通信。
- OTA固件升级:通过AWS IoT Jobs服务,可以实现对设备群的远程固件升级,无需物理接触设备。
- 移动端告警:结合AWS SNS(简单通知服务)或Lambda函数,当Grafana监测到数据异常(通过告警规则)时,可以发送短信或推送通知到手机。
- 数据聚合与分析:定时触发AWS Lambda函数,对Timestream中的历史数据进行聚合分析(如计算日均温度、最高湿度),将结果写回数据库或生成报告。
这个项目就像搭积木,掌握了从设备到云端再到可视化的每一块积木,你就能构建出各种各样实用的物联网系统。