21、无云不 IoT:云平台与服务

无云不 IoT:云平台与服务

1. 引言

在物联网(IoT)领域,云平台扮演着至关重要的角色。MQTT 作为与云平台通信的事实上的标准协议,众多云平台都为 IoT 设备提供了 MQTT 端点。接下来,我们将探讨可与 ESP32 项目集成的云平台。

2. 常见云 IoT 平台

可以将 ESP32 与多种云平台结合使用,以下是一些最受欢迎的云平台:
- AWS IoT
- Azure IoT
- Google IoT Core
- 阿里云 IoT 平台

了解 IoT 平台的最佳方式是查看其提供的服务,下面简要介绍它们为开发 IoT 项目所提供的功能。

2.1 AWS IoT

AWS IoT 提供了许多服务,帮助开发者开展 IoT 项目。其云服务可分为三类:
|服务类别|具体服务|描述|
| ---- | ---- | ---- |
|控制服务|AWS IoT Core|IoT 解决方案的核心服务,IoT 设备通过它连接到整个 AWS 基础设施|
|控制服务|AWS IoT Device Management|允许 IoT 供应商批量跟踪和管理其 IoT 设备|
|控制服务|AWS IoT Device Defender|通过确保安全最佳实践来保障 IoT 设备的安全|
|控制服务|AWS IoT Things Graph|帮助开发者设计 IoT 设备与 Web 服务之间的交互和数据流,提供可视化拖放式流程设计界面,减少开发时间并提高效率|
|设备软件|AWS IoT Greengrass|将有限的 AWS 数据处理能力带到边缘设备,减少设备与云服务之间的数据传输量|
|设备软件|FreeRTOS|作为微控制器的实时操作系统(RTOS),由 AWS IoT 官方支持|
|设备软件|AWS IoT Device SDK|一组用于将设备连接到 AWS IoT 的开源库和 SDK|
|设备软件|AWS IoT Device Tester|使开发者能够测试其设备是否能与 AWS IoT 服务互操作|
|数据服务|AWS IoT SiteWise|提供网关软件,用于收集本地数据并将其发送到 AWS 云进行进一步处理|
|数据服务|AWS IoT Analytics|在存储大量非结构化 IoT 数据之前进行预处理|
|数据服务|AWS IoT Events|监控一组设备的故障或操作变化,并根据定义的规则触发操作|

集成 ESP32 设备到 AWS IoT 后,所有其他 AWS 云服务都可用于任何类型的应用程序。AWS IoT 服务文档可参考: https://docs.aws.amazon.com/iot/latest/developerguide/aws-iot-how-it-works.html

2.2 Azure IoT

Azure IoT 提供了类似的服务,用于开发 IoT 应用程序和在云端管理 IoT 设备。
- IoT Hub :Azure IoT 的前端服务,为 IoT 设备提供与其他 Azure 云服务集成的端点。
- Device Provisioning Service :通过零接触策略验证 IoT 设备的唯一身份,实现设备的预配,无需人工干预。
- IoT Plug and Play :引入描述设备功能的设备模型,消除手动配置的需求。
- Device Update :用于 IoT 设备的 OTA 更新服务。
- IoT Central :使开发者能够在 Azure 云上开发自己的自定义 IoT 解决方案。
- Azure IoT Edge :旨在将数据预处理和数据分析转移到边缘设备,以处理边缘的数据管理。
- Azure Digital Twins :一种分析工具,用于建模和分析整个 IoT 解决方案,以获得整体视图和见解。
- Azure Time Series Insights Gen2 :另一种分析服务,处理时间序列数据以揭示任何异常或趋势。

Azure IoT 文档可参考: https://docs.microsoft.com/en-gb/azure/iot-fundamentals

2.3 Google IoT Core

Google IoT Core 提供单个 API 来管理数百万台设备。启用该 API 后,它提供两个主要组件:
- 设备管理器:用于注册和配置设备。
- 协议桥:设备通过它连接以与 Google IoT Core 通信。

注册并配置设备连接到 Google IoT Core 后,可启用其他 Google 服务进行进一步处理。更多信息可参考: https://cloud.google.com/iot/docs/concepts

