华为云:基于API Explorer调试IoT应用侧API
什么是API Explorer
华为云API Explorer为开发者提供一站式API解决方案统一平台,集成华为云服务所有开放 API,支持全量快速检索、可视化调试、帮助文档、代码示例等能力,帮助开发者快速查找、学习API和使用API开发代码。
实验目标与基本要求
通过本实验,您将能够掌握物联网平台应用侧API的调用方法及请求参数使用规范要求。
参考文档:https://lab.huaweicloud.com/testdetail_1815?ticket=ST-84578691-efAcPnbnSeLmRGCxYcMpusfT-sso
实验摘要
1. 登录华为云
2. 开通设备接入服务
3. 创建产品
4. 注册设备
5. 设备上报数据
6. 查询设备影子数据
7. 资源释放
实验步骤
登录华为云
进入【实验操作桌面】,打开Chrome浏览器,首次可自动登录并进入华为云控制台页面。
如后续关闭浏览器重新登录或自动登录失败,可按如此步骤登录:选择【IAM用户登录】模式,于登录对话框中输入系统为您分配的华为云实验账号和密码登录华为云,如下图所示:
注意:账号信息详见实验手册上方,切勿使用您自己的华为云账号登录。
开通设备接入服务
创建产品
1.为了方便后续多窗口同步操作,请新建浏览器标签页,访问API Explorer首页,链接:https://apiexplorer.developer.huaweicloud.com/apiexplorer/overview,搜索“iotda”打开“设备接入”产品
产品是什么?
在物联网平台中,某一类具有相同能力或特征的设备的合集被称为一款产品。您可为产品定义产品模型,产品模型用于描述设备具备的能力和特性。定义产品模型,即在物联网平台构建一款设备的抽象模型,使平台理解该款设备支持的服务、属性、命令等信息。
2. 选择“产品管理 > CreateProduct”,填写相关参数,创建名称为“MQTT_Smoke”的产品。
Tips:为了方便填写参数,可以勾选“只看必填项”,或将body切换为文本输入。
请求体示例如下:
其中,服务ID为sensor,两个属性alarm、smokeValue为整型值。
{ "name": "MQTT_Smoke", "device_type": "MQTT_Smoke", "protocol_type": "MQTT", "data_format": "json", "service_capabilities": [ { "service_id": "sensor", "service_type": "sensor", "properties": [ { "property_name": "alarm", "data_type": "int", "method": "RW" }, { "property_name": "smokeValue", "data_type": "int", "method": "RW" } ] } ] }
参数填写完成,单击“调试”发起请求。
此时可在调试结果右侧看到示例代码 及SDK的添加方法。
3. 请求成功,浏览器切换到控制台标签页,选择“服务列表”->“IoT物联网”->“设备接入IoTDA”,进入设备接入服务控制台,在左侧菜单栏选择“产品”,查看已创建的产品。
Tips:如果请求失败,请根据错误码排查修改请求参数后重试
4. 请记录产品ID,用于后续注册设备时使用。6450e15a4f1d680324501d2b
注册设备
1. 浏览器切换到API Explorer标签页,选择“设备管理 > AddDevice”,填写相关参数,创建一个设备。
Tips:为了方便填写参数,可以勾选“只看必填项”,或将body切换为文本输入。
请求体示例如下:
其中,“product_id”从创建产品成功返回的响应结果中获取,“node_id”为设备标识码,可以自定义填写一串字符串。
{ "node_id": "abc12345678", "product_id": "6450e15a4f1d680324501d2b" }
参数填写完成,单击“调试”发起请求。
3. 请求成功,浏览器切换到控制台标签页,进入设备接入服务控制台,在左侧菜单栏选择“设备 > 所有设备”,查看已注册成功的设备。
Tips:如果请求失败,请根据错误码排查修改请求参数后重试。
设备为“未激活”状态,如下图所示:
4. 请记录设备ID(device_id)和设备密钥(secret),用于后续设备上报数据配置连接参数时使用。
{ "app_id": "a9817d4ea29f4a499635f0a4269bb84e", "app_name": "DefaultApp_63d0wee0", "device_id": "6450e15a4f1d680324501d2b_abc12345678", "node_id": "abc12345678", "gateway_id": "6450e15a4f1d680324501d2b_abc12345678", "device_name": null, "node_type": "GATEWAY", "description": null, "fw_version": null, "sw_version": null, "device_sdk_version": null, "auth_info": { "auth_type": "SECRET", "secret": "52a6bf10bb5b93ffee841ca380918a2b", "fingerprint": null, "secure_access": false, "timeout": 0 }, "product_id": "6450e15a4f1d680324501d2b", "product_name": "MQTT_Smoke", "status": "INACTIVE", "create_time": "20230502T142651Z", "connection_status_update_time": null, "active_time": null, "tags": [], "extension_info": null }
设备上报数据
此部分主要参考了 https://support.huaweicloud.com/bestpractice-iothub/iot_bp_0222.html 及其相关网页。
下载设备模拟器
MQTT.fx是目前主流的MQTT客户端,可以快速验证是否可以与物联网平台服务交互发布或订阅消息。
https://softblade.de/download/
下载MQTT.fx(默认是64位操作系统,如果是32位操作系统,单击此处下载MQTT.fx),安装MQTT.fx工具。
https://iotda-document.obs.cn-north-4.myhuaweicloud.com/mqttfx-1.7.1-windows-x64.exe
连接鉴权
参考连接鉴权接口文档,使用MQTT.fx工具接入物联网平台。
访问这里(https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/ ),填写注册设备后生成的设备ID(DeviceId)和密钥(DeviceSecret),生成连接信息(ClientId、Username、Password)。
ClientID: 6450e15a4f1d680324501d2b_abc12345678_0_0_2023050306 UserName: 6450e15a4f1d680324501d2b_abc12345678 Password: f72090a973717128d19d76e6a4a1a3b38989278275be2e5109dc14612e2302a1
设备通过MQTT协议的connect消息进行鉴权,对于构造clientId的各个部分信息都必须包括进去,平台收到connect消息时,会判断设备的鉴权类型和密码摘要算法。
使用生成工具生成的clientId格式,默认不校验时间戳:设备ID_0_0_时间戳。
- 当采用“HMACSHA256”校验时间戳方式时,会先校验消息时间戳与平台时间是否一致,再判断密码是否正确。
- 当采用“HMACSHA256”不校验时间戳方式时,鉴权消息也必须带时间戳,但不检验时间是否准确,仅判断密码是否正确。
connect消息鉴权失败时,平台会返回错误,并自动断开MQTT链路。
打开MQTT.fx软件,单击设置图标。
参考下表配置鉴权参数,然后单击“Apply”。
参数名称 说明 Broker Address 填写从设备接入服务控制台获取的设备对接地址,此地址为域名信息。不能通过域名接入的设备,此处可从设备接入IOT ->总览 ->接入信息中查阅地址,形如: eb73c2afd5.st1.iotda-device.cn-north-4.myhuaweicloud.com Broker Port 默认为1883。 Cliend ID 设备cliendID,请参考2中获取。 User Name 即设备ID,请参考2中获取。 Password 加密后的设备密钥,请参考2中获取。
注:如果您选择安全方式接入,Broker Port设置为8883,下载并获取证书,加载Java语言pem格式的证书。
获取域名的方法:
单击“Connect”,设备鉴权成功后,在物联网平台“所有设备”界面可以看到设备处于在线状态。
参考文档:
使用MQTT模拟器连接到平台(模拟器使用请参考:使用MQTT.fx调测)。https://support.huaweicloud.com/devg-iothub/iot_01_2127.html
使用模拟器进行属性上报(参考:设备属性上报)。https://support.huaweicloud.com/api-iothub/iot_06_v5_3010.html
上报数据
参考设备属性上报接口文档,使用MQTT.fx工具向物联网平台上报数据。
设备若通过MQTT通道上报数据,需要发给指定的Topic,上报消息的Topic格式为:“$oc/devices/{device_id}/sys/properties/report”,其中“deviceId”的值,对一机一密设备,使用deviceId接入时填写为设备注册成功后返回的“deviceId”值,QoS推荐选择0或者1。
填写接口地址,此处以“$oc/devices/{device_id}/sys/properties/report”为例,如“$oc/devices/5e4e2e92ac-164aefa8fouquan1/sys/properties/report”。
填写上报的数据。
请求参数
字段名 必选/可选 类型 参数描述 services 必选 List<ServiceProperty> 设备服务数据列表(具体结构参考下表ServiceProperty定义表)
ServiceProperty定义表:
字段名 必选/可选 类型 参数描述 service_id 必选 String 设备服务的ID。 properties 必选 Object 设备服务的属性列表,具体字段在设备关联的产品模型中定义。 event_time 可选 String 设备采集数据UTC时间(格式:yyyyMMddTHHmmssZ),如:20161219T114920Z。设备上报数据不带该参数或参数格式错误时,则数据上报时间以平台时间为准。
请求示例
{ "services" : [{ "service_id" : "sensor", "properties" : { "alarm" : 1, "smokeValue" : 1 }, "event_time" : null } ] }
单击“Publish”,可以在物联网平台设备详情界面上查看设备是否成功上报数据
查询设备影子数据
1. 浏览器切换到API Explorer标签页,选择“设备影子 > ShowDeviceShadow”,填写相关参数,查询设备属性。
Tips:为了方便填写参数,可以勾选“只看必填项”。
请求体为空,“device_id”填写为待查询设备的设备ID。
参数填写完成,单击“调试”发起请求。
2. 请求成功,查看请求结果,响应体示例如下:
Tips:如果请求失败,请根据错误码排查修改请求参数后重试。
{ "device_id": "6450e15a4f1d680324501d2b_abc12345678", "shadow": [ { "service_id": "sensor", "desired": { "properties": null, "event_time": null }, "reported": { "properties": { "alarm": 1, "smokeValue": 0 }, "event_time": "20230503T134054Z" }, "version": 2 } ] }
资源释放
删除设备
删除产品
AK/SK签名认证操作指导
https://support.huaweicloud.com/devg-apisign/api-sign-provide.html
AK/SK签名认证操作流程如下:
API调用信息收集。需要获取以下信息,包括:
- 用于组成请求URL的Endpoint和URI。
- 用于签名和认证的AK/SK。
- 用于区分租户的项目ID、子项目ID。
- 用于区分租户的帐号名、帐号ID。
Endpoint 地区与终端节点,即云服务在不同Region有不同的访问域名。 获取方式请参考获取EndPoint。 URI API接口的调用路径及参数。 请参考各云服务的详细接口章节获取。 AK/SK 访问密钥对,包含密钥ID与密钥。AK/SK用于对请求内容进行签名。 获取方式请参考获取AK/SK。 Project_Id 项目ID,在大多数API接口调用时需要配置在URI中,用以识别不同的项目。 获取方式请参考获取项目ID。 X-Project-Id 子项目ID,在多项目场景中使用。如果云服务资源创建在子项目中,AK/SK认证方式下,操作该资源的接口调用需要在请求消息头中携带X-Project-Id。 获取方式请参考获取项目ID。 X-Domain-Id 帐号ID,用途: Token认证方式下获取Token。 AK/SK认证方式下,全局服务的接口调用,需在请求消息头中配置X-Domain-Id。(全局服务:服务部署时不区分物理区域。如OBS、CDN等。) 获取方式请参考获取帐号名和帐号ID。
获取EndPoint
地区与终端节点,即云服务在不同Region有不同的访问域名。
获取方式请参考地区和终端节点。https://developer.huaweicloud.com/endpoint
以物联网为例,查询得到端点:iotda.cn-north-4.myhuaweicloud.com
获取AK/SK
果已生成过AK/SK,则可跳过此步骤,找到原来已下载的AK/SK文件,文件名一般为:credentials.csv。
如下图所示,AK(Access Key Id),SK(Secret Access Key)。
API网关:https://support.huaweicloud.com/usermanual-apig/apig_03_0001.html#apig_03_0001__section1785154313414
登录API网关新版控制台
登录华为云,在右上角单击“控制台”。
将鼠标移至左侧图标展开服务列表,输入“apig”搜索。
单击搜索结果,进入API网关控制台
获取访问密钥
登录API网关控制台。
将鼠标移至用户名,在下拉列表中单击“我的凭证”。
单击“访问密钥”。
单击“新增访问密钥”,进入“新增访问密钥”页面。
输入描述信息,单击“确定”,下载密钥,请妥善保管。
hw_008613789818620_01
WXHHR6UA1GGTJCATEJIM
XkRR2SFQ1lFIxeoSaE4DEQWhJOGKAr5Npgozm1RA
获取项目ID
在调用接口的时候,部分URL中需要填入项目编号,获取token时,同样需要获取项目编号,所以需要先在管理控制台上获取到项目编号。项目编号获取步骤如下:
登录API网关控制台。
将鼠标移至用户名,在下拉列表中单击“我的凭证”,查看“项目ID”。
项目用于对云服务器资源进行物理隔离,默认有region级别的隔离,也可在Region下建立多项目,做更细级别的隔离。因此,请参考下图,在右侧列表中找到您的服务器资源对应的Region(所属区域),在其左侧列表中获取项目ID。
0e51d3518780f5442f8ec011e5341a19
获取账号名和账号ID
在调用接口的时候,部分URL中需要填入帐号名和帐号ID,所以需要先在管理控制台上获取到帐号名和帐号ID。帐号名和帐号ID获取步骤如下:
登录API网关控制台。
将鼠标移至用户名,在下拉列表中单击“我的凭证”。
查看帐号名和帐号ID。
图1 查看帐号名和帐号ID,
签名SDK与demo
准备环境
pip install requests
下载示例demo
https://obs.cn-north-1.myhuaweicloud.com/apig-sdk/APIGW-python-sdk.zip
客户端远程连接
python
以下代码截取自https://console.huaweicloud.com/apiexplorer/#/openapi/IoTDA/sdk?api=ShowDeviceShadow
import http.client conn = http.client.HTTPSConnection("iotda.cn-north-4.myhuaweicloud.com") payload = '' headers = { 'Authorization': '<Your signed string>' } conn.request("GET", "/v5/iot/0e51d3518780f5442f8ec011e5341a19/devices/{device_id}/shadow", payload, headers) res = conn.getresponse() data = res.read() print(data.decode("utf-8"))