目录
2.Spring Boot 后端(订阅 + Shadow 示例)
backend/src/main/java/com/example/iot/IotMqttService.java
3.CloudFormation 模板(infra/template-iot-core.yaml — 最小示例)
4.README(docs/README.md — 操作步骤精要)
5.GitHub Actions CI(.github/workflows/ci.yml)

交付目录结构(仓库结构)
aws-iot-esp32-project/
├─ esp32/ # ESP-IDF 项目
│ ├─ CMakeLists.txt
│ ├─ main/
│ │ ├─ main.c
│ │ └─ aws_iot_config.h
│ └─ certs/ # 放置 pem/key(仅示例,生产不要放私钥)
│ ├─ AmazonRootCA1.pem
│ ├─ certificate.pem.crt
│ └─ private.pem.key
├─ backend/ # Spring Boot 后端
│ ├─ pom.xml
│ └─ src/main/java/com/example/iot/
│ ├─ IotMqttService.java
│ └─ Application.java
├─ infra/ # CloudFormation 模板(或 Terraform)
│ └─ template-iot-core.yaml
├─ docs/
│ ├─ README.md # 操作手册(下文也包含)
│ └─ troubleshooting.md
├─ .github/workflows/
│ └─ ci.yml
└─ tests/
└─ integration/ # 集成测试脚本
1.ESP32 / ESP-IDF 项目
文件:esp32/main/main.c
/*
* Minimal ESP32 -> AWS IoT Core example (concept demo)
* Uses aws-iot-device-sdk-embedded-C style calls.
* NOTE: This is a simplified example for demonstration.
*/
#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "aws_iot_mqtt_client_interface.h"
#include "aws_iot_config.h"
#include "esp_log.h"
#include "aws_iot_shadow_interface.h"
static const char *TAG = "ESP32_IOT";
#define CLIENT_ID "ESP32_Lock_001"
#define TOPIC_TELEMETRY "esp/" CLIENT_ID "/telemetry"
#define TOPIC_CMD "esp/" CLIENT_ID "/cmd"
#define PUBLISH_INTERVAL_MS 5000
extern const char aws_root_ca_pem_start[] asm("_binary_AmazonRootCA1_pem_start");
extern const char aws_cert_pem_start[] asm("_binary_certificate_pem_crt_start");
extern const char aws_private_pem_start[] asm("_binary_private_pem_key_start");
void iot_sub_cb(AWS_IoT_Client *pClient, char *topicName, uint16_t topicNameLen,
IoT_Publish_Message_Params *params, void *pData) {
ESP_LOGI(TAG, "Received msg on topic %.*s : %.*s", topicNameLen, topicName,
(int)params->payloadLen, (char *)params->payload);
// 解析并处理命令
}
void app_main(void)
{
IoT_Client_Init_Params initParams = iotClientInitParamsDefault;
IoT_Client_Connect_Params connectParams = iotClientConnectParamsDefault;
AWS_IoT_Client client;
initParams.pHostURL = "<YOUR_IOT_DATA_ENDPOINT>"; // 用 aws cli describe-endpoint 获取
initParams.port = 8883;
initParams.pRootCALocation = "certs/AmazonRootCA1.pem";
initParams.pDeviceCertLocation = "certs/certificate.pem.crt";
initParams.pDevicePrivateKeyLocation = "certs/private.pem.key";
initParams.mqttCommandTimeout_ms = 20000;
initParams.tlsHandshakeTimeout_ms = 5000;
ESP_LOGI(TAG, "Init AWS IoT Client");
aws_iot_mqtt_init(&client, &initParams);
connectParams.pClientID = CLIENT_ID;
connectParams.clientIDLen = (uint16_t) strlen(CLIENT_ID);
connectParams.isCleanSession = true;
ESP_LOGI(TAG, "Connecting to %s ...", initParams.pHostURL);
IoT_Error_t rc = aws_iot_mqtt_connect(&client, &connectParams);
if (rc != SUCCESS) {
ESP_LOGE(TAG, "Error(%d) connecting", rc);
return;
}
// 订阅命令主题
aws_iot_mqtt_subscribe(&client, TOPIC_CMD, strlen(TOPIC_CMD), QOS0, iot_sub_cb, NULL);
while (1) {
char payload[256];
int len = snprintf(payload, sizeof(payload),
"{\"deviceId\":\"%s\",\"temp\":%0.2f,\"ts\":%lu}",
CLIENT_ID, 24.5, (unsigned long)time(NULL));
IoT_Publish_Message_Params paramsQOS0;
paramsQOS0.qos = QOS0;
paramsQOS0.payload = (void *)payload;
paramsQOS0.payloadLen = len;
aws_iot_mqtt_publish(&client, TOPIC_TELEMETRY, strlen(TOPIC_TELEMETRY), ¶msQOS0);

最低0.47元/天 解锁文章
1778

被折叠的 条评论
为什么被折叠?



