无云不 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
- 创建一个事物:
$ aws iot create-thing --thing-name my_sensor1
- 创建策略描述文件
policy.json,内容如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"iot:Connect",
"iot:Publish",
"iot:Subscribe",
"iot:Receive"
],
"Resource": "arn:aws:iot:*:*:*"
}
]
}
- 使用策略文件创建策略:
$ aws iot create-policy \
--policy-name my_sensor1_policy \
--policy-document file://policy.json
- 创建私钥、公钥和证书:
$ 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>
- 将证书附加到事物:
$ aws iot attach-thing-principal \
--thing-name my_sensor1 \
--principal <cert_arn>
3.3 测试配置
- 下载 Amazon 根证书:
$ wget https://www.amazontrust.com/repository/AmazonRootCA1.pem
- 查找 AWS IoT 端点地址:
$ aws iot describe-endpoint --endpoint-type iot:Data-ATS
- 运行订阅者:
$ mosquitto_sub --cafile AmazonRootCA1.pem --cert my_sensor1.cert.pem --key my_sensor1.private.key -d -h <endpointAddress> -p 8883 -t test/topic1
- 发布消息:
$ 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
- 激活 pio 工具并设置环境变量:
$ source ~/.platformio/penv/bin/activate
(penv)$ export WIFI_SSID='\"<your_ssid>\"'
(penv)$ export WIFI_PASS='\"<your_passwd>\"'
(penv)$ export AWS_ENDPOINT='\"<your_endpoint>\"'
- 将加密文件复制到临时目录:
(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
- 更新
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)
- 编辑项目根目录下的
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 测试应用程序
- 上传固件并启动串口监视器:
(penv)$ pio run -t upload && pio device monitor
- 启动
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
- 启用设备:
$ 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:云平台与服务的相关内容,希望对你有所帮助。如果你在实际应用中遇到问题,欢迎在评论区留言交流。
超级会员免费看
56

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



