华为云用户手册

  • 计费示例 假设您在2023/03/08 15:50:04开通了一个标准版S1单元。购买时长为一个月,并在到期前手动续费1个月,则: 第一个计费周期为:2023/03/08 15:50:04 ~ 2023/04/08 23:59:59 第二个计费周期为:2023/04/09 00:00:00 ~ 2023/05/08 23:59:59 您需要为每个计费周期预先付费,计费公式如表2所示。 表2 计费公式 资源类型 计费公式 资源价格 设备接入标准版实例 单元类型单价 * 单元数量 * 购买时长 请参见设备接入价格计算器,计费模式选择“包年包月”,实例版本选择标准版,选择您要购买的单元类型、购买数量和购买时长,查看页面下方的“配置费用”即为您购买资源的价格。 设备接入企业版实例 实例规格 * 购买时长 请参见设备接入价格计算器,计费模式选择“包年包月”,实例版本选择企业版,选择您要购买企业版实例的同时在线设备数、消息上下行TPS和购买时长,查看页面下方的“配置费用”即为您购买资源的价格。
  • 变更配置后对计费的影响 当前包年/包月设备接入实例的规格不满足您的业务需要时,您可以在设备接入控制台发起变更规格操作,变更时系统将按照如下规则为您计算变更费用: 资源升配:新配置价格高于老配置价格,此时您需要支付新老配置的差价。 资源降配:新配置价格低于老配置价格,此时华为云会将新老配置的差价退给您。 这里以资源升配且无任何优惠的场景为例,假设您在2023/04/08开通了1个标准版实例低频单元S1,单元数量为1,购买时长为1个月,计划在2023/04/18变更规格为中频单元S2,单元数量为1。旧配置价格为800元/月,新配置价格为3000元/月。计算公式如下: 升配费用=新配置价格*剩余周期-旧配置价格*剩余周期 公式中的剩余周期为每个自然月的剩余天数/对应自然月的最大天数。本示例中,剩余周期=12(4月份剩余天数,变更当天不算)/ 30(4月份最大天数)+ 8(5月份剩余天数)/ 31(5月份最大天数)=0.6581,代入公式可得升配费用=3000*0.6581-800*0.6581=1447.82(元) 更多信息请参见变更资源规格费用说明。
  • 到期后影响 图1 包年/包月设备接入资源生命周期描述了包年/包月设备接入资源各个阶段的状态。购买后,在计费周期内资源正常运行,此阶段为有效期;资源到期而未续费时,将依次进入宽限期和保留期。 图1 包年/包月设备接入资源生命周期 到期预警:包年/包月设备接入资源在到期前第7天内,系统将向用户推送到期预警消息。预警消息将通过邮件、短信和站内信的方式通知到华为云账号的创建者。 到期后影响: 当您的包年/包月设备接入资源到期未续费,首先会进入宽限期,资源状态变为“已过期”。宽限期内您可以正常使用 设备接入服务 。 如果您在宽限期内仍未续费包年/包月设备接入资源,那么就会进入保留期,资源状态变为“已冻结”,您将无法对处于保留期的包年/包月资源执行任何操作。 保留期到期后,若包年/包月设备接入资源仍未续费,那么设备接入资源将被释放,数据无法恢复。 华为云根据客户等级定义了不同客户的宽限期和保留期时长,您可单击客户等级查看。 关于续费的详细介绍请参见续费概述。
  • 适用场景 包年/包月计费模式需要用户预先支付一定时长的费用,适用于长期、稳定的业务需求。以下是一些适用于包年/包月计费模式的业务场景: 稳定业务需求:对于长期运行且资源需求相对稳定的业务,如企业官网、在线商城、博客等,包年/包月计费模式能提供较高的成本效益。 长期项目:对于周期较长的项目,如科研项目、大型活动策划等,包年/包月计费模式可以确保在整个项目周期内资源的稳定使用。 业务高峰预测:如果能预测到业务高峰期,如电商促销季、节假日等,可提前购买包年/包月资源以应对高峰期的需求,避免资源紧张。 数据安全要求高:对于对数据安全性要求较高的业务,包年/包月计费模式可确保资源的持续使用,降低因资源欠费而导致的数据安全风险。
  • 创建产品 为了方便体验,我们提供了一个烟感的产品模型,烟感会上报烟雾值、温度、湿度、烟雾报警、还支持响铃报警命令。以烟感例,体验消息上报、属性上报等功能。 访问设备接入服务,单击“管理控制台”进入设备接入控制台,选择您的实例,单击实例卡片进入。查看MQ TTS 设备接入 域名 ,保存该地址。 单击左侧导航栏“产品”,单击页面左侧的“创建产品”。 根据页面提示填写参数,然后单击“确定”完成产品的创建。 基本信息 所属资源空间 平台自动将新创建的产品归属在默认资源空间下。如需归属在其他资源空间下,下拉选择所属的资源空间。如无对应的资源空间,请先创建资源空间。 产品名称 自定义。支持字母、数字、下划线(_)、连字符(-)的字符组合。 协议类型 选择“MQTT”。 数据格式 选择“JSON”。 设备类型选择 选择”自定义类型” 设备类型 填写“smokeDetector” 高级配置 产品ID 不填写 产品描述 请根据实际情况填写。
  • SDK获取和安装 安装Python开发环境。 访问Python官网,下载并按说明安装Python开发环境。 华为云应用侧 Python SDK 支持 Python3 及以上版本。 安装pip工具 访问pip官网,下载并按说明安装pip工具。 安装Python SDK 执行如下命令安装华为云Python SDK核心库以及相关服务库 # 安装核心库 pip install huaweicloudsdkcore # 安装IoTDA服务库 pip install huaweicloudsdkiotda
  • 如何开发网关 网关是一个特殊的设备,除具备一般设备功能之外,还具有子设备管理、子设备消息转发的功能。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.SUC CES S); log.info("writeAndFlush " + propsSet); } 属性查询: 1 2 3 4 5 6 7 @Override public void onSubdevPropertiesGet(String requestId, PropsGet propsGet) { //不建议平台直接读子设备的属性,这里直接返回失败 log.error("not support 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两个属性,如下图所示 图9 模型定义-子设备产品 修改StringTcpServer的main函数,替换构造参数,然后运行该类。 1 2 3 simpleGateway = new SimpleGateway(new SubDevicesFilePersistence(), "ssl://iot-acc.cn-north-4.myhuaweicloud.com:8883", "5e06bfee334dd4f33759f5b3_demo", "mysecret"); 在平台上看到该网关在线后,添加子设备。 图10 设备-添加子设备 表1 子设备参数 参数名称 参数描述 所属产品 子设备所属的产品,选择步骤1创建的产品。 设备名称 即device_name,可自定义,如subdev_name 设备标识码 即node_id,填写subdev。 设备ID 即device_id,可不填写,自动生成。 此时网关上日志打印: 2024-04-16 21:00:01 INFO SubDevicesFilePersistence:112 - add subdev, the nodeId is subdev 运行TcpDevice类,建立连接后,输入步骤3中注册的子设备的nodeId,如subdev。 图11 子设备连接 此时网关设备日志打印: 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'} 在平台上看到子设备上线。 图12 设备列表-设备在线 子设备上报消息 图13 子设备上报消息 查看日志看到上报成功 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"}]] 查看消息跟踪 在平台上找到网关,选择 设备详情-消息跟踪,打开消息跟踪。继续让子设备发送数据,等待片刻后看到消息跟踪: 图14 消息跟踪-直连设备
  • 创建产品 为了方便体验,我们提供了一个烟感的产品模型,烟感会上报烟雾值、温度、湿度、烟雾报警、还支持响铃报警命令。以烟感例,体验消息上报、属性上报等功能。 访问设备接入服务,单击“管理控制台”进入设备接入控制台,选择您的实例,单击实例卡片进入。查看MQTTS设备接入域名,保存该地址。 单击左侧导航栏“产品”,单击页面左侧的“创建产品”。 根据页面提示填写参数,然后单击“确定”完成产品的创建。 基本信息 所属资源空间 平台自动将新创建的产品归属在默认资源空间下。如需归属在其他资源空间下,下拉选择所属的资源空间。如无对应的资源空间,请先创建资源空间。 产品名称 自定义。支持字母、数字、下划线(_)、连字符(-)的字符组合。 协议类型 选择“MQTT”。 数据格式 选择“JSON”。 设备类型选择 选择”自定义类型” 设备类型 填写“smokeDetector” 高级配置 产品ID 不填写 产品描述 请根据实际情况填写。
  • 准备工作 开发环境要求:已经安装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
  • 设备初始化 创建设备时,需要写入在注册设备时获取的设备ID、密码,以及1中获取的设备对接信息,注意格式为ssl://域名信息:端口号 或 ssl://IP地址:端口号 1 2 3 4 5 6 // 获取证书路径:加载iot平台的ca证书,进行服务端校验,使用sdk默认的ca.jks即可。 URL resource = MessageSample.class.getClassLoader().getResource("ca.jks"); File file = new File(resource.getPath()); //例如在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接口获取设备客户端,客户端提供了消息、属性、命令等通讯接口。
  • SDK获取和安装 安装PHP开发环境。 访问PHP官网,下载并按说明安装PHP开发环境。 华为云PHP SDK支持PHP 5.6、PHP6、PHP7、PHP8版本,在运行前可执行 php --version 检查当前 Php 的版本信息,如果安装了PHP其他语言的版本,运行PHP SDK可能会报错。 安装composer curl -sS https://getcomposer.org/installer | php 安装PHP SDK composer require huaweicloud/huaweicloud-sdk-php 引入 Composer 的自动加载文件 require 'path/to/vendor/autoload.php';
  • SDK获取和安装 安装.NET开发环境。 访问.NET官网,下载并按说明安装.NET开发环境。 华为云.NET SDK适用于: .NET Framework 4.5 及其以上版本。 .NET Standard 2.0 及其以上版本。 C# 4.0 及其以上版本。 使用 .NET CLI 工具安装SDK dotnet add package HuaweiCloud.SDK.Core dotnet add package HuaweiCloud.SDK.IoTDA
  • IoT Device SDK C Tiny相关问题 LiteOS操作系统层面相关技术问题解答。 请移步LiteOS社区。 日志中出现诸如mqtt_imp_init: ###please implement mqtt by yourself####此类问题。 首先检查编译架构中对于__attribute__ ((weak))函数的支持性,如果不支持,建议将这些函数全部注释掉;如果出现link_tcpip_imp_init:###please implement this function by yourself####,建议检查是否实现网络层的适配。 在使用SDK时发现某些任务执行顺序与任务优先级顺序不符? SDK中默认使用的优先级从大到小依次为0-31,用户可根据不同的操作系统自行调整相应任务的优先级。 SDK移植流程主要包括哪些步骤? 移植过程主要包括操作系统注册到OSAL层以及TCPIP注册到SAL层,同时可以根据需求进行模块化裁剪,详见开发指南。 使用MQTT协议对接华为云时,返回错误码2 具体日志如下所示 图1 MQTT链接错误提示 该问题为网络错误,首先建议用户检查开发板是否已经联网成功,如果网络联通,建议检查所要对接网络的IP地址或域名以及端口号是否正确,如linux环境下,可以ping所要对接的网络地址查看是否ping通。 客户在对接华为云时,出现网络断连接后,在恢复网络时设备没有自动重连。 图2 断链没有重连日志提示 日志中可见PAHO已经退出,设备已经与平台断开连接,主动下线。建议客户修改SDK目录中的network\mqtt\paho_mqtt\port\paho_mqtt_port.c文件中的函数__loop_entry()中的休眠时间1ms调大至100ms,具体为:osal_task_sleep(100),查看是否可以自动重连。 使用MQTTS对接华为云时,流程卡死在topic订阅阶段,参考日志如下所示。 图3 流程卡死topic订阅日志提示 请将iot_config.h文件中的宏CONFIG_PAHO_LOOPTIMEOUT调整为1000。 开发板使用MQTT对接华为云成功,但切换到MQTTS时对接失败 可能是开发板内存不足导致,建议测试下开发板剩余内存,建议内存尽量大于60K,如在OpenHarmony L0设备中可以调用接口LOS_MemPoolSizeGet(m_aucSysMem0)获取总内存,LOS_MemTotalUsedGet(m_aucSysMem0)获取已使用内存,做差即可获取到剩余内存,如果移植了shell也可以通过free指令获取到当前内存情况。 采用MQTT对接华为云的正确日志如下所示,应如何解读? 图4 MQTT正常建链日志提示 日志中第3、4行是MQTT协议对接华为云必现日志,若使用MQTTS则会出现第2行日志;如果使用适配sal的tcpip协议则会出现第1行日志;若相应日志没有打印,建议根据文件link_main.c找到对应功能的初始化函数所对应的宏,之后在iotlink_config.h中检查对应的宏是否打开。 设备断电之后在IoTDA平台仍然可以看到设备在线? 如果设备没有主动断链通知平台下线,则设备下线时间与代码中的MQTT心跳时间lifetime相关,为1.5倍的心跳时间,在MQTT建立连接时,连接参数中对lifetime进行设置即可。 目前已经移植了IoT Device SDK Tiny(附代码)的设备清单 详见移植设备清单列表。
  • IoT Device SDK 和IoT Device SDK Tiny有什么区别? 相比于IoT Device SDK,Tiny版本更加轻量,适用于内存以及磁盘空间更小的设备,且一般很少挂载子设备,在编译中没有使用动态链接库,代码提供了操作系统抽象层,可适配多种OS,例如FreeRTOS、linux、NovaOS、ucos_ii、OpenHarmony LiteOS-M等;除MQTT(S)还支持LwM2M,CoAP协议,Tiny使用的mbedtls加密,IoT Device SDK C采用的openssl加密。详细请参考IoT Device SDK介绍。
  • 使用小熊派开发板开发时,设备无法激活? 可以输入“AT+CGATT?”,然后单击“发送”,若返回“+CGATT:1”,表示网络附着成功(附着成功代表NB-IoT联网正常),返回“+CGATT:0”表示网络附着失败,请查看SIM卡是否插入正确,或联系运营商检查网络状态; 或者可以将拨测开关拨到AT-PC模式,选择STM的端口,波特率设置为9600,输入指令“AT+CGSN=1”获取IMEI号,比较跟在平台注册设备时填写IMEI号是否保持一致,不一致的话,需要修改成一致的。
  • deviceId、nodeId和IMEI有什么对应关系? 在 物联网平台 中,设备注册时,需要填写设备标识码(即nodeId)。设备标识码是设备的物理标识,通常使用IMEI或MAC地址。设备ID(deviceId)是物联网平台对设备的逻辑标识。 NB-IoT设备:在设备接入物联网平台时携带设备标识码(nodeId),完成设备的接入鉴权。 MQTT设备:在设备接入物联网平台时携带设备ID(deviceId)和密钥,通过一机一密的方式,完成设备的接入鉴权。 更多请参考设备注册鉴权。
  • 物联网卡无法正常接入设备接入平台? 电信NB物联网卡 由于电信NB网络做了限制,目前电信NB卡连接华为云IoT平台,会出现设备接入平台或执行软固件升级失败等情况。 3G/4G物联网卡 根据工网安函〔2020 〕1173 号文件,3G/4G物联网卡流量包规格大于100MB或配置流量池的情况下,需要提供定向IP地址或域名才能购买。因此如果您的物联网卡需要访问华为云IoT平台时,请您检查物联网卡的定向信息是否包含华为云IoT平台的域名。 图7 物联网卡 查询华为云IoT平台接入域名,详细步骤可以参考资源获取。 GSL控制台定向域名/IP修改方式进入订单管理页面,详细步骤请参考订单管理资料。 电信NB物联网卡通过云云对接接入华为云IoT平台的功能正在公测中,如有相关诉求请新建工单,联系相关技术专家进行处理。
  • 如何选择合适的操作系统 选择物联网操作系统要综合考量硬件资源限制、功耗要求、网络连接需求、开发与维护成本、安全性、生态系统扩展性等因素,以下是两种华为开发的操作系统的简单介绍。 LiteOS是一种轻量级物联网操作系统,广泛适用于各种资源受限的场景,尤其适合智能家居、可穿戴设备、车联网、工业控制等需要低功耗、实时性能以及小巧体积的物联网终端。它也可以作为嵌入式系统的基础,提供实时操作系统功能。LiteOS具备如下特点: 轻量级:内核体积小,适合资源受限的设备。 低功耗:优化了功耗管理,延长设备使用寿命。 实时性能:提供了实时操作系统功能,满足实时应用需求。 可裁剪:支持模块化设计,可以根据需求裁剪内核。 开放生态:提供丰富的组件和SDK,方便开发者快速开发。 OpenHarmony是一种面向全场景、全连接、全智能的下一代智能终端设备操作系统,采用组件化设计,支持在128KiB到xGiB RAM 资源的设备上运行系统组件,设备开发者可基于目标硬件能力自由选择系统组件进行集成。OpenHarmony具备如下特点: 开放性:OpenHarmony 是一个开源项目,代码对开发者完全开放,可以自由获取、修改和分发。 模块化设计:OpenHarmony 采用模块化设计,可以根据不同设备的硬件资源和功能需求,灵活地选择和裁剪系统组件。 跨平台支持:OpenHarmony 支持多种硬件平台和处理器架构,包括ARM、X86 等,增强了其适应性和兼容性。 分布式技术:OpenHarmony 具备分布式技术,可以实现设备间的数据共享、任务调度和资源互助。 面向全场景:OpenHarmony 可以应用于各种智能终端设备,包括智能手机、智能电视、可穿戴设备、智能家居等,实现全场景互联互通。 一次开发,多端部署:OpenHarmony 提供了统一的API,开发者可以编写一套应用,并在不同设备上部署运行。 灵活的定制和扩展:OpenHarmony 提供了丰富的API 和工具,可以方便开发者进行定制和扩展,满足不同的应用需求。 父主题: 方案咨询
  • 前提条件 已参考创建 IAM 用户中操作,创建IAM用户。默认情况下,新创建的IAM用户没有任何权限。您需要为其授予权限,或将其加入用户组,并给用户组授权,用户组中的用户将获得用户组的权限。创建用户组时,请给用户组赋予“Astro Canvas InstanceManagement”系统策略,您也可以直接使用系统预置的admin用户组。 图1 赋予用户组Astro Canvas InstanceManagement系统策略 IAM用户创建后,请使用IAM用户登录华为云Astro大屏应用。登录后会提示图2中所示信息,此时您需要按照本章节操作,为IAM用户进行授权。授权后,IAM用户才可正常登录华为云Astro大屏应用进行可视化应用的开发。 图2 没有该服务访问权限 IAM用户创建后,请使用IAM用户登录华为云Astro低代码平台,否则执行5中操作时,在添加用户中无法选择到该IAM用户。
  • 响应消息 响应参数如表5所示。 表5 响应参数 参数 参数类型 描述 fpga_image Object FPGA镜像信息详情。 表6 fpga_image字段结构说明 参数 参数类型 描述 id String FPGA镜像的ID。 status String FPGA镜像状态。取值如下: initialing:表示创建FPGA镜像任务初始化中。 scheduling:表示等待调度创建。 creating:表示FPGA镜像正在创建中。 deleting:表示FPGA镜像正在删除中。 error:表示FPGA镜像创建失败。 active:表示FPGA镜像可以正常使用。
  • 请求示例 POST https://{endpoint}/v2/{project_id}/cloudservers/fpga_image { "fpga_image": { "dcp_location": "obs-fpga:vu9p/fpga-vu9p-dcp.tar", "log_directory": "vu9p/log", "name": "fpga-image-test", "description": "fpga description" } }
  • 请求消息 请求参数如表3所示。 表3 请求参数 参数 参数类型 是否必选 描述 fpga_image Object 是 FPGA镜像信息详情。 表4 fpga_image字段结构说明 参数 参数类型 是否必选 描述 dcp_location String 是 DCP文件在OBS桶中的路径,格式为“桶名:文件名”,例如“obs-fpga:fpga-test-dcp.tar”。 桶名的命名规则满足OBS的约束: 由英文小写字母、数字以及特殊字符“.”、“-”组成。 只能以数字或字母开头和结尾。 长度3~63个字符。 不能是ip地址。 不能包含“..”、“.-” 、“-.”字符串。 文件名的命名规则如下: 由英文大、小写字母,数字,中划线,下划线,斜杠,英文句号组成。 不能以“/”开头。 必须以“.tar”结尾。 长度4~128个字符。 如果文件名中包含目录结构,例如“vu9p/fpga-test-dcp.tar”,则每一级目录名需要满足以下规则: 不能为空。 不能以“.”开头或结尾。 log_directory String 否 构建日志文件在上传到OBS桶(DCP文件所在的OBS桶)中时的目录路径,例如“vu9p/log”。当该字段不存在或为空时,默认与用户的DCP文件位于同一级目录下。 命名规则如下: 由英文大、小写字母,数字,中划线,下划线,斜杠,英文句号组成。 不能以“/”开头或结尾。 如果包含多级目录,则每一级目录名都不能为空,且不能以“.”开头或结尾。 长度0~64个字符。 name String 是 FPGA镜像的名称。 取值范围: 只能由英文字母、数字、下划线、中划线组成。 长度1~64个字符。 description String 否 FPGA镜像的描述信息,由中文汉字、中文句号、中文逗号、英文大小写字母、数字、中划线、下划线、英文句号、英文逗号、空格组成,长度0到255个字符。
  • 功能介绍 本接口用于创建FPGA镜像。当前仅支持创建能够加载到Xilinx VU9P芯片的镜像文件。 目前仅“华北-北京一、华东-上海二、华南-广州”区域支持,其他区域暂未支持。 在创建FPGA镜像前,用户需要提供创建FPGA镜像所需的DCP(Design Checkpoint )文件,并将该文件存放到OBS(Object Storage Service)桶中。 本接口在完成FPGA镜像的初始化操作后会首先为用户返回FPGA镜像ID,然后通过后端的AFS(Accelerated Engine Image Factory Service)构建集群完成DCP文件到FPGA镜像文件的生成,并将构建过程中产生的日志文件上传到用户OBS桶的指定目录。构建日志文件会按照“{FPGA镜像ID}_log.tar”的格式命名,例如“4010a32c5c62bad9015c62dc2290002b_log.tar”。 在创建过程中,FPGA镜像的状态会不断变化。当状态为active或error时,表示创建完成。 表1 状态说明 状态 说明 initiating 创建FPGA镜像任务初始化中 scheduling FPGA镜像等待调度创建。 creating FPGA镜像正在创建中 active FPGA镜像可以正常使用 error FPGA镜像创建失败 创建配额:单个租户一次最多只能创建一个FPGA镜像。当租户尝试同时创建多个FPGA镜像时,将创建失败。
  • URI GET /v2.1/{project_id}/servers/detail?changes-since={changes-since}&image={image}&flavor={flavor}&name={name}&status={status}&limit={limit}&marker={marker}¬-tags={not-tags}&reservation_id={reservation_id}&ip={ip} 参数说明请参见表1。 表1 路径参数 参数 是否必选 描述 project_id 是 项目ID。 获取方法请参见获取项目ID。
  • 响应示例 { "servers": [ { "addresses": { "68269e6e-4a27-441b-8029-35373ad50bd9": [ { "addr": "192.168.0.3", "version": 4 } ] }, "created": "2012-09-07T16:56:37Z", "flavor": { "id": "s3.xlarge.2", "links": [ { "href": "http://openstack.example.com/openstack/flavors/s3.xlarge.2", "rel": "bookmark" } ] }, "hostId": "16d193736a5cfdb60c697ca27ad071d6126fa13baeb670fc9d10645e", "id": "05184ba3-00ba-4fbc-b7a2-03b62b884931", "image": "", "links": [ { "href": "http://openstack.example.com/v2/openstack/servers/05184ba3-00ba-4fbc-b7a2-03b62b884931", "rel": "self" }, { "href": "http://openstack.example.com/openstack/servers/05184ba3-00ba-4fbc-b7a2-03b62b884931", "rel": "bookmark" } ], "metadata": {}, "name": "new-server-test", "progress": 0, "status": "ACTIVE", "tenant_id": "openstack", "updated": "2012-09-07T16:56:37Z", "user_id": "fake" } ] }
  • 请求消息 请求参数如表2所示。 表2 请求参数 参数 是否必选 参数类型 描述 nics 是 Array of objects 需要添加的网卡参数列表,详情请参见表3。 表3 nics字段数据结构说明 参数 是否必选 参数类型 描述 subnet_id 否 String 云服务器添加网卡的信息。 需要指定已创建的网络(network)的ID,UUID格式。 security_groups 否 Array of objects 添加网卡的安全组信息,详情请参见表4。 ip_address 否 String IP地址,无该参数表示自动分配IP地址。 port_id 否 String 网卡ID,UUID格式。 当该字段不为空时,表示挂载指定的网卡。port_id和subnet_id不能同时为空。 网卡ID可以从虚拟私有云的“查询端口列表”章节查询到。 约束: 网卡状态必须为DOWN 当port_id和subnet_id同时存在的时候,优先使用port_id。 当选择port_id不为空时,代表此时使用的是弹性网卡,此时security_groups和ip_address等参数不生效。 ipv6_enable 否 Boolean 是否支持ipv6。 取值为true时,标识此网卡支持ipv6。 ipv6_bandwidth 否 Object 绑定的共享带宽信息,详情请参见ipv6_bandwidth字段数据结构说明。 表4 security_groups字段数据结构说明 参数 是否必选 参数类型 描述 id 是 String 安全组ID。
  • 请求示例 添加网络ID为“d32019d3-bc6e-4319-9c1d-6722fc136a23”,安全组ID为“f0ac4394-7e4a-4409-9701-ba8be283dbc3”的网卡至云服务器。 POST https://{endpoint}/v1/{project_id}/cloudservers/{server_id}/nics { "nics": [ { "subnet_id": "d32019d3-bc6e-4319-9c1d-6722fc136a23", "security_groups": [ { "id": "f0ac4394-7e4a-4409-9701-ba8be283dbc3" } ] } ] }
  • 功能介绍 创建一台或多台云服务器。 V1.1版本创建云服务器的接口兼容了V1版本创建云服务器(按需)的功能,同时合入新功能,支持创建包年/包月的弹性云服务器。 本接口为异步接口,当前创建云服务器请求下发成功后会返回job_id,此时创建云服务器并没有立即完成,需要通过调用查询任务的执行状态查询job状态,当Job状态为SUCCESS时代表云服务器创建成功。 本接口支持在HTTP请求消息头中设置X-Client-Token请求头,保证请求幂等性。详细信息请参考请求幂等性说明。 弹性云服务器的登录鉴权方式包括两种:密钥对、密码。为安全起见,推荐使用密钥对方式。 密钥对 指使用密钥对作为弹性云服务器的鉴权方式。 接口调用方法:使用key_name字段,指定弹性云服务器登录时使用的密钥文件,key_name字段的使用方法请参见表2。 密码 指使用设置初始密码方式作为弹性云服务器的鉴权方式,此时,您可以通过用户名密码方式登录弹性云服务器,Linux操作系统时为root用户的初始密码,Windows操作系统时为Administrator用户的初始密码。 接口调用方法:使用adminPass字段,指定管理员账号的初始登录密码,adminPass字段的使用方法请参见表2。对于镜像已安装Cloud-init的Linux云服务器,如果需要使用密文密码,可以使用user_data字段进行密码注入,具体请参见表2。 对于安装Cloud-init镜像的Linux云服务器,若指定user_data字段,则adminPass字段无效。
  • 请求示例 创建一台包年/包月云服务器,操作系统为CentOS 7.6 64bit,1U1G,绑定1M带宽的弹性公网IP,采用密钥方式登录鉴权。 POST https://{endpoint}/v1.1/{project_id}/cloudservers { "server": { "availability_zone":"az1-dc1", "name": "newserver", "imageRef": "67f433d8-ed0e-4321-a8a2-a71838539e09", "root_volume": { "volumetype": "SSD" }, "data_volumes": [ { "volumetype": "SSD", "size": 100 }, { "volumetype": "SSD", "size": 100, "multiattach": true, "hw:passthrough": true } ], "flavorRef": "s2.small.1", "vpcid": "2a6f4aa6-d93e-45f5-a8cb-b030dbf8cd68", "security_groups": [ { "id": "6242ef48-4d35-49c8-8711-a6e54902e44a" } ], "nics": [ { "subnet_id": "ef039b60-6a14-42d1-963b-687b627fea08" } ], "publicip": { "eip": { "iptype": "5_sbgp", "bandwidth": { "size": 1, "sharetype": "PER" } } }, "key_name": "id_rsa", "count": 1, "metadata": { "op_svc_userid": "f79791beca3c48159ac2553fff22e166" }, "extendparam": { "chargingMode": "prePaid", "periodType": "month", "periodNum": 1, "isAutoRenew": "true", "isAutoPay": "true", "enterprise_project_id": "f8e0ecc8-3825-4ee8-9596-fb4258ffdcbb" }, "os:scheduler_hints": { "group": "cdbbfffe-ef18-47b4-a5c8-f61a984c0ecc" } } } 创建一台包年/包月云服务器,操作系统为CentOS 7.6 64bit,1U1G,绑定1M带宽的弹性公网IP,采用密码方式登录鉴权请求中的密码,建议将密码在配置文件或者环境变量中密文存放,使用时解密,确保安全。 POST https://{endpoint}/v1.1/{project_id}/cloudservers { "server": { "availability_zone":"az1-dc1", "name": "newserver", "adminPass": "$ADMIN_PASS", "imageRef": "67f433d8-ed0e-4321-a8a2-a71838539e09", "root_volume": { "volumetype": "SSD" }, "data_volumes": [ { "volumetype": "SSD", "size": 100 }, { "volumetype": "SSD", "size": 100, "multiattach": true, "hw:passthrough": true } ], "flavorRef": "s2.small.1", "vpcid": "2a6f4aa6-d93e-45f5-a8cb-b030dbf8cd68", "security_groups": [ { "id": "6242ef48-4d35-49c8-8711-a6e54902e44a" } ], "nics": [ { "subnet_id": "ef039b60-6a14-42d1-963b-687b627fea08" } ], "publicip": { "eip": { "iptype": "5_sbgp", "bandwidth": { "size": 1, "sharetype": "PER" } } }, "key_name": "", "count": 1, "metadata": {}, "extendparam": { "chargingMode": "prePaid", "periodType": "month", "periodNum": 1, "isAutoRenew": "true", "isAutoPay": "true", "enterprise_project_id": "f8e0ecc8-3825-4ee8-9596-fb4258ffdcbb" }, "os:scheduler_hints": { "group": "cdbbfffe-ef18-47b4-a5c8-f61a984c0ecc" } } } 创建一台包年/包月云服务器,操作系统为CentOS 7.6 64bit,1U1G,绑定1M带宽的按需按流量计费的弹性公网IP,采用密钥方式登录鉴权。 POST https://{endpoint}/v1.1/{project_id}/cloudservers { "server": { "availability_zone":"az1-dc1", "name": "newserver", "imageRef": "67f433d8-ed0e-4321-a8a2-a71838539e09", "root_volume": { "volumetype": "SSD" }, "data_volumes": [ { "volumetype": "SSD", "size": 100 }, { "volumetype": "SSD", "size": 100, "multiattach": true, "hw:passthrough": true } ], "flavorRef": "s2.small.1", "vpcid": "2a6f4aa6-d93e-45f5-a8cb-b030dbf8cd68", "security_groups": [ { "id": "6242ef48-4d35-49c8-8711-a6e54902e44a" } ], "nics": [ { "subnet_id": "ef039b60-6a14-42d1-963b-687b627fea08" } ], "publicip": { "eip": { "iptype": "5_sbgp", "bandwidth": { "size": 1, "sharetype": "PER", "chargemode": "traffic" }, "extendparam": { "chargingMode": "postPaid" } } }, "key_name": "id_rsa", "count": 1, "metadata": { "op_svc_userid": "f79791beca3c48159ac2553fff22e166" }, "extendparam": { "chargingMode": "prePaid", "periodType": "month", "periodNum": 1, "isAutoRenew": "true", "isAutoPay": "true", "enterprise_project_id": "f8e0ecc8-3825-4ee8-9596-fb4258ffdcbb" }, "os:scheduler_hints": { "group": "cdbbfffe-ef18-47b4-a5c8-f61a984c0ecc" } } } 创建一台包年/包月云服务器,操作系统为CentOS 7.6 64bit,1U1G,绑定共享带宽的弹性公网IP,采用密钥方式登录鉴权。 POST https://{endpoint}/v1.1/{project_id}/cloudservers { "server": { "availability_zone":"az1-dc1", "name": "newserver", "imageRef": "67f433d8-ed0e-4321-a8a2-a71838539e09", "root_volume": { "volumetype": "SSD" }, "data_volumes": [ { "volumetype": "SSD", "size": 100 }, { "volumetype": "SSD", "size": 100, "multiattach": true, "hw:passthrough": true } ], "flavorRef": "s2.small.1", "vpcid": "2a6f4aa6-d93e-45f5-a8cb-b030dbf8cd68", "security_groups": [ { "id": "6242ef48-4d35-49c8-8711-a6e54902e44a" } ], "nics": [ { "subnet_id": "ef039b60-6a14-42d1-963b-687b627fea08" } ], "publicip": { "eip": { "iptype": "5_sbgp", "bandwidth": { "id": "a0d4b26f-699d-49a0-bcc8-6f707a925abf", "sharetype": "WHOLE" } } }, "key_name": "id_rsa", "count": 1, "metadata": { "op_svc_userid": "f79791beca3c48159ac2553fff22e166", "agency_name": "test" }, "extendparam": { "chargingMode": "prePaid", "periodType": "month", "periodNum": 1, "isAutoRenew": "true", "isAutoPay": "true", "enterprise_project_id": "f8e0ecc8-3825-4ee8-9596-fb4258ffdcbb" }, "os:scheduler_hints": { "group": "cdbbfffe-ef18-47b4-a5c8-f61a984c0ecc" } } }
  • 响应示例 { "job_id": "ff808082739334d80173943ec9b42130", "order_id": " CS 2007281506xxxxx", "serverIds": [ "fe0528f0-5b1c-4c8c-9adf-e5d5047b8c17", "679854ae-a50d-40c9-8132-b19bf3a306a1" ] } 或 { "error": { "code": "Ecs.0005", "message": "request body is illegal." } }
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全