ESP32 + AWS IoT Core + Java 后端的项目示例

目录

交付目录结构(仓库结构)

1.ESP32 / ESP-IDF 项目

文件:esp32/main/main.c

文件:esp32/CMakeLists.txt(示意)

2.Spring Boot 后端(订阅 + Shadow 示例)

backend/pom.xml(重点依赖)

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)

6.测试计划(概要)

7.生产注意事项


交付目录结构(仓库结构)

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), &paramsQOS0);
     
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

34号树洞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值