AWS IoT SDK for Kotlin を使用した の例 - AWS SDK コード例

Doc AWS SDK Examples リポジトリには、他にも SDK の例があります。 AWS GitHub

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS IoT SDK for Kotlin を使用した の例

次のコード例は、 で AWS SDK for Kotlin を使用してアクションを実行し、一般的なシナリオを実装する方法を示しています AWS IoT。

アクションはより大きなプログラムからのコードの抜粋であり、コンテキスト内で実行する必要があります。アクションは個々のサービス機能を呼び出す方法を示していますが、関連するシナリオやサービス間の例ではアクションのコンテキストが確認できます。

「シナリオ」は、同じサービス内で複数の関数を呼び出して、特定のタスクを実行する方法を示すコード例です。

各例には、 へのリンクが含まれています。このリンクには GitHub、コンテキスト内でコードをセットアップして実行する方法の手順が記載されています。

開始方法

次のコード例は、 AWS IoTの使用を開始する方法を示しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

import aws.sdk.kotlin.services.iot.IotClient import aws.sdk.kotlin.services.iot.model.ListThingsRequest suspend fun main() { println("A listing of your AWS IoT Things:") listAllThings() } suspend fun listAllThings() { val thingsRequest = ListThingsRequest { maxResults = 10 } IotClient { region = "us-east-1" }.use { iotClient -> val response = iotClient.listThings(thingsRequest) val thingList = response.things if (thingList != null) { for (attribute in thingList) { println("Thing name ${attribute.thingName}") println("Thing ARN: ${attribute.thingArn}") } } } }
  • API の詳細については、AWS 「 SDK for Kotlin API リファレンス」の「listThings」を参照してください。

アクション

次の例は、AttachThingPrincipal を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun attachCertificateToThing(thingNameVal: String?, certificateArn: String?) { val principalRequest = AttachThingPrincipalRequest { thingName = thingNameVal principal = certificateArn } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.attachThingPrincipal(principalRequest) println("Certificate attached to $thingNameVal successfully.") } }
  • API の詳細については、AttachThingPrincipalAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、CreateKeysAndCertificate を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

public static String createCertificate(IotClient iotClient) { try { CreateKeysAndCertificateResponse response = iotClient.createKeysAndCertificate(); String certificatePem = response.certificatePem(); String certificateArn = response.certificateArn(); // Print the details. System.out.println("\nCertificate:"); System.out.println(certificatePem); System.out.println("\nCertificate ARN:"); System.out.println(certificateArn); return certificateArn; } catch (IotException e) { System.err.println(e.awsErrorDetails().errorMessage()); System.exit(1); } return ""; }
  • API の詳細については、CreateKeysAndCertificateAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、CreateThing を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun createIoTThing(thingNameVal: String) { val createThingRequest = CreateThingRequest { thingName = thingNameVal } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.createThing(createThingRequest) println("Created $thingNameVal}") } }
  • API の詳細については、CreateThingAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、CreateTopicRule を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun createIoTRule(roleARNVal: String?, ruleNameVal: String?, action: String?) { val sqlVal = "SELECT * FROM '$TOPIC '" val action1 = SnsAction { targetArn = action roleArn = roleARNVal } val myAction = Action { sns = action1 } val topicRulePayloadVal = TopicRulePayload { sql = sqlVal actions = listOf(myAction) } val topicRuleRequest = CreateTopicRuleRequest { ruleName = ruleNameVal topicRulePayload = topicRulePayloadVal } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.createTopicRule(topicRuleRequest) println("IoT rule created successfully.") } }
  • API の詳細については、CreateTopicRuleAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、DeleteCertificate を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun deleteCertificate(certificateArn: String) { val certificateProviderRequest = DeleteCertificateRequest { certificateId = extractCertificateId(certificateArn) } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.deleteCertificate(certificateProviderRequest) println("$certificateArn was successfully deleted.") } }
  • API の詳細については、DeleteCertificateAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、DeleteThing を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun deleteIoTThing(thingNameVal: String) { val deleteThingRequest = DeleteThingRequest { thingName = thingNameVal } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.deleteThing(deleteThingRequest) println("Deleted $thingNameVal") } }
  • API の詳細については、DeleteThingAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、DescribeEndpoint を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun describeEndpoint(): String? { val request = DescribeEndpointRequest {} IotClient { region = "us-east-1" }.use { iotClient -> val endpointResponse = iotClient.describeEndpoint(request) val endpointUrl: String? = endpointResponse.endpointAddress val exString: String = getValue(endpointUrl) val fullEndpoint = "https://$exString-ats.iot.us-east-1.amazonaws.com" println("Full endpoint URL: $fullEndpoint") return fullEndpoint } }
  • API の詳細については、DescribeEndpointAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、DescribeThing を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun describeThing(thingNameVal: String) { val thingRequest = DescribeThingRequest { thingName = thingNameVal } // Print Thing details. IotClient { region = "us-east-1" }.use { iotClient -> val describeResponse = iotClient.describeThing(thingRequest) println("Thing details:") println("Thing name: ${describeResponse.thingName}") println("Thing ARN: ${describeResponse.thingArn}") } }
  • API の詳細については、DescribeThingAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、DetachThingPrincipal を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun detachThingPrincipal(thingNameVal: String, certificateArn: String) { val thingPrincipalRequest = DetachThingPrincipalRequest { principal = certificateArn thingName = thingNameVal } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.detachThingPrincipal(thingPrincipalRequest) println("$certificateArn was successfully removed from $thingNameVal") } }
  • API の詳細については、DetachThingPrincipalAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、ListCertificates を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun listCertificates() { IotClient { region = "us-east-1" }.use { iotClient -> val response = iotClient.listCertificates() val certList = response.certificates certList?.forEach { cert -> println("Cert id: ${cert.certificateId}") println("Cert Arn: ${cert.certificateArn}") } } }
  • API の詳細については、ListCertificatesAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、SearchIndex を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun searchThings(queryStringVal: String?) { val searchIndexRequest = SearchIndexRequest { queryString = queryStringVal } IotClient { region = "us-east-1" }.use { iotClient -> val searchIndexResponse = iotClient.searchIndex(searchIndexRequest) if (searchIndexResponse.things?.isEmpty() == true) { println("No things found.") } else { searchIndexResponse.things ?.forEach { thing -> println("Thing id found using search is ${thing.thingId}") } } } }
  • API の詳細については、SearchIndexAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