2.4 阿里云 IoT 平台(Aliyun IoT)

阿里云 IoT 平台具有以下开发 IoT 应用程序的功能:
- 设备连接
- 消息通信
- 设备管理
- 监控和维护
- 数据分析

该平台提供 SDK 和其他软件组件,使开发者能够轻松将 IoT 设备连接到云端。连接设备后,可使用其他阿里云服务,也可将消息重定向到自己的本地服务器。阿里云 IoT 文档可参考: https://www.alibabacloud.com/help/product/30520.htm

无论选择哪个 IoT 平台,与平台的通信始终是加密和安全的。

3. 开发 AWS IoT 应用

接下来,我们将把之前的 MQTT 应用适配到 AWS 云。

3.1 准备工作

在开始之前,需要拥有一个 AWS 账户并安装 aws 命令行工具。相关文档如下:
- AWS IoT Core 入门
- 安装、更新和卸载 AWS CLI 版本 2
- 配置 AWS CLI

3.2 创建事物、策略和证书
graph LR
    A[检查 aws 命令行工具] --> B[创建事物]
    B --> C[创建策略描述文件]
    C --> D[创建策略]
    D --> E[创建密钥和证书]
    E --> F[将策略附加到证书]
    F --> G[将证书附加到事物]

具体步骤如下:
1. 检查 aws 命令行工具是否正常工作:

$ aws --version
  1. 创建一个事物:
$ aws iot create-thing --thing-name my_sensor1
  1. 创建策略描述文件 policy.json ,内容如下:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [ 
             "iot:Connect",
             "iot:Publish",
             "iot:Subscribe",
             "iot:Receive" 
       ],
      "Resource": "arn:aws:iot:*:*:*"
    }  
  ]
}
  1. 使用策略文件创建策略:
$ aws iot create-policy \
    --policy-name my_sensor1_policy \
    --policy-document file://policy.json
  1. 创建私钥、公钥和证书:
$ aws iot create-keys-and-certificate \
    --certificate-pem-outfile "my_sensor1.cert.pem" \
    --public-key-outfile "my_sensor1.public.key" \
    --private-key-outfile "my_sensor1.private.key" \
    --set-as-active

记录证书的 Amazon 资源名称(ARN)。
6. 将策略附加到证书:

$ aws iot attach-policy \
    --policy-name my_sensor1_policy \
    --target <cert_arn>
  1. 将证书附加到事物:
$ aws iot attach-thing-principal \
    --thing-name my_sensor1 \
    --principal <cert_arn>
3.3 测试配置
  1. 下载 Amazon 根证书:
$ wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
  1. 查找 AWS IoT 端点地址:
$ aws iot describe-endpoint --endpoint-type iot:Data-ATS
  1. 运行订阅者:
$ mosquitto_sub --cafile AmazonRootCA1.pem --cert my_sensor1.cert.pem --key my_sensor1.private.key -d -h <endpointAddress> -p 8883 -t test/topic1
  1. 发布消息:
$ mosquitto_pub --cafile AmazonRootCA1.pem --cert my_sensor1.cert.pem --key my_sensor1.private.key -d -h <endpointAddress> -p 8883 -t test/topic1 -m hi
3.4 准备开发环境

将 DHT11 连接到 GPIO17 后,按以下步骤准备开发环境:
1. 创建 PlatformIO 项目, platformio.ini 内容如下:

[env:az-delivery-devkit-v4]
platform = espressif32
board = az-delivery-devkit-v4
framework = espidf
monitor_speed = 115200
lib_extra_dirs = 
    ../../common/esp-idf-lib/components
    ../common
build_flags =
    -DWIFI_SSID=${sysenv.WIFI_SSID}
    -DWIFI_PASS=${sysenv.WIFI_PASS}
    -DAWS_ENDPOINT=${sysenv.AWS_ENDPOINT}
board_build.embed_txtfiles = 
    ./tmp/my_sensor1.private.key
    ./tmp/my_sensor1.cert.pem
    ./tmp/AmazonRootCA1.pem
  1. 激活 pio 工具并设置环境变量:
