引言
在现代物联网应用开发中,如何安全高效地管理设备是每个开发者面临的核心问题。本文将手把手教你如何通过华为云身份认证服务(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"}
}
}
}
关键参数获取途径:
-
登录华为云控制台,右上角点击“我的凭证”
-
在“API凭证”页面获取账号名、IAM用户名
-
在项目列表中查看项目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获取和设备管理方法也适用于华为云其他服务。