仓颉语言华为云开发指南:使用IAM Token调用IoTDA接口获取所有设备列表

引言

在现代物联网应用开发中,如何安全高效地管理设备是每个开发者面临的核心问题。本文将手把手教你如何通过华为云身份认证服务(IAM)获取访问令牌,并利用该令牌调用设备接入服务(IoTDA)的用户侧API获取所有设备列表,即类似下图的数据。

华为云认证机制简介

华为云服务采用统一的身份认证机制——所有API调用都需要通过IAM(Identity and Access Management)服务进行安全认证。这种机制通过颁发临时访问令牌(Token)来验证请求的合法性:

  • Token有效期24小时,建议缓存使用避免频繁获取

  • 通过向IAM服务发送特定请求获取Token

  • 调用其他云服务时需在请求头携带X-Auth-Token字段

获取IAM用户Token的方法

这是最通用的Token获取方式,适用于任何能发送HTTP请求的环境。其基本语法是这样的:

POST https://iam.{region}.myhuaweicloud.com/v3/auth/tokens
Content-Type: application/json

{
    "auth": {
        "identity": {
            "methods": ["password"],
            "password": {
                "user": {
                    "name": "您的IAM用户名",
                    "password": "您的IAM密码",
                    "domain": {"name": "主账号名"}
                }
            }
        },
        "scope": {
            "project": {"id": "项目ID"}
        }
    }
}

关键参数获取途径

  1. 登录华为云控制台,右上角点击“我的凭证”

  2. 在“API凭证”页面获取账号名、IAM用户名

  3. 在项目列表中查看项目ID

返回结果处理

  • 成功响应状态码为201 Created

  • Token值位于响应头的X-Subject-Token字段中

调用IoTDA设备API获取所有设备

获取Token后,即可调用设备接入服务(IoTDA)的用户侧API。其接口如下:

GET https://{endpoint}/v5/iot/{project_id}/devices
X-Auth-Token: {Token}
Content-Type: application/json

关键参数说明

  • endpoint:IoTDA服务的终端节点,根据区域不同而异(如iotda.cn-north-4.myhuaweicloud.com

  • project_id:项目ID,与获取Token时使用的相同

  • marker:分页标记,首次请求可省略

完整的仓颉代码

下面是完整的仓颉代码:

import net.http.*
import net.tls.*
import std.io.StringReader

func getToken(): String {
    let client = ClientBuilder().tlsConfig(TlsClientConfig()).build()
    var requestBuilder = HttpRequestBuilder()
    let request = requestBuilder
                   .method("POST")
                   .url("https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens")
                   .header("Content-Type", "application/json;charset=UTF-8")
                   .body("""
        {
          "auth": {
            "identity": {
              "methods": [
                "password"
              ],
              "password": {
                "user": {
                  "domain": {
                    "name": "您的主账号名" 
                  },
                  "name": "您的IAM用户名",
                  "password": "您的IAM密码"
                }
              }
            },
            "scope": {
              "project": {
                "id": "0658641e9f194e558ae67659f97af75b"
              }
            }
          }                   
        }
                   """)
                   .build()
    let resp = client.send(request)
    // println(resp)
    client.close()
    return resp.headers.get("x-subject-token").toArray()[0]
}

func startClient(): Unit {
    // 1. 构建 client 实例
    let client = ClientBuilder().tlsConfig(TlsClientConfig()).build()
    // 2. 获得token
    let token = getToken()
    // println(token)
    // 3. 发送请求
    var requestBuilder = HttpRequestBuilder()
    let request = requestBuilder
                   .method("GET")
                   .url("https://bde4cbe7aa.st1.iotda-app.cn-north-4.myhuaweicloud.com/v5/iot/0658641e9f194e558ae67659f97af75b/products")
                   .header("X-Auth-Token", token)
                   .build()
    let resp = client.send(request)
    // 4. 读取回应
    println(resp)
    StringReader(resp.body).readToEnd() |> println
    // 5. 关闭连接
    client.close()
}
 
main () {
    startClient()
}

程序执行后的输出如下:

 

HTTP/1.1 200 OK
date: Fri, 20 Jun 2025 12:49:14 GMT
content-type: application/json;charset=UTF-8
transfer-encoding: chunked
connection: keep-alive
server: elb

unknown body size


{"products":[{"app_id":"xxxxxx","app_name":"DefaultApp_65e1guco","product_id":"xxxxxxxx","name":"中控屏","device_type":"中控屏","protocol_type":"MQTT","data_format":"json","encoding_type":null,"manufacturer_name":null,"industry":null,"description":null,"create_time":"20250205T025326Z"},{"app_id":"xxxxxxxxx","app_name":"DefaultApp_65e1guco","product_id":"xxxxxxxxx","name":"restaurant","device_type":"restaurant","protocol_type":"MQTT","data_format":"json","encoding_type":null,"manufacturer_name":null,"industry":null,"description":null,"create_time":"20250201T141508Z"},{"app_id":"xxxxxxxxxx","app_name":"DefaultApp_65e1guco","product_id":"xxxxxxxxxxxxx","name":"LED灯","device_type":"家用灯具","protocol_type":"MQTT","data_format":"json","encoding_type":null,"manufacturer_name":null,"industry":"智能生活-电工照明","description":null,"create_time":"20241211T084033Z"},
…………
"page":{"count":6,"marker":"65e1cc4f2ccc1a58387a33f7"}}

从中我们可以看到所有设备的数据,就可以进行下一步的操作了。 

结束语

掌握华为云API调用是物联网开发的基石。本文介绍的Token获取和设备管理方法也适用于华为云其他服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

神一样的老师

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

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

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

打赏作者

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

抵扣说明:

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

余额充值