华为云用户手册

  • 字符串及可变长字符串的编解码插件 如果该烟感设备需要支持描述信息上报功能,描述信息支持字符串和可变长度字符串两种类型,则按照以下步骤创建消息。 产品模型定义 重新创建一个烟感产品,并在烟感产品的开发空间完成产品模型定义。 图20 模型定义-smokerdetector携带other_info 编解码插件开发 在烟感产品的开发空间,选择“插件开发”,单击“图形化开发”。 单击“新增消息”,新增消息“other_info”,上报字符串类型的描述信息。配置此步骤的主要目的是,将设备上传的字符串二进制码流消息解码成JSON格式,以便物联网平台理解。配置示例如下: 消息名:other_info 消息类型:数据上报 添加响应字段:是。添加响应字段后,物联网平台在收到设备上报的数据后,会下发用户设置的响应数据到设备。 响应数据:AAAA0000(默认) 图21 插件开发-新增消息other_info 单击“添加字段”,添加messageId字段,表示消息种类。在本场景中,0x0用于标识上报火灾等级和温度的消息,0x1用于标识只上报温度的消息,0x2用于标识上报描述信息(字符串类型)的消息。messageId、数据类型、长度、默认值、偏移值的说明可参考1。 图22 插件开发-添加字段messageId(0x2) 添加other_info字段,表示字符串类型的描述信息。在本场景中,字符串类型的字段数据类型选择“string”,“长度”配置 6个字节。字段名、默认值、偏移值的说明可参考2。 图23 插件开发-添加字段other_info 单击“新增消息”,新增“other_info2”消息名,配置数据上报消息,上报可变长度字符串类型的描述信息。配置此步骤的主要目的是,将设备上传的可变长度字符串二进制码流消息解码成JSON格式,以便物联网平台理解。配置示例如下: 消息名:other_info2 消息类型:数据上报 添加响应字段:是。添加响应字段后,物联网平台在收到设备上报的数据后,会下发用户设置的响应数据到设备。 响应数据:AAAA0000(默认) 图24 插件开发-新增消息other_info2 添加messageId字段,表示消息种类。在本场景中,0x0用于标识上报火灾等级和温度的消息,0x1用于标识只上报温度的消息,0x3用于标识上报描述信息(可变长度字符串类型)的消息。messageId、数据类型、长度、默认值、偏移值的说明可参考1。 图25 插件开发-添加字段messageId(0x3) 添加length字段,表示可变字符串长度。“数据类型”根据可变长度字符串的长度进行配置,此场景可变字符串长度在255以内,配置为“int8u”。长度、默认值、偏移值的说明可参考2。 图26 插件开发-添加字段length 添加other_info字段,数据类型选择“varstring”,表示可变长度字符串类型的描述信息。“长度关联字段”选择“length”,表示当前可变长字符串的长度由上报的length的值决定。“掩码”默认为“0xff”,用来计算该字段实际生效的长度,例如:“长度关联字段”length的值为5,其对应的二进制为:00000101,此时若掩码为0xff,对应的二进制为:11111111,那么两者进行“与“运算之后的结果为00000101,即十进制的5,那么该字段实际生效的长度为5个字节。如上报数据为03051234567890,表示当前上报的数据对应的是messageId为03的的message,可变长字符串长度为5个字节,可变长参数other_info对应的码流为1234567890。 图27 插件开发-添加字段other_info为varstring 拖动右侧“设备模型”区域的属性字段,与数据上报消息的相应字段建立映射关系。 单击“保存”,并在插件保存成功后单击“部署”,将编解码插件部署到物联网平台。 图28 插件开发-部署插件 调测编解码插件 在烟感产品的开发空间,选择“在线调试”,并单击“新增测试设备”。 用户可根据自己的业务场景,选择使用真实设备或者模拟设备进行调测。具体调测步骤请参考在线调试。本文以模拟设备为例,调测编解码插件。 在弹出的“新增测试设备”窗口,选择“虚拟设备”,单击“确定”,创建一个虚拟设备。虚拟设备名称包含 “Simulator”字样,每款产品下只能创建一个虚拟设备。 图29 在线调试-创建虚拟设备 单击“调试”,进入调试界面。 图30 在线调试-进入调试 使用设备模拟器上报字符串类型的描述信息。 十六进制码流示例:0231。02表示messageId,此消息上报字符串类型的描述信息;31表示描述信息,长度为1个字节。 在“应用模拟器”区域查看数据上报的结果:{other_info=null}。描述信息不足6个字节,编解码插件无法解析。 图31 在线调试-模拟数据上报other_info长度不足 十六进制码流示例:02313233343536。02表示messageId,此消息上报字符串类型的描述信息;313233343536表示描述信息,长度为6个字节。 在“应用模拟器”区域查看数据上报的结果:{other_info=123456}。描述信息长度为6个字节,编解码插件解析成功。 图32 在线调试-模拟数据上报other_info长度合适 十六进制码流示例:023132333435363738。02表示messageId,此消息上报字符串类型的描述信息;3132333435363738表示描述信息,长度为8个字节。 在“应用模拟器”区域查看数据上报的结果:{other_info=123456}。描述信息长度超过6个字节,编解码插件截取前6个字节进行解析。 图33 在线调试-模拟数据上报other_info长度过长 十六进制码流示例:02013132333435。02表示messageId,此消息上报字符串类型的描述信息;013132333435表示描述信息,长度为6个字节。 在“应用模拟器”区域查看数据上报的结果:{other_info=\u000112345}。01在ASCII码表里表示“标题开始”,无法用具体字符表示,因此编解码插件解析为\u0001。 图34 在线调试-模拟数据上报other_info ASCII码 使用设备模拟器上报可变长度字符串类型的描述信息。 十六进制码流示例:030141。03表示messageId,此消息上报可变长度字符串类型的描述信息;01表示描述信息长度;41表示描述信息,长度为1个字节。 在“应用模拟器”区域查看数据上报的结果:{other_info=A}。41是A的十六进制ASCII码。 图35 在线调试-模拟数据上报other_info可变长字符串1 十六进制码流示例:03024142。03表示messageId,此消息上报可变长度字符串类型的描述信息;02表示描述信息的长度;4142表示描述信息,长度为2个字节。 在“应用模拟器”区域查看数据上报的结果:{other_info=AB}。4142是AB的十六进制ASCII码。 图36 在线调试-模拟数据上报other_info可变长字符串2 十六进制码流示例:030341424344。03表示messageId,此消息上报可变长度字符串类型的描述信息;03表示描述信息长度;41424344表示描述信息,长度为4个字节。 在“应用模拟器”区域查看数据上报的结果:{other_info=ABC}。描述信息长度超过3个字节,编解码插件截取前3个字节进行解析,414243是ABC的十六进制ASCII码。 图37 在线调试-模拟数据上报other_info可变长字符串3 十六进制码流示例:0304414243。03表示messageId,此消息上报可变长度字符串类型的描述信息;04表示字符串长度;414243表示描述信息,长度为4个字节。 在“应用模拟器”区域查看数据上报的结果:{other_info=null}。描述信息长度不足4个字节,编解码插件解析失败。 图38 在线调试-模拟数据上报other_info可变长字符串4 总结 当数据类型为字符串或可变长度字符串时,插件是按照ASCII码进行编解码的:上报数据时,将16进制码流解码为对应字符串,比如:21解析为“!”、31解析为“1”、41解析为“A”;下发命令时,将字符串编码对应的16进制码流,比如:“!”编码为21,“1”编码为31,“A”编码为41。 当某字段的数据类型为可变长度字符串时,该字段需要关联长度字段,长度字段的数据类型必须为int。 针对可变长度字符串,命令下发和数据上报的编解码插件开发方式相同。 图形化开发的编解码插件使用ASCII码16进制的标准表对字符串和可变长度字符串进行编解码。解码时(数据上报),如果解析结果无法使用具体字符表示,如:标题开始、正文开始、正文结束等,则使用\u+2字节码流值表示(例如:01解析为\u0001,02解析为\u0002);如果解析结果可以使用具体字符表示,则使用具体字符。
  • 数据上报和命令下发 场景说明 有一款烟感设备,具有如下特征: 具有烟雾报警功能(火灾等级)和温度上报功能。 支持远程控制命令,可远程打开报警功能。比如火灾现场温度,远程打开烟雾报警,提醒住户疏散。 支持上报命令执行结果。 产品模型定义 在烟感产品的开发空间,完成产品模型定义。 level:火灾级别,用于表示火灾的严重程度。 temperature:温度,用于表示火灾现场温度。 SET_ALARM:打开或关闭告警命令,value=0表示关闭,value=1表示打开。 图1 模型定义-smokerdetector 编解码插件开发 在烟感产品的开发空间,选择“插件开发”,单击“图形化开发”。 单击“新增消息”,新增“smokerinfo”消息。配置此步骤的主要目的是,将设备上传的二进制码流消息解码成JSON格式,以便物联网平台理解。配置示例如下: 消息名:smokerinfo 消息类型:数据上报。 添加响应字段:是。添加响应字段后,物联网平台在收到设备上报的数据后,会下发用户设置的响应数据到设备。 响应数据:AAAA0000(默认) 图2 插件开发-新增消息smokerinfo 单击“添加字段”,勾选“标记为地址域”,添加messageId字段,表示消息类型。在本场景中,上报火灾等级和温度的消息类型是0x0。设备上报消息时,每条消息首个字段就是messageId。如设备上报消息为0001013A,第一个字段00就是表示此条消息是上报火灾级别和温度的消息。后续字段01和013A分别代表火灾级别和温度。如果只有一条数据上报消息和一条命令下发消息,可以不添加messageId字段。 “数据类型”根据数据上报消息种类的数量进行配置。messageId字段默认的数据类型为int8u。 “偏移值”是根据字段位置和字段的字节数的配置自动填充的。messageId为此消息的第一个字段,起始位置为0,字节长度为1,终点位置为1。所以偏移值为0-1。 “长度”是根据“数据类型”的配置自动填充的。 “默认值”可以修改,但必须为十六进制格式,且设备数据上报消息的对应字段必须和此处的默认值保持一致。 图3 插件开发-添加字段messageId 添加level字段,表示火灾级别。 “字段名”只能输入包含字母、数字、_和$,且不能以数字开头的字符。 “数据类型”根据设备上报数据的实际情况进行配置,需要和产品模型相应字段的定义相匹配。产品模型中定义的火灾级别level属性的数据类型为int,最大值为9。所以选择的数据类型为int8u。 “偏移值”是根据字段位置和字段的字节数的配置自动填充的。“level”字段的起始位置就是前一字段的终点,前一字段“messageId”的终点位置为1,所以“level”字段的起始位置为1。“level”字段长度为1个字节,终点为2。所以“偏移值”为1-2。 “长度”根据“数据类型”的配置自动填充。 “默认值”不填。此处火灾级别level不固定,无默认值。 图4 插件开发-添加字段level 添加temperature字段,表示温度。 “数据类型”,在产品模型中,temperature属性的“数据类型”为int,最大值1000,因此在插件中定义temperature字段的“数据类型”为“int16u”,以满足temperature属性的取值范围。 “偏移值”是根据与首字段的间隔的字符数自动配置的。“temperature”字段的起始位置就是前一字段的终点,前一字段“level”的终点位置为2,所以“temperature”字段的起始位置为2。“temperature”字段长度为2个字节,终点为4。所以“偏移值”为2-4。 “长度”根据数据类型的配置自动填充。 “默认值”不填,此处温度temperature的值不固定,无默认值。 图5 插件开发-添加字段temperature 单击“新增消息”,新增“SET_ALARM”消息,设置火灾告警的温度阈值。例如超过60摄氏度,设备上报告警。配置此步骤的主要目的是,将平台下发的JSON格式命令消息编码成二进制数据,以便烟感设备理解。配置示例如下: 消息名:SET_ALARM 消息类型:命令下发 添加响应字段:是。添加响应字段后,设备在接收命令后,可以上报命令执行结果。您可以根据自己的需求,选择是否添加响应字段。 图6 插件开发-新增消息SET_ALARM 单击“添加字段”,添加messageId字段,表示消息类型。例如,设置火灾告警阈值的消息类型为0x3。messageId、数据类型、长度、默认值、偏移值的说明可参考1。 图7 插件开发-添加命令字段messageId(0x3) 添加mid字段。这里的mid字段是由平台生成和下发的,用于将下发的命令和命令下发响应消息关联。mid字段的数据类型默认为int16u。长度、默认值、偏移值的说明可参考2。 图8 插件开发-添加命令字段mid 添加value字段,表示下发命令的参数值。例如,下发火灾告警的温度阈值。数据类型、长度、默认值、偏移值的说明可以参考2。 图9 插件开发-添加命令字段value 单击“添加响应字段”,添加“messageId”字段,表示消息类型。命令下发响应消息为上行消息,需要通过messageId和数据上报消息进行区分。上报火灾告警温度阈值的消息类型为0x4。messageId、数据类型、长度、默认值、偏移值的说明可参考1。 图10 插件开发-添加响应字段messageId(0x4) 添加mid字段。这里的mid字段需要跟平台下发的命令里的mid字段保持一致,用于将下发的命令和命令执行结果进行关联。mid字段的数据类型默认为int16u。长度、默认值、偏移值的说明可参考2。 图11 插件开发-添加响应字段mid 添加errcode字段,用于表示命令执行状态:00表示成功,01表示失败,如果未携带该字段,则默认命令执行成功。errcode字段的数据类型默认为int8u。长度、默认值、偏移值的说明可参考2。 图12 插件开发-添加响应字段errcode 添加result字段,用于表示命令执行结果。例如,设备向平台返回当前的告警阈值。 图13 插件开发-添加响应字段result 拖动右侧“设备模型”区域的属性字段和命令字段,数据上报消息和命令下发消息的相应字段建立映射关系。 图14 插件开发-在线开发插件smokerdetector 单击“保存”,并在插件保存成功后单击“部署”,将编解码插件部署到物联网平台。 图15 插件开发-部署插件 调测编解码插件 在烟感产品的开发空间,选择“在线调试”,并单击“新增测试设备”。 用户可根据自己的业务场景,选择使用真实设备或者模拟设备进行调测。具体调测步骤请参考在线调试。本文以模拟设备为例,调测编解码插件。 在弹出的“新增测试设备”窗口,选择“虚拟设备”,单击“确定”,创建一个虚拟设备。虚拟设备名称包含 “Simulator”字样,每款产品下只能创建一个虚拟设备。 图16 在线调试-创建虚拟设备 单击“调试”,进入调试界面。 图17 在线调试-进入调试 使用设备模拟器进行数据上报。十六进制码流示例:0008016B。00为地址域messageId,08表示火灾级别level,长度为1个字节;016B表示温度,长度为2个字节。 在“应用模拟器”区域查看数据上报的结果:{level=8, temperature=363}。8为十六进制数08转换为十进制的数值;363为十六进制数016B转换为十进制的数值。 在设备模拟器区域看到平台下发的响应数据AAAA0000。 图18 在线调试-模拟数据上报smokerdetector 使用应用模拟器进行命令下发,输入value值为1,可看到应用模拟下发命令{ "serviceId": "Smokeinfo", "method": "SET_ALARM", "paras": "{\"value\":1}" }。 在“设备模拟器”区域查看命令接收的结果:03000101。03为地址域messageId,0001为mid字段,01为十进制数1转换为十六进制的数值。 图19 在线调试-模拟命令下发smokerdetector 使用CoAP的虚拟设备在线调试时,若下发命令后设备模拟器未接收到对应的命令,可以先上报一次属性后,再下发。 总结 如果插件需要对命令执行结果进行解析,则必须在命令和命令响应中定义mid字段。 命令下发的mid是2个字节,对于每个设备来说,mid从1递增到65535,对应码流为0001到FFFF。 设备执行完命令,命令执行结果上报中的mid要与收到命令中的mid保持一致,这样平台才能刷新对应命令的状态。
  • 如何开发网关 网关是一个特殊的设备,除具备一般设备功能之外,还具有子设备管理、子设备消息转发的功能。SDK提供了AbstractGateway抽象类来简化网关的实现。该类提供了子设备管理功能,需要从平台获取子设备信息并保存(需要子类提供子设备持久化接口)、子设备下行消息转发功能(需要子类实现转发处理接口)、以及上报子设备列表、上报子设备属性、上报子设备状态、上报子设备消息等接口。 使用AbstractGateway类 继承该类,在构造函数里提供子设备信息持久化接口,实现其下行消息转发的抽象接口: 1 2 3 4 5 6 7 public abstract void onSubdevCommand(String requestId, Command command); public abstract void onSubdevPropertiesSet(String requestId, PropsSet propsSet); public abstract void onSubdevPropertiesGet(String requestId, PropsGet propsGet); public abstract void onSubdevMessage(DeviceMessage message); iot-gateway-demo代码介绍 工程iot-gateway-demo基于AbstractGateway实现了一个简单的网关,它提供tcp设备接入能力。关键类: SimpleGateway:继承自AbstractGateway,实现子设备管理和下行消息转发 StringTcpServer:基于netty实现一个TCP server,本例中子设备采用TCP协议,并且首条消息为鉴权消息 SubDevicesFilePersistence:子设备信息持久化,采用json文件来保存子设备信息,并在内存中做了缓存 Session:设备会话类,保存了设备id和TCP的channel的对应关系 SimpleGateway类 添加或删除子设备处理 添加子设备:AbstractGateway的onAddSubDevices接口已经完成了子设备信息的保存。我们不需要再增加额外处理,因此SimpleGateway不需要重写onAddSubDevices接口 删除子设备:我们不仅需要修改持久化信息,还需要断开当前子设备的连接。所以我们重写了onDeleteSubDevices接口,增加了拆链处理,然后调用父类的onDeleteSubDevices。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Override public int onDeleteSubDevices(SubDevicesInfo subDevicesInfo) { for (DeviceInfo subdevice : subDevicesInfo.getDevices()) { Session session = nodeIdToSesseionMap.get(subdevice.getNodeId()); if (session != null) { if (session.getChannel() != null) { session.getChannel().close(); channelIdToSessionMap.remove(session.getChannel().id().asLongText()); nodeIdToSesseionMap.remove(session.getNodeId()); } } } return super.onDeleteSubDevices(subDevicesInfo); } 下行消息处理 网关收到平台下行消息时,需要转发给子设备。平台下行消息分为三种:设备消息、属性读写、命令。 设备消息:这里我们需要根据deviceId获取nodeId,从而获取session,从session里获取channel,就可以往channel发送消息。在转发消息时,可以根据需要进行一定的转换处理。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 @Override public void onSubdevMessage(DeviceMessage message) { //平台接口带的都是deviceId,deviceId是由nodeId和productId拼装生成的,即 //deviceId = productId_nodeId String nodeId = IotUtil.getNodeIdFromDeviceId(message.getDeviceId()); if (nodeId == null) { return; } //通过nodeId获取session,进一步获取channel Session session = nodeIdToSesseionMap.get(nodeId); if (session == null) { log.error("subdev is not connected " + nodeId); return; } if (session.getChannel() == null){ log.error("channel is null " + nodeId); return; } //直接把消息转发给子设备 session.getChannel().writeAndFlush(message.getContent()); log.info("writeAndFlush " + message); } 属性读写: 属性读写包括属性设置和属性查询。 属性设置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 @Override public void onSubdevPropertiesSet(String requestId, PropsSet propsSet) { if (propsSet.getDeviceId() == null) { return; } String nodeId = IotUtil.getNodeIdFromDeviceId(propsSet.getDeviceId()); if (nodeId == null) { return; } Session session = nodeIdToSesseionMap.get(nodeId); if (session == null) { return; } //这里我们直接把对象转成string发给子设备,实际场景中可能需要进行一定的编解码转换 session.getChannel().writeAndFlush(JsonUtil.convertObject2String(propsSet)); //为了简化处理,我们在这里直接回响应。更合理做法是在子设备处理完后再回响应 getClient().respondPropsSet(requestId, IotResult.SUCCESS); log.info("writeAndFlush " + propsSet); } 属性查询: 1 2 3 4 5 6 7 @Override public void onSubdevPropertiesGet(String requestId, PropsGet propsGet) { //不建议平台直接读子设备的属性,这里直接返回失败 log.error("not supporte onSubdevPropertiesGet"); deviceClient.respondPropsSet(requestId, IotResult.FAIL); } 命令:处理流程和消息类似,实际场景中可能需要不同的编解码转换。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 @Override public void onSubdevCommand(String requestId, Command command) { if (command.getDeviceId() == null) { return; } String nodeId = IotUtil.getNodeIdFromDeviceId(command.getDeviceId()); if (nodeId == null) { return; } Session session = nodeIdToSesseionMap.get(nodeId); if (session == null) { return; } //这里我们直接把command对象转成string发给子设备,实际场景中可能需要进行一定的编解码转换 session.getChannel().writeAndFlush(JsonUtil.convertObject2String(command)); //为了简化处理,我们在这里直接回命令响应。更合理做法是在子设备处理完后再回响应 getClient().respondCommand(requestId, new CommandRsp(0)); log.info("writeAndFlush " + command); } 上行消息处理 上行处理在StringTcpServer的channelRead0接口里。如果会话不存在,需要先创建会话: 如果子设备信息不存在,这里会创建会话失败,直接拒绝连接 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 @Override protected void channelRead0(ChannelHandlerContext ctx, String s) throws Exception { Channel incoming = ctx.channel(); log.info("channelRead0" + incoming.remoteAddress() + " msg :" + s); //如果是首条消息,创建session //如果是首条消息,创建session Session session = simpleGateway.getSessionByChannel(incoming.id().asLongText()); if (session == null) { String nodeId = s; session = simpleGateway.createSession(nodeId, incoming); //创建会话失败,拒绝连接 if (session == null) { log.info("close channel"); ctx.close(); } } 如果会话存在,则进行消息转发: 1 2 3 4 5 6 7 else { //如果需要上报属性则调用reportSubDeviceProperties DeviceMessage deviceMessage = new DeviceMessage(s); deviceMessage.setDeviceId(session.getDeviceId()); simpleGateway.reportSubDeviceMessage(deviceMessage, null); } 到这里,网关的关键代码介绍完了,其他的部分看源代码。整个demo是开源的,用户可以根据需要进行扩展。比如修改持久化方式、转发中增加消息格式的转换、实现其他子设备接入协议。 iot-gateway-demo的使用 创建子设备的产品,步骤可参考创建产品。 在创建的产品中定义模型,添加服务,服务ID为parameter。并且新增alarm和temperature两个属性,如下图所示 图8 模型定义-子设备产品 修改StringTcpServer的main函数,替换构造参数,然后运行该类。 1 2 3 simpleGateway = new SimpleGateway(new SubDevicesFilePersistence(), "ssl://iot-acc.cn-north-4.myhuaweicloud.com:8883", "5e06bfee334dd4f33759f5b3_demo", "mysecret"); 在平台上看到该网关在线后,添加子设备。 图9 设备-添加子设备 表1 子设备参数 参数描述 所属产品 子设备所属的产品,选择步骤1创建的产品。 设备名称 即device_name,可自定义,如subdev_name 设备标识码 即node_id,填写subdev。 设备ID 即devicee_id,可不填写,自动生成。 此时网关上日志打印: 2024-04-16 21:00:01 INFO SubDevicesFilePersistence:112 - add subdev, the nodeId is subdev 运行TcpDevice类,建立连接后,输入步骤3中注册的子设备的nodeId,如subdev。 图10 子设备连接 此时网关设备日志打印: 2024-04-16 21:00:54 INFO StringTcpServer:196 - initChannel: /127.0.0.1:21889 2024-04-16 21:01:00 INFO StringTcpServer:137 - channelRead0 is /127.0.0.1:21889, the msg is subdev 2024-04-16 21:01:00 INFO SimpleGateway:100 - create new session ok, the session is Session{nodeId='subdev', channel=[id: 0xf9b89f78, L:/127.0.0.1:8080 - R:/127.0.0.1:21889], deviceId='subdev_deviceId'} 在平台上看到子设备上线。 图11 设备列表-设备在线 子设备上报消息 图12 子设备上报消息 查看日志看到上报成功 2024-04-16 21:02:36 INFO StringTcpServer:137 - channelRead0 is /127.0.0.1:21889, the msg is hello 2024-04-16 21:02:36 INFO MqttConnection:299 - publish message topic is $oc/devices/5e06bfee334dd4f33759f5b3_demo/sys/messages/up, msg = {"name":null,"id":null,"content":"hello","object_device_id":"subdev_deviceId"] 2024-04-16 21:02:36 INFO MqttConnection:299 - publish message topic is $oc/devices/5e06bfee334dd4f33759f5b3_demo/sys/gateway/sub_devices/properties/report, msg = {"devices":[{"services":[{"properties":{"temprature":2,"alarm":1},"service_id":"parameter","event_time":null}],"device_id":"subdev_deviceId"}]] 查看消息跟踪 在平台上找到网关,选择 设备详情-消息跟踪,打开消息跟踪。继续让子设备发送数据,等待片刻后看到消息跟踪: 图13 消息跟踪-直连设备
  • 创建产品 为了方便体验,我们提供了一个烟感的产品模型,烟感会上报烟雾值、温度、湿度、烟雾报警、还支持响铃报警命令。以烟感例,体验消息上报、属性上报等功能。 访问设备接入服务,单击“管理控制台”进入设备接入控制台,查看MQTTS设备接入域名,保存该地址。 单击左侧导航栏“产品”,单击页面左侧的“创建产品”。 根据页面提示填写参数,然后单击“确定”完成产品的创建。 基本信息 所属资源空间 平台自动将新创建的产品归属在默认资源空间下。如需归属在其他资源空间下,下拉选择所属的资源空间。如无对应的资源空间,请先创建资源空间。 产品名称 自定义。支持字母、数字、下划线(_)、连字符(-)的字符组合。 协议类型 选择“MQTT”。 数据格式 选择“JSON”。 设备类型选择 选择”自定义类型” 设备类型 填写”smokeDetector” 高级配置 产品ID 不填写 产品描述 请根据实际情况填写。
  • 设备初始化 创建设备时,需要写入在注册设备时获取的设备ID、密码,以及1中获取的设备对接信息,注意格式为ssl://域名信息:端口号 或 ssl://IP地址:端口号 1 2 3 //例如在iot-device-demo文件 MessageSample.java中修改以下参数 IoTDevice device = new IoTDevice("ssl://域名信息:8883", "5e06bfee334dd4f33759f5b3_demo", "mysecret", file); 所有涉及设备ID和密码的文件均需要修改成对应的信息。 建立连接。调用init接口,该接口是阻塞调用,如果建立连接成功会返回0。 1 2 3 if (device.init() != 0) { return; } 如果连接成功就会打印: 1 2023-07-17 17:22:59 INFO MqttConnection:105 - Mqtt client connected. address :ssl://域名信息:8883 创建设备并连接成功后,可以开始使用设备进行通信。调用IoT Device 的getClient接口获取设备客户端,客户端提供了消息、属性、命令等通讯接口。
  • 准备工作 开发环境要求:已经安装JDK(版本1.8以上)和maven 访问SDK下载页面,下载SDK,整个工程包含以下子工程: iot-device-sdk-java:sdk代码 iot-device-demo:普通直连设备的demo代码 iot-gateway-demo:网关设备的demo代码 iot-bridge-sdk:网桥的sdk代码 iot-bridge-demo:网桥的demo代码,用来演示如何将tcp设备桥接到平台 iot-bridge-sample-tcp-protocol:子设备使用tcp协议链接网桥的样例 iot-device-code-generator:设备代码生成器,可以根据产品模型自动生成设备代码 编译安装:进入到SDK根目录,执行mvn install
  • 证书资源 当设备和应用需要对IoT平台进行校验时可使用以下证书。 此证书文件只适用于华为云物联网平台,且必须配合对应域名使用。 CA 证书具有一个过期日期,在该日期后,这些证书将无法用于验证服务器的证书;请在 CA 证书的过期日期前替换这些证书,以确保设备可以正常的连接到IoT平台。 表1 证书资源 证书包名称 region&版本 证书类型 证书格式 说明 下载 certificate 北京四基础版 设备侧证书 pem、jks、bks 用于设备校验平台的身份。该证书必须配合当前设备侧接入域名使用。 注:之前的老域名(iot-acc.cn-north-4.myhuaweicloud.com)必须要配合老证书使用。 证书文件 certificate 北京四、上海一和广州标准版 设备侧证书 pem、jks、bks 用于设备校验平台的身份。该证书必须配合当前设备侧接入域名使用。 证书文件 certificate 北京四 应用侧证书 pem 用于订阅推送场景,应用侧校验平台的身份。 证书文件 certificate(设备发放) 通用 设备侧证书 pem、jks、bks 用于设备校验平台(设备发放)的身份。该证书必须配合设备发放使用。 证书文件 certificate 中国-香港、亚太-新加坡、亚太-曼谷、非洲-约翰内斯堡 设备侧证书 pem、jks、bks 用于设备校验平台的身份。该证书必须配合当前设备侧接入域名使用。 证书文件
  • 应用开发资源 为了降低应用的开发难度、提升开发效率,物联网平台开放了应用侧API。应用通过调用物联网平台的API,实现安全接入、设备管理、数据采集、命令下发等业务场景。 资源包名 描述 下载 应用侧开发 API Java Demo 物联网平台为应用服务器提供了应用侧API,能够让开发者快速验证API开放的能力,体验业务功能,熟悉业务流程。 API Java Demo 应用侧开发 Java SDK Java SDK提供Java方法调用应用侧API与平台通信。使用指南可以参考Java SDK使用指南。 Java SDK 应用侧开发 C# SDK C# SDK提供C#方法调用应用侧API与平台通信。使用指南可以参考C# SDK使用指南。 C# SDK 应用侧开发 Python SDK Python SDK提供Python方法调用应用侧API与平台通信。使用指南可以参考Python SDK使用指南。 Python SDK 应用侧开发 Go SDK Go SDK提供Go方法调用应用侧API与平台通信。使用指南可以参考Go SDK使用指南。 Go SDK 应用侧开发 Node.js SDK Node.js SDK提供Node.js方法调用应用侧API与平台通信。使用指南可以参考Node.js SDK使用指南。 Node.js SDK 应用侧开发 PHP SDK PHP SDK提供PHP方法调用应用侧API与平台通信。使用指南可以参考PHP SDK使用指南。 PHP SDK
  • 设备开发资源 物联网平台支持设备通过MQTT协议、LWM2M/CoAP协议和HTTPS协议进行接入,也可以通过IoTEdge将Modbus、OPC-UA、OPC-DA这些协议的设备接入。设备可以通过调用接口或者集成SDK的方式接入到物联网平台。 资源包名 描述 下载路径 IoT Device SDK(Java) 设备可以通过集成IoT Device SDK(Java)接入物联网平台, Demo提供了调用SDK接口的样例代码。使用指导请参考 IoT Device SDK使用指南(Java)。 IoT Device SDK(Java) IoT Device SDK(C) 设备可以通过集成IoT Device SDK(C)接入物联网平台, Demo提供了调用SDK接口的样例代码。使用指导请参考 IoT Device SDK(C)使用指南。 IoT Device SDK(C) IoT Device SDK(C#) 设备可以通过集成IoT Device SDK(C#)接入物联网平台, Demo提供了调用SDK接口的样例代码。使用指导请参考 IoT Device SDK(C#)使用指南。 IoT Device SDK(C#) IoT Device SDK(Android) 设备可以通过集成IoT Device SDK(Android)接入物联网平台, Demo提供了调用SDK接口的样例代码。使用指导请参考 IoT Device SDK(Android)使用指南。 IoT Device SDK(Android) IoT Device SDK(Go) 设备可以通过集成IoT Device SDK(Go)接入物联网平台, Demo提供了调用SDK接口的样例代码。使用指导请参考 IoT Device SDK(Go)使用指南。 IoT Device SDK(Go) IoT Device SDK(Python) 设备可以通过集成IoT Device SDK(Python)接入物联网平台, Demo提供了调用SDK接口的样例代码。使用指导请参考 IoT Device SDK(Python)使用指南。 IoT Device SDK(Python) IoT Device SDK Tiny (C) 设备可以通过集成IoT Device SDK Tiny (C)接入物联网平台, Demo提供了调用SDK接口的样例代码。使用指导请参考 IoT Device Tiny SDK(C)使用指南 IoT Device SDK Tiny (C) 原生MQTT/MQTTS协议接入示例 设备侧可以通过原生MQTT/MQTTS协议接入到物联网平台,Demo提供了SSL加密建链和TCP不加密建链、数据上报、订阅Topic的样例代码。 接入示例参考:Java版、Python版、Android版、C版、C#、NodeJS。 quickStart(Java) quickStart(Android) quickStart(Python) quickStart(C) quickStart(C#) quickStart(Node.js) 产品模型模板 产品模型模板中包含了典型场景的产品模型样例,开发者可以在模板基础进行修改,定义自己需要的产品模型。 使用指导可以参考离线开发产品模型。 产品模型开发示例 编解码插件样例 编解码插件的代码样例工程,开发者可以基于该样例工程进行二次开发。 编解码插件开发样例 编解码插件检测工具 用于检测离线开发的编解码插件的编解码能力是否正常。 编解码插件检测工具 NB-IoT设备模拟器 用于模拟以CoAP/LWM2M协议接入物联网平台的NB设备,实现数据上报和命令下发功能。 使用指导可以参考基于控制台开发产品。 NB-IoT设备模拟器 IoT Link Studio(原名为IoT Studio) IoT Link Studio是针对IoT物联网端侧开发(IoT Device SDK Tiny)的IDE环境,提供了编译、烧录、调试等一站式开发体验,支持 C、 C++、汇编等多种开发语言,让您快速、高效地进行物联网开发。 使用指导可以参考基于NB-IoT小熊派开发智慧路灯。 IoT Link Studio
  • 到期后影响 图1 包年/包月设备接入资源生命周期描述了包年/包月设备接入资源各个阶段的状态。购买后,在计费周期内资源正常运行,此阶段为有效期;资源到期而未续费时,将陆续进入宽限期和保留期。 图1 包年/包月设备接入资源生命周期 到期预警 包年/包月设备接入资源在到期前第7天内,系统将向用户推送到期预警消息。预警消息将通过邮件、短信和站内信的方式通知到华为云账号的创建者。 到期后影响 当您的包年/包月设备接入资源到期未续费,首先会进入宽限期,资源状态变为“已过期”。宽限期内您可以正常使用设备接入服务。 如果您在宽限期内仍未续费包年/包月设备接入资源,那么就会进入保留期,资源状态变为“已冻结”,您将无法对处于保留期的包年/包月资源执行任何操作。 保留期到期后,若包年/包月设备接入资源仍未续费,那么设备接入资源将被释放,数据无法恢复。 华为云根据客户等级定义了不同客户的宽限期和保留期时长。 关于续费的详细介绍请参见续费概述。
  • 适用场景 包年/包月计费模式需要用户预先支付一定时长的费用,适用于长期、稳定的业务需求。以下是一些适用于包年/包月计费模式的业务场景: 稳定业务需求:对于长期运行且资源需求相对稳定的业务,如企业官网、在线商城、博客等,包年/包月计费模式能提供较高的成本效益。 长期项目:对于周期较长的项目,如科研项目、大型活动策划等,包年/包月计费模式可以确保在整个项目周期内资源的稳定使用。 业务高峰预测:如果能预测到业务高峰期,如电商促销季、节假日等,可提前购买包年/包月资源以应对高峰期的需求,避免资源紧张。 数据安全要求高:对于对数据安全性要求较高的业务,包年/包月计费模式可确保资源的持续使用,降低因资源欠费而导致的数据安全风险。
  • 计费示例 假设您在2023/03/08 15:50:04开通了一个标准版低频实例。购买时长为一个月,并在到期前手动续费1个月,则: 第一个计费周期为:2023/03/08 15:50:04 ~ 2023/04/08 23:59:59 第二个计费周期为:2023/04/08 23:59:59 ~ 2023/05/08 23:59:59 您需要为每个计费周期预先付费,计费公式如表2所示。 表2 计费公式 资源类型 计费公式 资源单价 设备接入标准版/企业版实例 实例规格单价 * 购买时长 请参见设备接入价格详情中的“规格价格”。
  • 变更配置后对计费的影响 当前包年/包月设备接入实例的规格不满足您的业务需要时,您可以在设备接入控制台发起变更规格操作,变更时系统将按照如下规则为您计算变更费用: 资源升配:新配置价格高于老配置价格,此时您需要支付新老配置的差价。 资源降配:新配置价格低于老配置价格,此时华为云会将新老配置的差价退给您。 这里以资源升配且无任何优惠的场景为例,假设您在2023/04/08开通了1个低频单元设备接入实例,单元数量为1,购买时长为1个月,计划在2023/04/18变更规格为中频单元,单元数量为1。旧配置价格为800 元/月,新配置价格为3000 元/月。计算公式如下: 升配费用=新配置价格*剩余周期-旧配置价格*剩余周期 公式中的剩余周期为每个自然月的剩余天数/对应自然月的最大天数。本示例中,剩余周期=12(4月份剩余天数)/ 30(4月份最大天数)+ 8(5月份剩余天数)/ 31(5月份最大天数)=0.6581,代入公式可得升配费用=3000*0.6581-800*0.6581=1447.82(元) 更多信息请参见变更资源规格费用说明。
  • 计费示例 假设您在2023/04/18 9:59:30开通了一个标准版SU1实例,然后在2023/04/20 11:45:46将其删除,则: 第一个计费周期为2023/04/18 9:59:30 ~ 2023/04/19 00:00:00,该计费周期内的计费时长为1天。 第二个计费周期为2023/04/19 00:00:00 ~ 2023/04/20 00:00:00,该计费周期内的计费时长为1天。 第三个计费周期为2023/04/20 00:00:00 ~ 2023/04/21 00:00:00,该计费周期内的计费时长为0天。 您需要为每个计费周期付费,计费公式如表2所示。产品价格详情中标出了资源每天的价格。 表2 计费公式 资源类型 计费公式 资源单价 设备接入基础版实例(2023年1月1日前开通) 百万消息单价 * 计费周期内消息数 3.6元/百万条消息
  • 包年/包月资源 对于包年/包月计费模式的资源,例如包年/包月的设备接入实例,用户在购买时会一次性付费,服务将在到期后自动停止使用。 如果在计费周期内不再使用包年/包月资源,您可以执行退订操作,系统将根据资源是否属于五天无理由退订、是否使用代金券和折扣券等条件返还一定金额到您的账户。详细的退订规则请参见云服务退订规则概览。 如果您已开启“自动续费”功能,为避免继续产生费用,请在自动续费扣款日(默认为到期前7日)之前关闭自动续费。
  • 续费相关的功能 包年/包月云设备接入实例续费相关的功能如表1所示。 表1 续费相关的功能 功能 说明 手动续费 包年/包月设备接入实例从购买到被自动删除之前,您可以随时在IoTDA控制台为实例续费,以延长实例的使用时间。 自动续费 开通自动续费后,设备接入实例会在每次到期前自动续费,避免因忘记手动续费而导致资源被自动删除。 在一个设备接入实例生命周期的不同阶段,您可以根据需要选择一种方式进行续费,具体如图1 设备接入实例生命周期所示。 图1 设备接入实例生命周期 设备接入实例从购买到到期前,处于正常运行阶段,资源状态为“运行中”。 到期后,资源状态变为“已过期”。 到期未续费时,实例首先会进入宽限期,宽限期到期后仍未续费,资源状态变为“已冻结”。 超过宽限期仍未续费将进入保留期,如果保留期内仍未续费,资源将被自动删除。 华为云根据客户等级定义了不同客户的宽限期和保留期时长。 在设备接入实例到期前均可开通自动续费,到期前7日凌晨3:00首次尝试自动续费,如果扣款失败,每天凌晨3:00尝试一次,直至设备接入实例到期或者续费成功。到期前7日自动续费扣款是系统默认配置,您也可以根据需要修改此扣款日。
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Security-Token 否 String 如果正在使用临时安全凭据,则此header是必需的,该值是临时安全凭据的安全令牌(会话令牌)。 最大长度:2048 表3 请求Body参数 参数 是否必选 参数类型 描述 tags 是 Array of objects 用于管理资源的一组键值对。 数组长度:1 - 20 表4 tags 参数 是否必选 参数类型 描述 key 是 String 标签的键。 最小长度:1 最大长度:128 value 否 String 标签的值,可以为空字符串,但不能为null。 最小长度:0 最大长度:255
  • URI POST /v1/instances/{resource_type}/{resource_id}/tags/delete 表1 路径参数 参数 是否必选 参数类型 描述 resource_type 是 String 资源类型。 枚举值: identitycenter:permissionset(权限集) resource_id 是 String 权限集的唯一标识符(ID)。 最大长度:130
  • 响应参数 状态码: 400 表5 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_msg String 错误信息 request_id String 请求唯一标识 状态码: 403 表6 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_msg String 错误信息 request_id String 请求唯一标识
  • 响应示例 状态码: 200 Successful { "instances" : [ { "identity_store_id" : "d-a00aaaa33f", "alias" : "new-store-id-123", "instance_id" : "ins-bd8baaaaaaaade60" } ], "page_info" : { "next_marker" : null, "current_count" : 1 } }
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 instances Array of objects IAM身份中心实例信息列表。 page_info Object 包含分页信息的对象。 表4 instances 参数 参数类型 描述 identity_store_id String 关联到IAM身份中心实例的身份源的全局唯一标识符(ID)。 最小长度:1 最大长度:64 instance_id String IAM身份中心实例的全局唯一标识符(ID)。 最小长度:20 最大长度:20 alias String 用户为身份源标识符定义的别名。 instance_urn String 实例的统一资源名称(URN)。 表5 page_info 参数 参数类型 描述 next_marker String 如果存在,则表示可用的输出比当前响应中包含的输出多。在对操作的后续调用中,在标签请求参数中使用此值,以获取输出的下一部分。您应该重复此操作,直到next_marker响应元素返回为null。 current_count Integer 本页返回条目数量。 状态码: 400 表6 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误信息。 request_id String 请求唯一标识。 状态码: 403 表7 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误信息。 request_id String 请求唯一标识。
  • 请求示例 根据用户组ID,更新对应IAM身份中心用户组的属性。 PUT https://{hostname}/v1/identity-stores/{identity_store_id}/groups/{group_id} { "operations" : [ { "attribute_path" : "description", "attribute_value" : "更新用户组描述" } ] }
  • 请求参数 表2 请求Header参数 参数 是否必选 参数类型 描述 X-Security-Token 否 String 如果正在使用临时安全凭据,则此header是必需的,该值是临时安全凭据的安全令牌(会话令牌)。 最大长度:2048 表3 请求Body参数 参数 是否必选 参数类型 描述 operations 是 Array of objects 更新的用户组属性列表。 数组长度:1-100 表4 operations 参数 是否必选 参数类型 描述 attribute_path 是 String 要更新的属性的字符串表示。 最小长度:1 最大长度:255 attribute_value 否 String 要更新的属性值。当属性为对象类型时,此处填写对象的JSON字符串。为null时表示删除对应属性。
  • URI PUT /v1/identity-stores/{identity_store_id}/groups/{group_id} 表1 路径参数 参数 是否必选 参数类型 描述 identity_store_id 是 String 身份源的全局唯一标识符(ID)。 最小长度:12 最大长度:12 group_id 是 String 身份源中IAM身份中心用户组的全局唯一标识符(ID)。 最小长度:1 最大长度:64
  • 响应示例 状态码: 200 Successful { "addresses" : null, "display_name" : "用户显示名", "emails" : [ { "primary" : true, "type" : "Work", "value" : "email@example.com" } ], "external_ids" : null, "identity_store_id" : "d-a00aaaa33f", "locale" : null, "name" : { "family_name" : "姓氏", "formatted" : null, "given_name" : "名字", "honorific_prefix" : null, "honorific_suffix" : null, "middle_name" : null }, "nickname" : null, "phone_numbers" : null, "preferred_language" : null, "profile_url" : null, "timezone" : null, "title" : null, "user_id" : "ac6aa714-daa7-1aaa-aaa2-6715aaaa4dd9", "user_name" : "用户名u1", "user_type" : null, "created_at" : 1687184129925, "created_by" : "5146d03d8aaaaaaaaaaaabbae60620a5", "updated_at" : 1687184129926, "updated_by" : "5146d03d8aaaaaaaaaaaabbae60620a5", "email_verified" : true, "enabled" : true }
  • URI GET /v1/identity-stores/{identity_store_id}/users/{user_id} 表1 路径参数 参数 是否必选 参数类型 描述 identity_store_id 是 String 身份源的全局唯一标识符(ID)。 最小长度:12 最大长度:12 user_id 是 String 身份源中IAM身份中心用户的全局唯一标识符(ID)。 最小长度:1 最大长度:64
  • 响应参数 状态码: 200 表3 响应Body参数 参数 参数类型 描述 addresses Array of objects 用户的地址信息列表。 数组长度:1-1 display_name String 用户的显示名称。 最小长度:1 最大长度:1024 emails Array of objects 用户的电子邮箱信息列表。 数组长度:1-1 external_id String 外部身份源分配给此资源的标识符。 external_ids Array of objects 用户的外部标识符信息列表。 数组长度:1-10 identity_store_id String 身份源的全局唯一标识符(ID)。 最小长度:1 最大长度:36 locale String 用户的地理区域或位置信息。 最小长度:1 最大长度:1024 name Object 包含用户姓名信息的对象。 nickname String 用户昵称。 最小长度:1 最大长度:1024 phone_numbers Array of objects 用户的电话号码信息列表。 数组长度:1-1 preferred_language String 用户语言首选项。 最小长度:1 最大长度:1024 profile_url String 与用户关联的URL。 最小长度:1 最大长度:1024 timezone String 用户时区。 最小长度:1 最大长度:1024 title String 用户头衔。 最小长度:1 最大长度:1024 user_id String 身份源中IAM身份中心用户的全局唯一标识符(ID)。 最小长度:1 最大长度:47 user_name String 用户名,用于标识用户的唯一字符串。 最小长度:2 最大长度:128 user_type String 用户类型。 最小长度:1 最大长度:1024 created_at Long 创建用户时的时间戳。 created_by String 创建者。 updated_at Long 更新用户时的时间戳。 updated_by String 更新者。 email_verified Boolean 一个布尔值,表示用户主的电子邮箱是否验证。 enabled Boolean 一个布尔值,表示用户是否启用。 enterprise Object 包含用户工作相关信息的对象。 表4 addresses 参数 参数类型 描述 country String 国家/地区。 最小长度:1 最大长度:1024 formatted String 包含要显示的地址的格式化版本的字符串。 最小长度:1 最大长度:1024 locality String 地址位置。 最小长度:1 最大长度:1024 postal_code String 邮政编码。 最小长度:1 最大长度:1024 primary Boolean 一个布尔值,表示这是否为用户的主地址。 region String 区域。 最小长度:1 最大长度:1024 street_address String 街道。 最小长度:1 最大长度:1024 type String 表示地址类型的字符串。 最小长度:1 最大长度:1024 表5 emails 参数 参数类型 描述 primary Boolean 一个布尔值,表示这是否为用户的主电子邮箱。 type String 表示电子邮箱类型的字符串。 最小长度:1 最大长度:1024 value String 包含电子邮箱地址的字符串。 最小长度:1 最大长度:1024 verification_status String 电子邮箱地址的验证状态。 枚举值: NOT_VERIFIED VERIFIED 表6 external_ids 参数 参数类型 描述 id String 外部身份提供商颁发给此资源的标识符。 最小长度:1 最大长度:256 issuer String 外部标识符的颁发者。 最小长度:1 最大长度:100 表7 name 参数 参数类型 描述 family_name String 用户的姓氏。 最小长度:1 最大长度:1024 formatted String 包含要显示的名称的格式化版本的字符串。 最小长度:1 最大长度:1024 given_name String 用户的名字。 最小长度:1 最大长度:1024 honorific_prefix String 用户的尊称前缀。 最小长度:1 最大长度:1024 honorific_suffix String 用户的尊称后缀。 最小长度:1 最大长度:1024 middle_name String 用户的中间名。 最小长度:1 最大长度:1024 表8 phone_numbers 参数 参数类型 描述 primary Boolean 一个布尔值,表示这是否为用户的主电话号码。 type String 表示电话号码类型的字符串。 最小长度:1 最大长度:1024 value String 包含电话号码的字符串。 最小长度:1 最大长度:1024 表9 enterprise 参数 参数类型 描述 cost_center String 成本中心。 最小长度:1 最大长度:1024 department String 部门。 最小长度:1 最大长度:1024 division String 分部。 最小长度:1 最大长度:1024 employee_number String 员工编号。 最小长度:1 最大长度:1024 manager Object 经理。 organization String 组织。 最小长度:1 最大长度:1024 表10 manager 参数 参数类型 描述 value String 经理。 最小长度:1 最大长度:1024 状态码: 400 表11 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误信息。 request_id String 请求ID。 encoded_authorization_message String 鉴权信息。 状态码: 403 表12 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误信息。 request_id String 请求ID。 encoded_authorization_message String 鉴权信息。 状态码: 404 表13 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误信息。 request_id String 请求ID。 encoded_authorization_message String 鉴权信息。
  • 响应示例 状态码: 200 Successful { "permission_sets" : [ { "created_date" : 1677175760379, "description" : "示例权限集1", "name" : "test_ps_1", "permission_set_id" : "ps-8603aaaaaaaa14bd", "relay_state" : "", "session_duration" : "PT4H", "permission_urn" : "IdentityCenter::system:permissionSet:ps-8603aaaaaaaa14bd" } ], "page_info" : { "next_marker" : "649040aaaaaaaaaaaa3e3050", "current_count" : 1 } }
  • URI GET /v1/instances/{instance_id}/permission-sets 表1 路径参数 参数 是否必选 参数类型 描述 instance_id 是 String IAM身份中心实例的全局唯一标识符(ID)。 表2 Query参数 参数 是否必选 参数类型 描述 limit 否 Integer 每个请求返回的最大结果数。 最小值:1 最大值:100 缺省值:100 marker 否 String 分页标记。 最小长度:24 最大长度:24 permission_set_id 否 String 权限集的全局唯一标识符(ID)。 name 否 String 权限集名称。
  • 响应参数 状态码: 200 表4 响应Body参数 参数 参数类型 描述 permission_sets Array of objects 权限集列表。 page_info Object 包含分页信息的对象。 表5 permission_sets 参数 参数类型 描述 created_date Long 权限集的创建时间。 description String 权限集的描述。 最小长度:1 最大长度:700 name String 权限集的名称。 最小长度:1 最大长度:32 permission_set_id String 权限集的唯一标识。 relay_state String 用于在联合身份验证过程中重定向应用程序中的用户。 最小长度:1 最大长度:240 session_duration String 应用程序用户会话在ISO-8601标准中有效的时间长度。 最小长度:1 最大长度:100 permission_urn String 权限集的统一资源名称(URN)。 表6 page_info 参数 参数类型 描述 next_marker String 如果存在,则表示可用的输出比当前响应中包含的输出多。在对操作的后续调用中,在标签请求参数中使用此值,以获取输出的下一部分。您应该重复此操作,直到next_marker响应元素返回为null。 current_count Integer 本页返回条目数量。 状态码: 400 表7 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误信息。 request_id String 请求唯一标识。 状态码: 403 表8 响应Body参数 参数 参数类型 描述 error_code String 错误码。 error_msg String 错误信息。 request_id String 请求唯一标识。
共100000条