ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AWS IoT Core 基础场景实战:基于 AWS SDK for Java V2 的 Thing、证书、影子、规则与搜索全流程

AWS IoT Core 基础场景实战:基于 AWS SDK for Java V2 的 Thing、证书、影子、规则与搜索全流程 示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载本文基于 aws-doc-sdk-examples 仓库中的 AWS IoT 基础场景技术规范 展开介绍如何利用 AWS SDK for Java V2同步与异步客户端依次完成 AWS IoT Core 的设备管理全生命周期操作创建 Thing、签发设备证书、绑定证书、更新影子状态、获取专属 Endpoint、创建规则、索引搜索以及资源清理。读者完成本文后将掌握一套可直接复制运行的 AWS IoT 入门场景程序并理解其背后的 CloudFormation 基础设施编排、异步客户端用法与异常处理策略。场景概述AWS IoT 设备管理演示程序AWS IoT Core 为联网设备传感器、执行器、嵌入式设备、智能家电等与 AWS 云之间提供安全、双向的通信能力。仓库中的iot基础场景是一个交互式命令行程序向不熟悉 AWS IoT 的开发者演示典型设备管理用例创建 Things物模型、创建证书、将证书绑定到 Thing、更新影子、创建规则、执行索引搜索等。该场景对应的核心规格文档位于 scenarios/basics/iot/SPECIFICATION.md场景说明见 scenarios/basics/iot/README.md。在仓库中该场景已有多种语言实现包括 JavaIotScenario.java、KotlinIotScenario.kt与 Pythonscenario_iot_basics.py其中 Java 实现是本文讲解的主体。资源依赖与 CloudFormation 集成场景程序运行前需要两个 AWS 资源二者均由 CloudFormation 堆栈自动创建roleARN具备操作 AWS IoT 权限的 IAM 角色 ARN。该角色通过 CloudFormation 堆栈部署创建并被授权向 SNS 主题发布消息供 IoT 规则使用。snsAction用于 IoT 规则动作的 SNS 主题 ARN。CloudFormation 编排方式Setup场景通过模板文件iot_usecase/resources/cfn_template.yaml部署 CloudFormation 堆栈Resource CreationSNS 主题与 IAM 角色全部在模板中声明Output Retrieval场景从堆栈输出中读取 SNS 主题 ARN 与 IAM 角色 ARNCleanup场景结束时删除整个 CloudFormation 堆栈确保资源被正确回收。使用 CloudFormation 提供了 Infrastructure as CodeIaC的收益保证资源部署在不同环境中一致且可重复。模板资源剖析模板文件位于 scenarios/basics/iot/iot_usecase/resources/cfn_template.yaml其中定义了三类关键资源iotworkflowtopicEC6B5DCDAWS::SNS::Topic即场景所需的 SNS 主题其 ARN 通过堆栈输出SNSTopicArn暴露给调用方docexampleimportrole77AD6B59AWS::IAM::Role信任策略AssumeRolePolicyDocument声明iot.amazonaws.com服务主体可以代入该角色即角色专门供 AWS IoT 服务使用docexampleimportroleDefaultPolicy627063D0AWS::IAM::Policy为上述角色附加策略示例模板中授权了dynamodb:*通配权限Resource: *实际使用时建议按最小权限原则收敛。模板的Outputs部分将 SNS 主题 ARN 与角色 ARN 输出Outputs: SNSTopicArn: Value: Ref: iotworkflowtopicEC6B5DCD RoleArn: Value: Fn::GetAtt: - docexampleimportrole77AD6B59 - Arn场景程序正是以这两个输出值roleARN、snsAction作为命令行参数运行的。此外模板还包含 CDK 元数据AWS::CDK::Metadata、BootstrapVersion参数及CheckBootstrapVersion规则要求以较新版本的 CDK CLI 执行cdk bootstrap后方可部署。Hello AWS IoT快速上手 listThingsHello AWS IoT面向对 AWS IoT SDK 不熟悉的用户帮助其快速跑通环境。其核心逻辑是使用ListThings列出最多 10 个 Thing。Java 实现位于 HelloIoT.javapublic static void listAllThings(IotClient iotClient) { iotClient.listThingsPaginator(ListThingsRequest.builder() .maxResults(10) .build()) .stream() .flatMap(response - response.things().stream()) .forEach(attribute - { System.out.println(Thing name: attribute.thingName()); System.out.println(Thing ARN: attribute.thingArn()); }); }值得注意的实现细节使用同步客户端IotClient区域固定为Region.US_EAST_1通过分页器listThingsPaginator对应software.amazon.awssdk.services.iot.paginators.ListThingsIterable配合 JavaStream拉取分页数据maxResults(10)限制单次返回数量保证首次体验时输出不会过长。场景主程序15 步设备管理流程完整场景由 IotScenario.java 的main方法驱动。程序启动后校验参数个数要求必须传入roleARN与snsAction两个命令行参数随后通过Scanner与用户交互并在每个步骤之间调用waitForInputToContinue要求输入字符c后回车继续保证演示过程可读可控。场景演示了 AWS IoT 服务的以下关键操作流程编号遵循规格文档 scenarios/basics/iot/SPECIFICATION.md1. 创建 AWS IoT ThingCreateThing使用CreateThingAPI 创建 Thing。Java 实现见 IotActions.javaCreateThingRequest createThingRequest CreateThingRequest.builder() .thingName(thingName) .build(); CompletableFutureCreateThingResponse future getAsyncClient().createThing(createThingRequest);Thing 是 AWS IoT 中可与物理设备关联的虚拟实体。创建成功后打印 Thing 名称与 ARN。2. 列出 AWS IoT ThingsListThings调用ListThings获取账号下所有 Thing展示名称、ARN 及关联属性用于验证刚创建的 Thing 是否成功、并展示账号中已有的其他 Thing。规格文档中的运行输出示例显示 Found 3 IoT Things其中既包含新创建的 Thing也包含账号内既有 Thing 及其Location、DeviceType等属性。3. 生成设备证书CreateKeysAndCertificate使用CreateKeysAndCertificateAPI 异步生成设备证书与密钥对证书用于设备连接 AWS IoT 时的身份认证。Java 实现见 IotActions.javaCompletableFutureCreateKeysAndCertificateResponse future getAsyncClient().createKeysAndCertificate(); future.whenComplete((response, ex) - { if (response ! null) { String certificatePem response.certificatePem(); certificateArn[0] response.certificateArn(); // 打印证书 PEM 内容与 ARN } }); future.join();实现要点方法通过whenComplete异步回调处理结果并在异常时区分CompletionException包装的IotException取ex.getCause()与未知异常最后future.join()阻塞等待保证返回值证书 ARN就绪。4. 将证书附加到 ThingAttachThingPrincipal使用AttachThingPrincipalAPI 将设备证书与 Thing 关联使设备具备通过 AWS IoT Core 认证通信的能力。实现见 IotActions.java其中通过attachResponse.sdkHttpResponse().isSuccessful()校验 HTTP 响应状态成功后调用私有方法describeThing打印 Thing 详情。5. 为 Thing 更新属性规格文档描述此步骤使用UpdateThingShadowAPI 更新 Thing 影子中的属性值影子代表设备的当前状态与属性。在 Java 主流程 IotScenario.java 中该步骤实际调用updateShadowThing(thingName)而 Kotlin 实现则额外展示了通过UpdateThing直接更新注册表属性locationOffice、firmwareVersionv2.0的写法见 IotScenario.kt。两套 API 分别面向影子状态与注册表属性可根据实际业务选择。6. 获取 AWS IoT EndpointDescribeEndpoint使用DescribeEndpointAPIendpointType iot:Data-ATS获取账号专属的 AWS IoT Core 数据面 Endpoint。Java 实现见 IotActions.java并通过正则^(.*?)\.iot\.us-east-1\.amazonaws\.com从返回值中提取子域名拼接出完整的https://subdomain-ats.iot.us-east-1.amazonaws.com地址。运行示例输出为Extracted subdomain: a39q2exsoth3da Full Endpoint URL: https://a39q2exsoth3da-ats.iot.us-east-1.amazonaws.com7. 列出证书ListCertificates调用ListCertificates列出账号下所有证书输出每条证书的certificateId与certificateArn见 IotActions.java。主流程中若用户此前未创建证书则跳过此步并提示。8. 更新 Thing ShadowUpdateThingShadow通过 IoT Data Plane 客户端IotDataPlaneAsyncClient更新影子。Java 实现构造如下状态文档并作为 payload 提交见 IotActions.javaString stateDocument {\state\:{\reported\:{\temperature\:25, \humidity\:50}}}; SdkBytes data SdkBytes.fromString(stateDocument, StandardCharsets.UTF_8); UpdateThingShadowRequest updateThingShadowRequest UpdateThingShadowRequest.builder() .thingName(thingName) .payload(data) .build();影子Thing Shadow是物理设备的数字孪生用于在云端与设备之间同步、控制设备状态。9. 以 JSON 格式写出状态信息GetThingShadow调用GetThingShadow获取影子状态数据以 AWS IoT 标准数据格式 JSON 返回见 IotActions.java。运行示例返回{state:{reported:{temperature:25,humidity:50}},metadata:{reported:{temperature:{timestamp:1707413791},humidity:{timestamp:1707413791}}},version:1,timestamp:1707413794}10. 创建 AWS IoT 规则CreateTopicRule使用CreateTopicRuleAPI 创建规则规则可基于设备数据或事件触发预定义动作。Java 实现见 IotActions.java构造了一个将消息转发至 SNS 主题的规则String sql SELECT * FROM TOPIC ; // TOPIC your-iot-topic SnsAction action1 SnsAction.builder() .targetArn(action) // snsAction即 SNS 主题 ARN .roleArn(roleARN) // 具备发布权限的 IAM 角色 ARN .build(); Action myAction Action.builder().sns(action1).build(); TopicRulePayload topicRulePayload TopicRulePayload.builder() .sql(sql) .actions(myAction) .build(); CreateTopicRuleRequest topicRuleRequest CreateTopicRuleRequest.builder() .ruleName(ruleName) .topicRulePayload(topicRulePayload) .build();规格文档提醒创建规则是管理员级操作任何拥有建规则权限的用户都能访问规则处理的数据因此需谨慎授权。11. 列出 AWS IoT 规则ListTopicRules调用ListTopicRules列出账号下全部规则输出规则名称与 ARN见 IotActions.java。12. 搜索 AWS IoT ThingsSearchIndex主流程以thingName:thingName作为查询串调用searchThings使用SearchIndexAPI 按 Thing 名称、属性或影子状态等条件检索见 IotActions.java。运行示例输出 Thing id found using search is abad8003-3abd-4614-bc04-8d0b6211eb9e。自动索引配置机制规格文档特别指出搜索功能包含对索引设置的智能处理若搜索索引尚未配置系统通过异常处理自动检测该状态捕获IndexNotReadyException与InvalidRequestException两类表明索引需要设置的异常自动将 Thing 索引模式配置为REGISTRY以启用搜索实现最多 10 次的重试机制每次间隔 10 秒等待索引就绪重试前校验索引配置状态全程输出详细日志告知用户进度。该机制在仓库的 Python 实现中有明确佐证场景代码捕获上述两类异常并提示 Search index not ready yet. This is expected.见 scenario_iot_basics.py而 iot_wrapper.py 中通过update_indexing_configuration将thingIndexingMode设置为REGISTRY随后time.sleep(10)等待索引就绪。13. 从 Thing 分离并删除证书DetachThingPrincipal DeleteCertificate若用户在步骤 3 创建了证书程序会询问是否删除。选择确认后依次调用DetachThingPrincipal分离证书与 Thing见 IotActions.java再调用DeleteCertificate删除证书。删除证书前需先从 ARN 中提取证书 ID工具方法extractCertificateId按:与/分割 ARN 完成解析见 IotActions.java。14. 删除 AWS IoT ThingDeleteThing经用户确认后调用DeleteThing删除 Thing见 IotActions.java。15. 清理资源场景结束时清理堆栈与规则删除名为IoTBasicsStack的 CloudFormation 堆栈并等待删除完成。运行示例中程序反复轮询 Waiting for CloudFormation stack IoTBasicsStack to be deleted...最终输出 Successfully cleaned up CloudFormation stack and all resources.。异步客户端与网络配置场景的 Java 实现基于 AWS SDK for Java V2 异步客户端客户端构建逻辑集中封装在 IotActions.java 的getAsyncClient与getAsyncDataPlaneClient中HTTP 客户端NettyNioAsyncHttpClientmaxConcurrency(100)连接/读/写超时均为 60 秒覆盖配置apiCallTimeout2 分钟、apiCallAttemptTimeout90 秒RetryPolicy.numRetries(3)客户端复用以静态字段缓存客户端实例避免重复构建区域固定为Region.US_EAST_1数据平面客户端IotDataPlaneAsyncClient专门用于影子读写UpdateThingShadow/GetThingShadow与管控平面IotAsyncClient分离。项目依赖由 pom.xml 管理通过software.amazon.awssdk:bom版本 2.35.10统一依赖版本核心依赖包括iot、iotdataplane、netty-nio-client、secretsmanager、ssm、sso/ssooidc测试依赖为 JUnit Jupiter 5.11.4要求 Java 21maven.compiler.source/target21。异常处理策略每个 AWS IoT 操作都可能抛出特定异常规格文档给出了完整的异常处理对照表实际实现与之一致Action错误处理方式CreateThingResourceAlreadyExistsException跳过创建并通知用户ListThingsThrottlingException通知用户稍后重试CreateKeysAndCertificateThrottlingException通知用户稍后重试AttachThingPrincipalResourceNotFoundException通知无法执行并返回UpdateThingResourceNotFoundException通知无法执行并返回DescribeEndpointThrottlingException通知用户稍后重试ListCertificatesThrottlingException通知用户稍后重试UpdateThingShadowResourceNotFoundException通知无法执行并返回GetThingShadowResourceNotFoundException通知无法执行并返回CreateTopicRuleResourceAlreadyExistsException跳过创建并通知用户ListTopicRulesThrottlingException通知用户稍后重试SearchIndexThrottlingException通知用户稍后重试DetachThingPrincipalResourceNotFoundException通知无法执行并返回DeleteCertificateResourceNotFoundException通知无法执行并返回DeleteThingResourceNotFoundException通知无法执行并返回从源码看Java 实现统一将异常包装进CompletableFuture回调中先剥离CompletionException取出真实IotException再通过awsErrorDetails().errorMessage()输出错误详情与表格策略一一对应。程序执行与用户交互示例场景包含完整的用户交互。规格文档给出了程序运行的真实输出以下是其关键片段Welcome to the AWS IoT example workflow. This example program demonstrates various interactions with the AWS Internet of Things (IoT) Core service. The program guides you through a series of steps, including creating an IoT Thing, generating a device certificate, updating the Thing with attributes, and so on. ... Press Enter to continue... -------------------------------------------------------------------------------- 1. Create an AWS IoT Thing. An AWS IoT Thing represents a virtual entity in the AWS IoT service that can be associated with a physical device. Enter Thing name: foo5543 foo5543 was successfully created. The ARN value is arn:aws:iot:us-east-1:814548047983:thing/foo5543用户需要交互提供的信息包括Thing 名称、是否创建证书y/n、规则名称以及是否删除证书/删除 Thingy/n其余步骤按回车Java 实现中为输入c继续。这种交互式设计让初学者能直观理解每一步操作对应的 AWS 资源变化。测试验证仓库为场景提供了集成测试 IoTTests.java用于验证全部核心流程随机命名thingName、ruleName、queryString通过Random生成随机后缀避免多账号/多次运行冲突参数来源roleARN与snsAction从 AWS Secrets Manager 密钥test/iot读取通过 Gson 反序列化为SecretValues流程顺序Order注解保证先执行testHello再执行testIotScenario断言方式每个操作均以assertDoesNotThrow包裹覆盖创建 Thing、创建/附加/分离/删除证书、更新与读取影子、创建/列出规则、搜索 Thing、删除 Thing 的完整链路索引等待搜索前Thread.sleep(5000)为索引就绪留出缓冲。运行集成测试可能产生 AWS 费用且测试前需要先部署 CloudFormation 堆栈并将两个 ARN 写入 Secrets Manager。运行前提与构建方式运行该场景前需要满足以下条件配置 AWS 凭证可参考仓库 javav2 说明或使用EnvironmentVariableCredentialsProvider环境变量方式使用cdk bootstrap引导 CDK 环境然后部署iot_usecase/resources/cfn_template.yaml模板从堆栈输出获取roleARN与snsAction使用 Maven 构建并运行# 构建 mvn package # 运行 Hello 示例 mvn exec:java -Dexec.mainClasscom.example.iot.HelloIoT # 运行完整场景需传入两个 ARN 参数 mvn exec:java -Dexec.mainClasscom.example.iot.scenario.IotScenario \ -Dexec.argsroleARN snsAction运行集成测试则通过mvn test测试前需先创建 Secrets Manager 密钥test/iot并填入两个 ARN。注意运行代码与测试都可能在 AWS 账号中产生费用建议遵循最小权限原则配置 IAM 权限。总结AWS IoT 基础场景将设备管理中最常使用的 15 个操作串联为一条完整、可交互、可自动清理的演示链路覆盖了物联网应用接入 AWS 的核心知识面物模型Thing、设备身份证书、设备状态影子、云端行为规则与设备检索索引搜索。结合 CloudFormation 的 IaC 编排该场景既是 AWS SDK for Java V2 的绝佳入门示例也是理解 AWS IoT Core 数据面与控制面 API 协同工作的完整参考。更多实现可对照查看 Python 版本、Kotlin 版本 以及 C 版本。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐AWS SDK for Java 2.x 的 AWS KMS 基础场景实战指南aws-doc-sdk-examplesAWS SDK for Java 2.x 的 AWS KMS 基础场景实战指南aws doc sdk examples 本篇技术指南以 scenarios/示例工程教程后端使用 AWS SDK for .NET v4 管理 AWS IoTThing、证书、影子与规则的实战指南使用 AWS SDK for .NET v4 管理 AWS IoTThing、证书、影子与规则的实战指南 本文以 aws doc sdk examples 仓示例工程教程后端AWS IoT 设备与影子实战指南基于 AWS SDK for C 的代码示例详解AWS IoT 设备与影子实战指南基于 AWS SDK for C 的代码示例详解 AWS IoT 为联网设备传感器、执行器、嵌入式设备、无线设备、智能文档开发工具上一篇终极解决方案修复Windows 10开始菜单样式失效问题的完整指南下一篇告别繁琐编辑LazyVim中dial.nvim插件的3个配置痛点与解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表