次の例は、UpdateThing を使用する方法を説明しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

suspend fun updateThing(thingNameVal: String?) { val newLocation = "Office" val newFirmwareVersion = "v2.0" val attMap: MutableMap<String, String> = HashMap() attMap["location"] = newLocation attMap["firmwareVersion"] = newFirmwareVersion val attributePayloadVal = AttributePayload { attributes = attMap } val updateThingRequest = UpdateThingRequest { thingName = thingNameVal attributePayload = attributePayloadVal } IotClient { region = "us-east-1" }.use { iotClient -> // Update the IoT thing attributes. iotClient.updateThing(updateThingRequest) println("$thingNameVal attributes updated successfully.") } }
  • API の詳細については、UpdateThingAWS 「 SDK for Kotlin API リファレンス」の「」を参照してください。

シナリオ

次のコード例は、 AWS IoT SDK を使用して AWS IoT デバイス管理のユースケースを操作する方法を示しています。

SDK for Kotlin
注記

には他にもがあります GitHub。AWS コード例リポジトリ で全く同じ例を見つけて、設定と実行の方法を確認してください。

import aws.sdk.kotlin.services.iot.IotClient import aws.sdk.kotlin.services.iot.model.Action import aws.sdk.kotlin.services.iot.model.AttachThingPrincipalRequest import aws.sdk.kotlin.services.iot.model.AttributePayload import aws.sdk.kotlin.services.iot.model.CreateThingRequest import aws.sdk.kotlin.services.iot.model.CreateTopicRuleRequest import aws.sdk.kotlin.services.iot.model.DeleteCertificateRequest import aws.sdk.kotlin.services.iot.model.DeleteThingRequest import aws.sdk.kotlin.services.iot.model.DescribeEndpointRequest import aws.sdk.kotlin.services.iot.model.DescribeThingRequest import aws.sdk.kotlin.services.iot.model.DetachThingPrincipalRequest import aws.sdk.kotlin.services.iot.model.ListTopicRulesRequest import aws.sdk.kotlin.services.iot.model.SearchIndexRequest import aws.sdk.kotlin.services.iot.model.SnsAction import aws.sdk.kotlin.services.iot.model.TopicRulePayload import aws.sdk.kotlin.services.iot.model.UpdateThingRequest import aws.sdk.kotlin.services.iotdataplane.IotDataPlaneClient import aws.sdk.kotlin.services.iotdataplane.model.GetThingShadowRequest import aws.sdk.kotlin.services.iotdataplane.model.UpdateThingShadowRequest import aws.smithy.kotlin.runtime.content.ByteStream import aws.smithy.kotlin.runtime.content.toByteArray import java.util.Scanner import java.util.regex.Pattern import kotlin.system.exitProcess /** * Before running this Kotlin code example, ensure that your development environment * is set up, including configuring your credentials. * * For detailed instructions, refer to the following documentation topic: * [Setting Up Your Development Environment](https://docs.aws.amazon.com/sdk-for-kotlin/latest/developer-guide/setup.html) * * This code example requires an SNS topic and an IAM Role. * Follow the steps in the documentation to set up these resources: * * - [Creating an SNS Topic](https://docs.aws.amazon.com/sns/latest/dg/sns-getting-started.html#step-create-topic) * - [Creating an IAM Role](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html) */ val DASHES = String(CharArray(80)).replace("\u0000", "-") val TOPIC = "your-iot-topic" suspend fun main(args: Array<String>) { val usage = """ Usage: <roleARN> <snsAction> Where: roleARN - The ARN of an IAM role that has permission to work with AWS IOT. snsAction - An ARN of an SNS topic. """.trimIndent() if (args.size != 2) { println(usage) exitProcess(1) } var thingName: String val roleARN = args[0] val snsAction = args[1] val scanner = Scanner(System.`in`) println(DASHES) println("Welcome to the AWS IoT example scenario.") println( """ 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. It utilizes the AWS SDK for Kotlin and incorporates functionality for creating and managing IoT things, certificates, rules, shadows, and performing searches. The program aims to showcase AWS IoT capabilities and provides a comprehensive example for developers working with AWS IoT in a Kotlin environment. """.trimIndent() ) print("Press Enter to continue...") scanner.nextLine() println(DASHES) println(DASHES) println("1. Create an AWS IoT thing.") println( """ An AWS IoT thing represents a virtual entity in the AWS IoT service that can be associated with a physical device. """.trimIndent() ) // Prompt the user for input. print("Enter thing name: ") thingName = scanner.nextLine() createIoTThing(thingName) describeThing(thingName) println(DASHES) println(DASHES) println("2. Generate a device certificate.") println( """ A device certificate performs a role in securing the communication between devices (things) and the AWS IoT platform. """.trimIndent() ) print("Do you want to create a certificate for $thingName? (y/n)") val certAns = scanner.nextLine() var certificateArn: String? = "" if (certAns != null && certAns.trim { it <= ' ' }.equals("y", ignoreCase = true)) { certificateArn = createCertificate() println("Attach the certificate to the AWS IoT thing.") attachCertificateToThing(thingName, certificateArn) } else { println("A device certificate was not created.") } println(DASHES) println(DASHES) println("3. Update an AWS IoT thing with Attributes.") println( """ IoT thing attributes, represented as key-value pairs, offer a pivotal advantage in facilitating efficient data management and retrieval within the AWS IoT ecosystem. """.trimIndent() ) print("Press Enter to continue...") scanner.nextLine() updateThing(thingName) println(DASHES) println(DASHES) println("4. Return a unique endpoint specific to the Amazon Web Services account.") println( """ An IoT Endpoint refers to a specific URL or Uniform Resource Locator that serves as the entry point for communication between IoT devices and the AWS IoT service. """.trimIndent() ) print("Press Enter to continue...") scanner.nextLine() val endpointUrl = describeEndpoint() println(DASHES) println(DASHES) println("5. List your AWS IoT certificates") print("Press Enter to continue...") scanner.nextLine() if (certificateArn!!.isNotEmpty()) { listCertificates() } else { println("You did not create a certificates. Skipping this step.") } println(DASHES) println(DASHES) println("6. Create an IoT shadow that refers to a digital representation or virtual twin of a physical IoT device") println( """ A thing shadow refers to a feature that enables you to create a virtual representation, or "shadow," of a physical device or thing. The thing shadow allows you to synchronize and control the state of a device between the cloud and the device itself. and the AWS IoT service. For example, you can write and retrieve JSON data from a thing shadow. """.trimIndent() ) print("Press Enter to continue...") scanner.nextLine() updateShawdowThing(thingName) println(DASHES) println(DASHES) println("7. Write out the state information, in JSON format.") print("Press Enter to continue...") scanner.nextLine() getPayload(thingName) println(DASHES) println(DASHES) println("8. Creates a rule") println( """ Creates a rule that is an administrator-level action. Any user who has permission to create rules will be able to access data processed by the rule. """.trimIndent() ) print("Enter Rule name: ") val ruleName = scanner.nextLine() createIoTRule(roleARN, ruleName, snsAction) println(DASHES) println(DASHES) println("9. List your rules.") print("Press Enter to continue...") scanner.nextLine() listIoTRules() println(DASHES) println(DASHES) println("10. Search things using the name.") print("Press Enter to continue...") scanner.nextLine() val queryString = "thingName:$thingName" searchThings(queryString) println(DASHES) println(DASHES) if (certificateArn.length > 0) { print("Do you want to detach and delete the certificate for $thingName? (y/n)") val delAns = scanner.nextLine() if (delAns != null && delAns.trim { it <= ' ' }.equals("y", ignoreCase = true)) { println("11. You selected to detach amd delete the certificate.") print("Press Enter to continue...") scanner.nextLine() detachThingPrincipal(thingName, certificateArn) deleteCertificate(certificateArn) } else { println("11. You selected not to delete the certificate.") } } else { println("11. You did not create a certificate so there is nothing to delete.") } println(DASHES) println(DASHES) println("12. Delete the AWS IoT thing.") print("Do you want to delete the IoT thing? (y/n)") val delAns = scanner.nextLine() if (delAns != null && delAns.trim { it <= ' ' }.equals("y", ignoreCase = true)) { deleteIoTThing(thingName) } else { println("The IoT thing was not deleted.") } println(DASHES) println(DASHES) println("The AWS IoT workflow has successfully completed.") println(DASHES) } suspend fun deleteIoTThing(thingNameVal: String) { val deleteThingRequest = DeleteThingRequest { thingName = thingNameVal } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.deleteThing(deleteThingRequest) println("Deleted $thingNameVal") } } suspend fun deleteCertificate(certificateArn: String) { val certificateProviderRequest = DeleteCertificateRequest { certificateId = extractCertificateId(certificateArn) } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.deleteCertificate(certificateProviderRequest) println("$certificateArn was successfully deleted.") } } private fun extractCertificateId(certificateArn: String): String? { // Example ARN: arn:aws:iot:region:account-id:cert/certificate-id. val arnParts = certificateArn.split(":".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() val certificateIdPart = arnParts[arnParts.size - 1] return certificateIdPart.substring(certificateIdPart.lastIndexOf("/") + 1) } suspend fun detachThingPrincipal(thingNameVal: String, certificateArn: String) { val thingPrincipalRequest = DetachThingPrincipalRequest { principal = certificateArn thingName = thingNameVal } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.detachThingPrincipal(thingPrincipalRequest) println("$certificateArn was successfully removed from $thingNameVal") } } suspend fun searchThings(queryStringVal: String?) { val searchIndexRequest = SearchIndexRequest { queryString = queryStringVal } IotClient { region = "us-east-1" }.use { iotClient -> val searchIndexResponse = iotClient.searchIndex(searchIndexRequest) if (searchIndexResponse.things?.isEmpty() == true) { println("No things found.") } else { searchIndexResponse.things ?.forEach { thing -> println("Thing id found using search is ${thing.thingId}") } } } } suspend fun listIoTRules() { val listTopicRulesRequest = ListTopicRulesRequest {} IotClient { region = "us-east-1" }.use { iotClient -> val listTopicRulesResponse = iotClient.listTopicRules(listTopicRulesRequest) println("List of IoT rules:") val ruleList = listTopicRulesResponse.rules ruleList?.forEach { rule -> println("Rule name: ${rule.ruleName}") println("Rule ARN: ${rule.ruleArn}") println("--------------") } } } suspend fun createIoTRule(roleARNVal: String?, ruleNameVal: String?, action: String?) { val sqlVal = "SELECT * FROM '$TOPIC '" val action1 = SnsAction { targetArn = action roleArn = roleARNVal } val myAction = Action { sns = action1 } val topicRulePayloadVal = TopicRulePayload { sql = sqlVal actions = listOf(myAction) } val topicRuleRequest = CreateTopicRuleRequest { ruleName = ruleNameVal topicRulePayload = topicRulePayloadVal } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.createTopicRule(topicRuleRequest) println("IoT rule created successfully.") } } suspend fun getPayload(thingNameVal: String?) { val getThingShadowRequest = GetThingShadowRequest { thingName = thingNameVal } IotDataPlaneClient { region = "us-east-1" }.use { iotPlaneClient -> val getThingShadowResponse = iotPlaneClient.getThingShadow(getThingShadowRequest) val payload = getThingShadowResponse.payload val payloadString = payload?.let { java.lang.String(it, Charsets.UTF_8) } println("Received shadow data: $payloadString") } } suspend fun listCertificates() { IotClient { region = "us-east-1" }.use { iotClient -> val response = iotClient.listCertificates() val certList = response.certificates certList?.forEach { cert -> println("Cert id: ${cert.certificateId}") println("Cert Arn: ${cert.certificateArn}") } } } suspend fun describeEndpoint(): String? { val request = DescribeEndpointRequest {} IotClient { region = "us-east-1" }.use { iotClient -> val endpointResponse = iotClient.describeEndpoint(request) val endpointUrl: String? = endpointResponse.endpointAddress val exString: String = getValue(endpointUrl) val fullEndpoint = "https://$exString-ats.iot.us-east-1.amazonaws.com" println("Full endpoint URL: $fullEndpoint") return fullEndpoint } } private fun getValue(input: String?): String { // Define a regular expression pattern for extracting the subdomain. val pattern = Pattern.compile("^(.*?)\\.iot\\.us-east-1\\.amazonaws\\.com") // Match the pattern against the input string. val matcher = pattern.matcher(input) // Check if a match is found. if (matcher.find()) { val subdomain = matcher.group(1) println("Extracted subdomain: $subdomain") return subdomain } else { println("No match found") } return "" } suspend fun updateThing(thingNameVal: String?) { val newLocation = "Office" val newFirmwareVersion = "v2.0" val attMap: MutableMap<String, String> = HashMap() attMap["location"] = newLocation attMap["firmwareVersion"] = newFirmwareVersion val attributePayloadVal = AttributePayload { attributes = attMap } val updateThingRequest = UpdateThingRequest { thingName = thingNameVal attributePayload = attributePayloadVal } IotClient { region = "us-east-1" }.use { iotClient -> // Update the IoT thing attributes. iotClient.updateThing(updateThingRequest) println("$thingNameVal attributes updated successfully.") } } suspend fun updateShawdowThing(thingNameVal: String?) { // Create the thing shadow state document. val stateDocument = "{\"state\":{\"reported\":{\"temperature\":25, \"humidity\":50}}}" val byteStream: ByteStream = ByteStream.fromString(stateDocument) val byteArray: ByteArray = byteStream.toByteArray() val updateThingShadowRequest = UpdateThingShadowRequest { thingName = thingNameVal payload = byteArray } IotDataPlaneClient { region = "us-east-1" }.use { iotPlaneClient -> iotPlaneClient.updateThingShadow(updateThingShadowRequest) println("The thing shadow was updated successfully.") } } suspend fun attachCertificateToThing(thingNameVal: String?, certificateArn: String?) { val principalRequest = AttachThingPrincipalRequest { thingName = thingNameVal principal = certificateArn } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.attachThingPrincipal(principalRequest) println("Certificate attached to $thingNameVal successfully.") } } suspend fun describeThing(thingNameVal: String) { val thingRequest = DescribeThingRequest { thingName = thingNameVal } // Print Thing details. IotClient { region = "us-east-1" }.use { iotClient -> val describeResponse = iotClient.describeThing(thingRequest) println("Thing details:") println("Thing name: ${describeResponse.thingName}") println("Thing ARN: ${describeResponse.thingArn}") } } suspend fun createCertificate(): String? { IotClient { region = "us-east-1" }.use { iotClient -> val response = iotClient.createKeysAndCertificate() val certificatePem = response.certificatePem val certificateArn = response.certificateArn // Print the details. println("\nCertificate:") println(certificatePem) println("\nCertificate ARN:") println(certificateArn) return certificateArn } } suspend fun createIoTThing(thingNameVal: String) { val createThingRequest = CreateThingRequest { thingName = thingNameVal } IotClient { region = "us-east-1" }.use { iotClient -> iotClient.createThing(createThingRequest) println("Created $thingNameVal}") } }