$ source ~/.platformio/penv/bin/activate
(penv)$ export WIFI_SSID='\"<your_ssid>\"'
(penv)$ export WIFI_PASS='\"<your_passwd>\"'
(penv)$ export AWS_ENDPOINT='\"<your_endpoint>\"'
  1. 将加密文件复制到临时目录:
(penv)$ mkdir tmp && cp <crpyto_dir>/* tmp/
(penv)$ ls -1 tmp
AmazonRootCA1.pem
my_sensor1.cert.pem
my_sensor1.private.key
my_sensor1.public.key
  1. 更新 src/CMakeLists.txt
FILE(GLOB_RECURSE app_sources ${CMAKE_SOURCE_DIR}/src/*.*)
set(COMPONENT_ADD_INCLUDEDIRS ".")
idf_component_register(SRCS ${app_sources})
target_add_binary_data(${COMPONENT_TARGET} "../tmp/AmazonRootCA1.pem" TEXT)
target_add_binary_data(${COMPONENT_TARGET} "../tmp/my_sensor1.cert.pem" TEXT)
target_add_binary_data(${COMPONENT_TARGET} "../tmp/my_sensor1.private.key" TEXT)
  1. 编辑项目根目录下的 CMakeLists.txt
cmake_minimum_required(VERSION 3.16.0)
list(APPEND EXTRA_COMPONENT_DIRS "../../common/components/esp-aws-iot")
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(aws_ex)
3.5 开发应用程序

编辑 src/main.c

#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_log.h"
#include "app_temp.h"
#include "app_wifi.h"
#include "aws_iot_config.h"
#include "aws_iot_log.h"
#include "aws_iot_version.h"
#include "aws_iot_mqtt_client_interface.h"

#define TAG "app"
#define SENSOR_NO "1"
#define ENABLE_TOPIC "home/" SENSOR_NO "/enable"
#define TEMP_TOPIC "home/temperature/" SENSOR_NO
#define HUM_TOPIC "home/humidity/" SENSOR_NO

extern const uint8_t aws_root_ca_pem_start[] asm("_binary_AmazonRootCA1_pem_start");
extern const uint8_t aws_root_ca_pem_end[] asm("_binary_AmazonRootCA1_pem_end");
extern const uint8_t certificate_pem_crt_start[] asm("_binary_my_sensor1_cert_pem_start");
extern const uint8_t certificate_pem_crt_end[] asm("_binary_my_sensor1_cert_pem_end");
extern const uint8_t private_pem_key_start[] asm("_binary_my_sensor1_private_key_start");
extern const uint8_t private_pem_key_end[] asm("_binary_my_sensor1_private_key_end");
static char endpoint_address[] = AWS_ENDPOINT;
static char client_id[] = "my_sensor1";
static AWS_IoT_Client aws_client;
static bool enabled = false;

static void handle_wifi_connect(void)
{
    xTaskCreate(connect_aws_mqtt, "connect_aws_mqtt", 15 * configMINIMAL_STACK_SIZE, NULL, 5, NULL);
    apptemp_init(publish_reading);
}

static void handle_wifi_failed(void)
{
    ESP_LOGE(TAG, "wifi failed");
}

void app_main()
{
    connect_wifi_params_t cbs = {
        .on_connected = handle_wifi_connect,
        .on_failed = handle_wifi_failed};
    appwifi_connect(cbs);
}

void connect_aws_mqtt(void *param)
{
    memset((void *)&aws_client, 0, sizeof(aws_client));
    IoT_Client_Init_Params mqttInitParams = iotClientInitParamsDefault;
    mqttInitParams.pHostURL = endpoint_address;
    mqttInitParams.port = AWS_IOT_MQTT_PORT;
    mqttInitParams.pRootCALocation = (const char *)aws_root_ca_pem_start;
    mqttInitParams.pDeviceCertLocation = (const char *)certificate_pem_crt_start;
    mqttInitParams.pDevicePrivateKeyLocation = (const char *)private_pem_key_start;
    mqttInitParams.disconnectHandler = disconnected_handler;
    aws_iot_mqtt_init(&aws_client, &mqttInitParams);

    IoT_Client_Connect_Params connectParams = iotClientConnectParamsDefault;
    connectParams.keepAliveIntervalInSec = 10;
    connectParams.pClientID = client_id;
    connectParams.clientIDLen = (uint16_t)strlen(client_id);
    while (aws_iot_mqtt_connect(&aws_client, &connectParams) != SUCCESS)
    {
        vTaskDelay(1000 / portTICK_RATE_MS);
    }
    ESP_LOGI(TAG, "connected");

    aws_iot_mqtt_subscribe(&aws_client, ENABLE_TOPIC, strlen(ENABLE_TOPIC), QOS0, subscribe_handler, NULL);
    while (1)
    {
        aws_iot_mqtt_yield(&aws_client, 100);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
}

void subscribe_handler(AWS_IoT_Client *pClient,
                       char *topicName, uint16_t topicNameLen,
                       IoT_Publish_Message_Params *params,
                       void *pData)
{
    enabled = ((char *)params->payload)[0] - '0';
}

void disconnected_handler(AWS_IoT_Client *pClient, void *data)
{
    ESP_LOGW(TAG, "reconnecting...");
}

static void publish_reading(int temp, int hum)
{
    IoT_Error_t res = aws_iot_mqtt_yield(&aws_client, 100);
    if (res != SUCCESS && res != NETWORK_RECONNECTED)
    {
        return;
    }
    if (!enabled)
    {
        return;
    }

    char buffer[5];
    IoT_Publish_Message_Params message;
    memset((void *)&message, 0, sizeof(message));
    itoa(temp, buffer, 10);
    message.qos = QOS0;
    message.payload = (void *)buffer;
    message.payloadLen = strlen(buffer);
    aws_iot_mqtt_publish(&aws_client, TEMP_TOPIC, strlen(TEMP_TOPIC), &message);
    itoa(hum, buffer, 10);
    message.payloadLen = strlen(buffer);
    aws_iot_mqtt_publish(&aws_client, HUM_TOPIC, strlen(HUM_TOPIC), &message);
}
3.6 测试应用程序
  1. 上传固件并启动串口监视器:
(penv)$ pio run -t upload && pio device monitor
  1. 启动 mosquitto_sub 客户端等待消息:
$ mosquitto_sub --cafile AmazonRootCA1.pem --cert my_sensor1.cert.pem --key my_sensor1.private.key -d -h <endpointAddress> -p 8883 -t home/temperature/1
  1. 启用设备:
$ mosquitto_pub --cafile AmazonRootCA1.pem --cert my_sensor1.cert.pem --key my_sensor1.private.key -d -h <endpointAddress> -p 8883 -t home/1/enable -m '1'

通过以上步骤,我们完成了将 ESP32 设备连接到 AWS IoT 并开发应用程序的过程。不同的云平台各有特点,开发者可以根据项目需求选择合适的平台。

无云不 IoT:云平台与服务

4. 各云平台特点对比

为了更清晰地了解各个云平台的特点,我们可以通过以下表格进行对比:
|云平台|主要特点|适用场景|
| ---- | ---- | ---- |
|AWS IoT|服务种类丰富,涵盖控制、设备软件和数据服务等多个方面;拥有强大的生态系统和广泛的开发者社区|大型企业级 IoT 项目,对功能完整性和扩展性要求较高的场景|
|Azure IoT|提供全面的 IoT 解决方案,支持零接触设备预配和 Plug and Play 功能;与微软的其他云服务集成紧密|已经广泛使用微软技术栈的企业,希望实现统一管理和开发的 IoT 项目|
|Google IoT Core|提供单个 API 管理大量设备,简化设备管理流程;与 Google 的大数据和机器学习服务结合紧密|需要处理海量设备数据,并借助 Google 强大数据分析能力的 IoT 项目|
|阿里云 IoT 平台|具备设备连接、消息通信、设备管理等全面功能;提供丰富的 SDK 和工具,易于开发|国内企业的 IoT 项目,尤其是对本地化服务和支持有需求的场景|

5. 云平台选择建议

在选择云平台时,可以参考以下流程图:

graph LR
    A[项目规模] --> B{大型项目}
    B -->|是| C{对功能扩展性要求高}
    C -->|是| D(AWS IoT)
    C -->|否| E{使用微软技术栈}
    E -->|是| F(Azure IoT)
    E -->|否| G{需要处理海量数据}
    G -->|是| H(Google IoT Core)
    G -->|否| I{国内项目}
    I -->|是| J(阿里云 IoT 平台)
    I -->|否| K(综合评估)
    B -->|否| L{国内项目}
    L -->|是| J(阿里云 IoT 平台)
    L -->|否| K(综合评估)

以下是具体的选择建议:
1. 项目规模和复杂度 :如果是大型、复杂的 IoT 项目,需要多种服务和功能的支持,AWS IoT 可能是一个不错的选择。它提供了丰富的服务类别,能够满足不同层次的需求。
2. 技术栈兼容性 :如果企业已经广泛使用微软的技术栈,Azure IoT 可以更好地与现有系统集成,实现统一管理和开发。
3. 数据处理能力 :对于需要处理海量设备数据,并希望借助强大的数据分析能力的项目,Google IoT Core 结合 Google 的大数据和机器学习服务,能够提供更高效的解决方案。
4. 本地化服务 :国内的 IoT 项目,阿里云 IoT 平台提供了丰富的本地化服务和支持,并且易于开发和使用。

6. 总结与展望

通过本文的介绍,我们了解了常见的云 IoT 平台,包括 AWS IoT、Azure IoT、Google IoT Core 和阿里云 IoT 平台的特点和功能。同时,详细介绍了如何将 ESP32 设备连接到 AWS IoT 并开发应用程序的具体步骤。

在未来的 IoT 发展中,云平台将继续发挥重要作用。随着技术的不断进步,云平台将提供更强大的功能和更高效的服务,例如更智能的数据分析、更安全的设备管理等。开发者可以根据项目的需求和特点,选择合适的云平台,实现更高效、更智能的 IoT 应用开发。

希望本文能够为你在 IoT 云平台的选择和开发过程中提供帮助,让你能够更好地利用云平台的优势,推动 IoT 项目的成功实施。

以上就是关于无云不 IoT:云平台与服务的相关内容,希望对你有所帮助。如果你在实际应用中遇到问题,欢迎在评论区留言交流。

内容概要:本文档介绍了基于3D FDTD(时域有限差分)方法在MATLAB平台上对微带线馈电的矩形天线进行仿真分析的技术方案,重点在于模拟超MATLAB基于3D FDTD的微带线馈矩形天线分析[用于模拟超宽带脉冲通过线馈矩形天线的传播,以计算微带结构的回波损耗参数]宽带脉冲信号通过天线结构的传播过程,并计算微带结构的回波损耗参数(S11),以评估天线的匹配性能和辐射特性。该方法通过建立三维电磁场模型,精确求解麦克斯韦方程组,适用于高频电磁仿真,能够有效分析天线在宽频带内的响应特性。文档还提及该资源属于一个涵盖多个科研方向的综合性MATLAB仿真资源包,涉及通信、信号处理、电力系统、机器学习等多个领域。; 适合人群:具备电磁场微波技术基础知识,熟悉MATLAB编程及数值仿真的高校研究生、科研人员及通信工程领域技术人员。; 使用场景及目标:① 掌握3D FDTD方法在天线仿真中的具体实现流程;② 分析微带天线的回波损耗特性,优化天线设计参数以提升宽带匹配性能;③ 学习复杂电磁问题的数值建模仿真技巧,拓展在射频无线通信领域的研究能力。; 阅读建议:建议读者结合电磁理论基础,仔细理解FDTD算法的离散化过程和边界条件设置,运行并调试提供的MATLAB代码,通过调整天线几何尺寸和材料参数观察回波损耗曲线的变化,从而深入掌握仿真原理工程应用方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值