华为云用户手册

  • 包年/包月资源 对于包年/包月计费模式的资源,例如包年/包月的设备接入实例,用户在购买时会一次性付费,服务将在到期后自动停止使用。 如果在计费周期内不再使用包年/包月资源,您可以执行退订操作,系统将根据资源是否属于五天无理由退订、是否使用代金券和折扣券等条件返还一定金额到您的账户。详细的退订规则请参见云服务退订规则概览。 如果您已开启“自动续费”功能,为避免继续产生费用,请在自动续费扣款日(默认为到期前7日)之前关闭自动续费。
  • 计费模式概述 设备接入服务 提供按需计费、包年/包月两种计费模式,以满足不同场景下的用户需求。 包年/包月:一种预付费模式,即先付费再使用,按照订单的购买周期进行结算。购买周期越长,享受的折扣越大。一般适用于设备需求量长期稳定的成熟业务。 按需计费:一种后付费模式,即先使用再付费,按照实际使用时长计费。按需计费模式允许您根据实际业务需求灵活地调整资源使用。 表1列出了两种计费模式的区别。 表1 计费模式 计费模式 包年/包月 按需计费 付费方式 预付费 后付费 计费周期 按订单的购买周期计费。 标准版实例:按小时结算。 基础版实例(2023年1月1日前):按照实际产生的消息数计费。 适用计费项 标准版实例、企业版实例。 标准版实例、基础版实例。 变更规格 支持变更实例规格。 标准版实例支持变更实例规格。 基础版实例不支持变更实例规格。 适用场景 适用于可预估资源使用周期的场景,价格比按需计费模式更优惠。对于长期使用者,推荐该方式。 适用于资源需求波动的场景,可以随时开通,随时删除。 父主题: 计费模式
  • 续费相关的功能 包年/包月设备接入实例续费相关的功能如表1所示。 表1 续费相关的功能 功能 说明 手动续费 包年/包月设备接入实例从购买到被自动删除之前,您可以随时在IoTDA控制台为实例续费,以延长实例的使用时间。 自动续费 开通自动续费后,设备接入实例会在每次到期前自动续费,避免因忘记手动续费而导致资源被自动删除。 在一个设备接入实例生命周期的不同阶段,您可以根据需要选择一种方式进行续费,具体如图1 设备接入实例生命周期所示。 图1 设备接入实例生命周期 设备接入实例从购买到到期前,处于正常运行阶段,资源状态为“运行中”。到期后,资源状态变为“已过期”。 到期未续费时,实例首先会进入宽限期,宽限期到期后仍未续费,资源状态变为“已冻结”。 超过宽限期仍未续费将进入保留期,如果保留期内仍未续费,资源将被自动删除。 华为云根据客户等级定义了不同客户的宽限期和保留期时长。 在设备接入实例到期前均可开通自动续费,到期前7日凌晨3:00首次尝试自动续费,如果扣款失败,每天凌晨3:00尝试一次,直至设备接入实例到期或者续费成功。到期前7日自动续费扣款是系统默认配置,您也可以根据需要修改此扣款日。
  • 包年/包月计费场景与分析 某用户于2023/03/18 15:30:00开通了包月计费标准版实例,实例规格配置如下: 服务单元类型:低频单元S1 服务单元数量:5个 购买时长:5个月 用了一段时间后,用户发现实例当前规格无法满足业务需要,于2023/05/20 9:00:00扩容规格为中频单元S2,单元数量10个。至5个月购买时长到期。共产生多少费用呢? 可以将这一设备接入实例的费用分为两段,已支付的旧配置价格和升配费用。 升配费用的公式为:升配费用=新配置价格*剩余周期-旧配置价格*剩余周期 旧配置费用:5个S1单元使用5个月费用为800 * 5 * 5 = 20000元 升配费用: 用户于2023/05/20 9:00:00扩容规格,剩余周期 = 11(5月剩余天数,变更当天不算)/ 31(5月最大天数)+ 2(6月和7月)+ 18 / 31(8月剩余天数/8月最大天数)= 2.9355月 新配置价格 = 3000 * 10 = 30000 旧配置价格 = 800 * 5 = 4000 升配费用 = (30000 - 4000)* 2.9355 = 76323元 共产生费用 = 旧配置费用 + 升配费用 = 20000 +76323 = 96323元
  • 按需计费场景与分析 某用户于2023/03/18 15:30:00开通了按需计费标准版实例,配置如下: 服务单元类型:S1单元 服务单元数量:5个 用了一段时间后,用户发现实例当前规格无法满足业务需要,于2023/03/22 9:00:00扩容规格为S2单元,单元数量10个。至3月底。共产生多少费用呢? 可以将这一设备接入实例的费用分为两段:扩容规格前和扩容规格后。 扩容规格前: 2023/03/18 15:30:00 - 2023/03/19 00:00:00:8.5小时 2023/03/19 00:00:00 - 2023/03/22 00:00:00:72小时 2023/03/22 00:00:00 - 2023/03/22 9:00:00:9小时 5个S1单元使用时长 = 8.5 +72 +9 = 89.5小时。 扩容规格前费用= 89.5 * 5 * 1.7 = 760.75元 扩容规格后: 2023/03/22 9:00:00 - 2023/03/23 00:00:00:15小时 2023/03/23 00:00:00 -2023/04/01 00:00:00:216小时 10个S2单元使用时长 = 216 + 15 = 255小时 扩容规格后费用 = 231 * 10 * 6.3 = 14553元 总费用 = 760.75 + 14553 = 15313.75元
  • 在续费管理页面开通自动续费 登录管理控制台。 单击“控制台”页面上方“费用”,在下拉菜单中选择“续费管理”。进入“续费管理”页面。 自定义查询条件。 可在“自动续费项”页签查询已经开通自动续费的资源。 可对“手动续费项”、“到期转按需项”、“到期不续费项”页签的资源开通自动续费。 图2 续费管理 为包年/包月资源开通自动续费。 单个资源开通自动续费:选择需要开通自动续费的设备接入实例,单击操作列“设为自动续费”。 图3 单个资源续费 批量资源开通自动续费:选择需要开通自动续费的设备接入实例,单击列表左上角的“设为自动续费”。 图4 多个资源开通自动续费 选择续费时长,并根据需要设置自动续费次数,单击“开通”。 在“续费管理”页面开通的自动续费,自动续费周期以实际选择的续费时长以及自动续费次数为准。例如:您选择了续费时长3个月,不限次数,即在每次到期前自动续费3个月。 图5 设为自动续费
  • 消息结构 字段名 字段类型 描述和要求 起始标识 WORD 起始标识,固定为0XFFFE。 版本号 BYTE 高四位预留;低四位表示协议版本号,当前为1。 消息码 BYTE 标识 物联网平台 与设备之间的请求消息类型,应答消息的消息码和请求消息相同。消息码的定义为: 0-18:预留消息码,暂未使用。 19:查询设备版本。 20:下载新版本软件包通知。 21:请求下载升级包。 22:上报升级包下载结果。 23:执行软件升级。 24:上报升级结果。 25-127:预留消息码,暂未使用。 校验码 WORD 从起始标识到数据区的最后一个字节的CRC16校验值,计算前先把校验码字段置为0,计算完成后把结果写到校验码字段。 说明: CRC16算法:CRC16/CCITT x16+x12+x5+1 数据区长度 WORD 数据区的长度。 数据区 BYTE[n] 可变长度,具体由各个指令定义,可参考下面介绍的各个指令对应的请求消息和应答消息定义。
  • PCP消息识别 由于PCP协议消息和设备业务消息共用一个端口和URL通讯,平台收到设备的消息时,按照如下步骤判断是PCP协议消息还是业务消息: 检查设备是否支持软件升级(根据设备profile的omCapability.upgradeCapability定义),如果不支持,则认为是业务消息。 检查设备软件升级协议是否是PCP,如果不是,则认为是业务消息。 检查消息前两个字节是否为0XFFFE,如果不是,则认为是业务消息。 检查版本号是否合法,如果不合法,则认为是业务消息。 检查消息码是否合法,如果不合法,则认为是业务消息。 检查校验码是否正确,如果不正确,则认为是业务消息。 检查数据区长度是否正确,如果不正确,则认为是业务消息。 如果以上检查都通过,认为是PCP协议消息。 对设备的要求:需要设备保证业务消息的起始字节不是0XFFFE。
  • 什么是产品模型 产品模型用于描述设备具备的能力和特性。开发者通过定义产品模型,在物联网平台构建一款设备的抽象模型,使平台理解该款设备支持的服务、属性、命令等信息,如开关等。当定义完一款产品模型后,在进行注册设备时,就可以使用在控制台上定义的产品模型。 产品模型定义了服务能力: 服务能力 描述设备具备的业务能力。将设备业务能力拆分成若干个服务后,再定义每个服务具备的属性、命令以及命令的参数。 以水表为例,水表具有多种能力,如上报水流、告警、电量、连接等各种数据,并且能够接受服务器下发的各种命令。产品模型文件在描述水表的能力时,可以将水表的能力划分五个服务,每个服务都需要定义各自的上报属性或命令。说明如下: 服务类型 描述 基础(WaterMeterBasic) 用于定义水表上报的水流量、水温、水压等参数,如果需要命令控制或修改这些参数,还需要定义命令的参数。 告警(WaterMeterAlarm) 用于定义水表需要上报的各种告警场景的数据,必要的话需要定义命令。 电池(Battery) 定义水表的电压、电流强度等数据。 传输规则(DeliverySchedule) 定义水表的一些传输规则,必要的话需要定义命令。 连接(Connectivity) 定义水表连接参数。 注:具体定义几个服务是非常灵活的,如上面的例子可以将告警服务拆分成水压告警服务和流量告警服务,也可以将告警服务合入到水表基础服务中。 物联网平台提供了多种定义产品模型的方法,您可以根据自己需求,选择对应的方法定义产品模型。 自定义模型(在线开发):从零自定义构建产品模型,详细请参考在线开发产品模型。 上传模型文件(离线开发):将本地写好的产品模型上传到平台,详细请参考离线开发产品模型。 Excel导入:通过导入文件的方式快速定义产品功能。对于开发者来说,降低产品模型开发门槛,只需根据表格填写参数;对于高阶开发者和集成商来说,提升行业复杂模型开发效率。例如,楼宇自控空调模型包含的service条目超过100条,在表格中编辑开发产品模型,效率大大提升,可以随时编辑调整参数。详细请参考Excel导入。 导入库模型(平台预置产品模型):您可以使用平台预置的产品模型,快速完成产品开发。当前平台提供了标准模型和厂商模型。标准模型遵循行业标准的产品模型,适用行业内绝大部分厂商设备,而厂商模型针对设备类型发布的产品模型,适用于用行业内少量厂家设备。您可以根据实际需求选择相应的产品模型。 父主题: 开发产品模型
  • 导入产品模型 当您已经有完备的产品模型时(线下开发或从其他项目/平台导出),或者使用excel编辑开发产品模型时,可以将产品模型直接导入“物联网平台”。 通过本地导入的产品模型不含编解码插件,如果设备上报采用的是二进制码流,请前往控制台进行插件开发或导入插件。 上传模型文件 访问设备接入服务,单击“管理控制台”进入设备接入控制台。选择您的实例,单击实例卡片进入。 单击左侧导航栏的“产品”,在产品列表中,找到对应的产品,单击产品进入产品界面。 在基本信息页面,单击“上传模型文件”,在弹框中加载本地的产品模型文件,然后单击“确定”。 图2 产品-上传产品模型 Excel导入 访问设备接入服务,单击“管理控制台”进入设备接入控制台。选择您的实例,单击实例卡片进入。 单击左侧导航栏的“产品”,在产品列表中,找到相应的产品,单击产品进入产品界面。 单击“Excel导入”,在产品模板表格中,填写“设备”页签的服务ID,以及“参数”页签的属性、命令、事件等参数。导入Excel表格后,然后单击“确定”。 图3 产品-Excel导入产品模型
  • 属性上报 属性上报是指设备主动向平台上报自己的属性。更多接口信息请参考设备属性上报。 在MainActivity类中实现了属性上报Topic、属性上报功能。 String mqtt_report_topic_json = String.format("$oc/devices/%s/sys/properties/report", editText_mqtt_device_connect_deviceId.getText().toString()); MqttMessage mqttMessage = new MqttMessage();mqttMessage.setPayload(publishMessage.getBytes());mqttAndroidClient.publish(publishTopic, mqttMessage); 设备上报属性成功后可在设备详情页面查看到上报的属性 图1 查看上报数据-PeriodicalReportConfig 图2 查看上报数据-Battery_level 如果在“设备详情”页面没有最新上报数据,请确认设备上报的服务/属性和产品模型中的服务/属性一致。
  • 接收下发命令 在MainActivity类中提供了接收平台下发命令的功能,在MQTT建链完成后,可以在管理控制台设备详情中命令下发或使用应用侧Demo对该设备ID进行命令下发,例如下发参数名为command,参数值为5的命令,下发成功后,在MQTT的回调函数中接收到。 private final class MqttCallBack4IoTHub implements MqttCallbackExtended { ...... @Overridepublic void messageArrived(String topic, MqttMessage message) throws Exception { Log.i(TAG, "Incoming message: " + new String(message.getPayload(), StandardCharsets.UTF_8)); editText_mqtt_log.append("MQTT接收下发命令成功:" + message + "\n"); } 在设备详情页面可以查看到命令下发状态,这里显示timeout是因为该Demo示例中仅演示接收命令,没有回复响应给平台。 属性上报和命令接收成功,APP界面显示如下:
  • 界面展示 MainActivity类主要提供了界面显示,请填写设备ID和设备密钥,在物联网平台或调用接口注册设备后获取。 示例中默认写了设备侧接入的 域名 地址(SSL加密接入时该域名要与对应的证书文件匹配使用)。 private final static String IOT_PLATFORM_URL = "iot-mqtts.cn-north-4.myhuaweicloud.com"; 用户可以选择设备侧建链时是否SSL加密/不加密,选择Qos方式是0还是1,当前不支持Qos2,可参考使用限制。 checkbox_mqtt_connet_ssl.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { isSSL = true; checkbox_mqtt_connet_ssl.setText("SSL加密"); } else { isSSL = false; checkbox_mqtt_connet_ssl.setText("SSL不加密"); } }})
  • 准备工作 安装android studio 访问android studio官网,选择合适系统的版本下载并安装。(本文以windows 64-bit系统Android Studio 3.5为例)。 安装JDK(也可以使用IDE自带的JDK) 访问Oracle官网,选择合适的JDK版本单击“Download”下载(本文以Windows x64 JDK8为例)。 下载完成后,运行安装文件,根据界面提示安装。
  • 订阅Topic 订阅某Topic的设备才能接收broker发布的关于该Topic的消息,关于平台预置Topic可参考Topic定义。 在MainActivity类中提供了订阅命令下发Topic、订阅Topic、取消订阅Topic等功能: String mqtt_sub_topic_command_json = String.format("$oc/devices/%s/sys/commands/#", editText_mqtt_device_connect_deviceId.getText().toString()); mqttAndroidClient.subscribe(getSubscriptionTopic(), qos, null, new IMqttActionListener() mqttAndroidClient.unsubscribe(getSubscriptionTopic(), null, new IMqttActionListener() 如果建链成功,可以在回调函数中订阅Topic: mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() { @Overridepublic void onSuccess(IMqttToken asyncActionToken) { ...... subscribeToTopic(); } 建链成功后,APP界面日志栏显示如下信息:
  • 建立连接 设备或网关在接入物联网平台时首先需要和平台建立连接,从而将设备或网关与平台进行关联。开发者通过传入设备信息,将设备或网关连接到物联网平台。 MainActivity类主要提供建立MQTT/MQ TTS 连接等方法,MQTT默认使用1883端口,MQTTS默认使用8883端口(需要加载证书)。 if (isSSL) { editText_mqtt_log.append("开始建立MQTTS连接" + "\n"); serverUrl = "ssl://" + IOT_PLATFORM_URL + ":8883";} else { editText_mqtt_log.append("开始建立MQTT连接" + "\n"); serverUrl = "tcp://" + IOT_PLATFORM_URL + ":1883";} ConnectUtils类主要提供了SSL加载证书的getMqttsCerificate方法,如果是MQTTS建链方式,需要调用该方法加载证书。 DigiCertGlobalRootCA.bks:设备校验平台身份的证书,用于设备侧接入物联网平台登录鉴权使用,可以在资源获取中下载证书文件。 SSLContext sslContext = SSLContext.getInstance("SSL");KeyStore keyStore = KeyStore.getInstance("bks");keyStore.load(context.getAssets().open("DigiCertGlobalRootCA.bks"), null);//加载libs目录下的证书TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("X509");trustManagerFactory.init(keyStore);TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();sslContext.init(null, trustManagers, new SecureRandom());sslSocketFactory = sslContext.getSocketFactory(); MainActivity类提供了设置初始化MqttConnectOptions的方法。mqtt连接心跳时间的建议值是120秒,有使用限制。 mqttAndroidClient = new MqttAndroidClient(mContext, serverUrl, clientId);private MqttConnectOptions intitMqttConnectOptions(String currentDate) { String password = ConnectUtils.sha256_HMAC(editText_mqtt_device_connect_password.getText().toString(), currentDate); MqttConnectOptions mqttConnectOptions = new MqttConnectOptions(); mqttConnectOptions.setAutomaticReconnect(true); mqttConnectOptions.setCleanSession(true); mqttConnectOptions.setKeepAliveInterval(120); mqttConnectOptions.setConnectionTimeout(30); mqttConnectOptions.setUserName(editText_mqtt_device_connect_deviceId.getText().toString()); mqttConnectOptions.setPassword(password.toCharArray()); return mqttConnectOptions;} MainActivity类提供了Mqtt客户端建立连接的的方法connect,并通过回调函数处理连接后的消息返回结果。 mqttAndroidClient.connect(mqttConnectOptions, null, new IMqttActionListener() mqttAndroidClient.setCallback(new MqttCallBack4IoTHub());
  • 上传编解码插件 2023年8月1日后新用户不再提供离线插件功能。 当本地已经准备好编解码插件(如线下开发)时,则可以通过“插件开发”的“离线开发方式”上传至物联网平台。 访问设备接入服务,单击“管理控制台”进入设备接入控制台。选择您的实例,单击实例卡片进入。 单击左侧导航栏的“产品”,在产品列表中,找到对应的产品,单击产品进入产品界面。 在产品详情页面,单击“插件开发”,选择“离线开发”,加载本地的插件包,然后单击“上传插件”。 图2 离线开发-完成上传 插件包的设备类型、型号、厂商ID等信息需要与该产品保持一致,才可以成功上传。 当界面提示“上传离线插件成功”,表示插件已部署到物联网平台。
  • 发布Topic 发布Topic是指设备主动向平台上报自己的属性或消息,详细见设备属性上报接口文档。 在FrmMqttDemo中实现了上报Topic、属性上报功能。 12345678 var appMsg = new MqttApplicationMessage();appMsg.Payload = Encoding.UTF8.GetBytes(inputString);appMsg.Topic = topic;appMsg.QualityOfServiceLevel = int.Parse(cbOosSelect.SelectedValue.ToString()) == 0 ? MqttQualityOfServiceLevel.AtMostOnce : MqttQualityOfServiceLevel.AtLeastOnce;appMsg.Retain = false;// 上行响应client.PublishAsync(appMsg).Wait(); 发布Topic后,Demo界面显示如下: 设备上报属性成功后可在设备详情页面查看到上报的属性: 图2 查看上报数据-Demo_smokeDetector 如果在“设备详情”页面没有最新上报数据,请确认设备上报的服务/属性和产品模型中的服务/属性一致。 由于是同步命令需要端侧回复响应可参考接口。
  • 产品模型打包 产品模型写作完成后,需要按如下层级结构打包: 产品模型打包需要遵循如下几点要求: 产品模型文件的目录层级结构必须如上图所示,不能增删。例如:第二层级只能有“profile”和“service”两个文件夹,每个服务下面必须包含“profile”文件夹等。 产品模型文件以zip形式压缩。 产品模型文件的命名必须按照deviceType_manufacturerId的格式命名,其中的deviceType、manufacturerId必须与devicetype-capability.json中对应字段的定义一致。例如:本实例中devicetype-capability.json的主要字段如下: { "devices": [ { "manufacturerId": "TestUtf8ManuId", "manufacturerName": "HZYB", "protocolType": "CoAP", "deviceType": "WaterMeter", "serviceTypeCapabilities": **** } ] } 图中的WaterMeterBasic、WaterMeterAlarm、Battery等都是devicetype-capability.json中定义的服务。 产品模型文件中的文档格式都是JSON,在编写完成后可以在互联网上查找一些格式校验网站,检查JSON的合法性。
  • 服务能力定义样例 servicetype-capability.json记录了该设备的服务信息: { "services": [ { "serviceType": "WaterMeterBasic", "description": "WaterMeterBasic", "commands": [ { "commandName": "SET_PRESSURE_READ_PERIOD", "paras": [ { "paraName": "value", "dataType": "int", "required": true, "min": 1, "max": 24, "step": 1, "maxLength": 10, "unit": "hour", "enumList": null } ], "responses": [ { "responseName": "SET_PRESSURE_READ_PERIOD_RSP", "paras": [ { "paraName": "result", "dataType": "int", "required": true, "min": -1000000, "max": 1000000, "step": 1, "maxLength": 10, "unit": null, "enumList": null } ] } ] } ], "properties": [ { "propertyName": "registerFlow", "dataType": "int", "required": true, "min": 0, "max": 0, "step": 1, "maxLength": 0, "method": "R", "unit": null, "enumList": null }, { "propertyName": "currentReading", "dataType": "string", "required": false, "min": 0, "max": 0, "step": 1, "maxLength": 0, "method": "W", "unit": "L", "enumList": null }, { "propertyName": "timeOfReading", "dataType": "string", "required": false, "min": 0, "max": 0, "step": 1, "maxLength": 0, "method": "W", "unit": null, "enumList": null }, ...... ] } ]} 各字段的解释: 字段 子字段 必选/可选 描述 services - - - - 必选 包含了一个服务的完整信息(根节点不可修改)。 - serviceType - - - 必选 服务的类型,与devicetype-capability.json中serviceType字段保持一致。 - description - - - 必选 服务的描述信息。 非功能性字段,仅起到描述作用,可置为null。 - commands - - - 必选 设备可以执行的命令,如果本服务无命令则置null。 - - commandName - - 必选 命令的名字,命令名与参数共同构成一个完整的命令。 - - paras - - 必选 命令包含的参数。 - - - paraName - 必选 命令中参数的名字。 - - - dataType - 必选 命令参数的数据类型。 取值范围:string、int、string list、decimal、DateTime、jsonObject、enum、boolean。 上报数据时,复杂类型数据格式如下: string list:["str1","str2","str3"] DateTime:yyyyMMdd’T’HHmmss’Z’如:20151212T121212Z jsonObject:自定义json结构体,物联网平台不解析,仅进行透传 - - - required - 必选 本命令是否必选,取值为true或false,默认取值false(非必选)。 目前本字段是非功能性字段,仅起到描述作用。 - - - min - 必选 最小值。 仅当dataType为int、decimal时生效。 - - - max - 必选 最大值。 仅当dataType为int、decimal时生效。 - - - step - 必选 步长。 暂不使用,填0即可。 - - - maxLength - 必选 字符串长度。 仅当dataType为string、string list、DateTime时生效。 - - - unit - 必选 单位,需要使用英文。 取值根据参数确定,如: 温度单位:“C”或“K” 百分比单位:“%” 压强单位:“Pa”或“kPa” - - - enumList - 必选 枚举值。 如开关状态status可有如下取值: "enumList" : ["OPEN","CLOSE"] 目前本字段是非功能性字段,仅起到描述作用,建议准确定义。 - - responses - - 必选 命令执行的响应。 - - - responseName - 必选 命名可以在该responses对应命令的commandName后面添加“_RSP”。 - - - paras - 必选 命令响应的参数。 - - - - paraName 必选 命令中参数的名字。 - - - - dataType 必选 数据类型。 取值范围:string、int、string list、decimal、DateTime、jsonObject 上报数据时,复杂类型数据格式如下: string list:["str1","str2","str3"] DateTime:yyyyMMdd’T’HHmmss’Z’如:20151212T121212Z jsonObject:自定义json结构体,物联网平台不解析,仅进行透传 - - - - required 必选 本命令响应是否必选,取值为true或false,默认取值false(非必选)。 目前本字段是非功能性字段,仅起到描述作用。 - - - - min 必选 最小值。 仅当dataType为int、decimal时生效,逻辑大于等于。 - - - - max 必选 最大值。 仅当dataType为int、decimal时生效,逻辑小于等于。 - - - - step 必选 步长。 暂不使用,填0即可。 - - - - maxLength 必选 字符串长度。 仅当dataType为string、string list、DateTime时生效。 - - - - unit 必选 单位,需要使用英文。 取值根据参数确定,如: 温度单位:“C”或“K” 百分比单位:“%” 压强单位:“Pa”或“kPa” - - - - enumList 必选 枚举值。 如开关状态status可有如下取值: "enumList" : ["OPEN","CLOSE"] 目前本字段是非功能性字段,仅起到描述作用,建议准确定义。 - properties - - - 必选 上报数据描述,每一个子节点为一条属性。 - - propertyName - - 必选 属性名称。 - - dataType - - 必选 数据类型。 取值范围:string、int、string list、decimal、DateTime、jsonObject 上报数据时,复杂类型数据格式如下: string list:["str1","str2","str3"] DateTime:yyyyMMdd’T’HHmmss’Z’如:20151212T121212Z jsonObject:自定义json结构体,物联网平台不解析,仅进行透传 - - required - - 必选 本条属性是否必选,取值为true或false,默认取值false(非必选)。 目前本字段是非功能性字段,仅起到描述作用。 - - min - - 必选 最小值。 仅当dataType为int、decimal时生效,逻辑大于等于。 - - max - - 必选 最大值。 仅当dataType为int、decimal时生效,逻辑小于等于。 - - step - - 必选 步长。 暂不使用,填0即可。 - - method - - 必选 访问模式。 R:可读;W:可写;E:可订阅。 取值范围:R、RW、RE、RWE 、null。 - - unit - - 必选 单位,需要使用英文。 取值根据参数确定,如: 温度单位:“C”或“K” 百分比单位:“%” 压强单位:“Pa”或“kPa” - - maxLength - - 必选 字符串长度。 仅当dataType为string、string list、DateTime时生效。 - - enumList - - 必选 枚举值。 如电池状态(batteryStatus)可有如下取值: "enumList" : [0, 1, 2, 3, 4, 5, 6] 目前本字段是非功能性字段,仅起到描述作用,建议准确定义。
  • 设备能力定义样例 devicetype-capability.json记录了该设备的基础信息: { "devices": [ { "manufacturerId": "TestUtf8ManuId", "manufacturerName": "HZYB", "protocolType": "CoAP", "deviceType": "WaterMeter", "omCapability":{ "upgradeCapability" : { "supportUpgrade":true, "upgradeProtocolType":"PCP" }, "fwUpgradeCapability" : { "supportUpgrade":true, "upgradeProtocolType":"LWM2M" }, "configCapability" : { "supportConfig":true, "configMethod":"file", "defaultConfigFile": { "waterMeterInfo" : { "waterMeterPirTime" : "300" } } } }, "serviceTypeCapabilities": [ { "serviceId": "WaterMeterBasic", "serviceType": "WaterMeterBasic", "option": "Mandatory" }, { "serviceId": "WaterMeterAlarm", "serviceType": "WaterMeterAlarm", "option": "Mandatory" }, { "serviceId": "Battery", "serviceType": "Battery", "option": "Optional" }, { "serviceId": "DeliverySchedule", "serviceType": "DeliverySchedule", "option": "Mandatory" }, { "serviceId": "Connectivity", "serviceType": "Connectivity", "option": "Mandatory" } ] } ]} 各字段的解释: 字段 子字段 可选/必选 描述 devices - - 必选 包含了一个设备的完整能力信息(根节点不能修改)。 - manufacturerId - 可选 指示设备的制造商ID。 - manufacturerName - 必选 指示设备的制造商名称 (只允许英文)。 - protocolType - 必选 指示设备接入物联网平台的协议类型。如NB-IoT的设备取值为CoAP。 - deviceType - 必选 指示设备的类型。 - omCapability - 可选 定义设备的软件升级、固件升级和配置更新的能力,字段含义详情见下文中的:omCapability结构描述。 如果设备不涉及软件/固件升级,本字段可以删除。 - serviceTypeCapabilities - 必选 包含了设备具备的服务能力描述。 - - serviceId 必选 服务的Id,如果设备中同类型的服务类型只有一个则serviceId与serviceType相同, 如果有多个则增加编号,如三键开关 Switch01、Switch02、Switch03。 - - serviceType 必选 服务类型,与servicetype-capability.json中serviceType字段保持一致。 - - option 必选 标识服务字段的类型,取值范围:Master(主服务), Mandatory(必选服务), Optional(可选服务)。 目前本字段为非功能性字段,仅起到描述作用。 omCapability结构描述 字段 子字段 可选/必选 描述 upgradeCapability - 可选 设备软件升级能力。 - supportUpgrade 可选 true:设备支持软件升级。 false:设备不支持软件升级。 - upgradeProtocolType 可选 升级使用的协议类型,此处不同于设备的protocolType,例如CoAP设备软件升级协议使用PCP。 fwUpgradeCapability - 可选 设备固件升级能力。 - supportUpgrade 可选 true:设备支持固件升级。 false:设备不支持固件升级。 - upgradeProtocolType 可选 升级使用的协议类型,此处不同于设备的protocolType,当前物联网平台仅支持LWM2M固件升级。 configCapability - 可选 设备配置更新能力。 - supportConfig 可选 true:设备支持配置更新。 false:设备不支持配置更新。 - configMethod 可选 file:使用文件的方式下发配置更新。 - defaultConfigFile 可选 设备默认配置信息(Json格式),具体配置信息由设备商自定义。物联网平台只储存该信息供下发时使用,不解析处理配置字段的具体含义。
  • 概述 产品模型本质上就是一个devicetype-capability.json文件和若干个serviceType-capability.json文件,其中devicetype-capability.json是描述产品模型包含的服务能力的文件,serviceType-capability.json文件是用于描述devicetype-capability.json文件中的service_capabilities的每一个能力的详细描述。按照如下目录打包的一个zip包。其中WaterMeter是deviceType,TestUtf8Manuld是manufactureId,WaterMeterBasic/WaterMeterAlarm/Battery是服务类型。 所以离线开发产品模型就是按照产品模型编写规则和JSON格式规范在devicetype-capability.json中定义设备能力,在servicetype-capability.json中定义服务能力。因此离线开发产品模型需要熟悉JSON的格式。 由于离线开发产品模型文件相对在线开发比较耗时,因此推荐在线开发产品模型。
  • 命名规范 在产品模型的开发过程中,需要遵循如下命名规范: 设备类型(deviceType)、服务类型(serviceType)、服务标识(serviceId)采用单词首字母大写的命名法。例如:WaterMeter、Battery。 属性使用第一个单词首字母小写,其余单词的首字母大写的命名法。例如:batteryLevel、internalTemperature。 命令使用所有字母大写,单词间用下划线连接的格式。例如:DISCOVERY,CHANGE_COLOR。 设备能力描述json文件固定命名devicetype-capability.json。 服务能力描述json文件固定命名servicetype-capability.json。 厂商id在不同的产品模型文件中不能重复,且仅支持英文。 要注重名称的通用性,简洁性;对于服务能力描述,还要考虑其功能性。例如:对于多传感器设备,可以命名为MultiSensor;对于具有显示电量的服务,可以命名为Battery。
  • 产品模型模板 将一款新设备接入到物联网平台,首先需要编写这款设备的产品模型。物联网平台提供了一些产品模型文件模板,如果新增接入设备的类型和功能服务已经在物联网平台提供的设备产品模型模板中包含,则可以直接选择使用;如果在物联网平台提供的设备产品模型模板中未包含,则需要自己定义。 例如:接入一款水表 ,可以直接选择物联网平台上对应的产品模型模板,修改设备服务列表。 物联网平台提供的产品模型模板会不断更新,如下表格列举设备类型和服务类型示例,仅供参考。 设备类型识别属性: 属性 产品模型中key 属性值 设备类型 deviceType WaterMeter 厂商ID manufacturerId TestUtf8ManuId 厂商名称 manufacturerName HZYB 协议类型 protocolType CoAP 设备的服务列表 服务描述 服务标识(serviceId) 服务类型(serviceType) 选项(option) 水表的基本功能 WaterMeterBasic Water Mandatory 告警服务 WaterMeterAlarm Battery Mandatory 电池服务 Battery Battery Optional 数据的上报规则 DeliverySchedule DeliverySchedule Mandatory 水表的连通性 Connectivity Connectivity Mandatory
  • 托管部署 IoT平台提供泛协议镜像托管部署能力,使用泛协议SDK开发的插件可以制作成镜像托管部署在平台,IoT平台支持对托管的镜像进行分布式自动部署。省去客户自己购买E CS 服务器、购买 ELB负载均衡 、进行容器化等操作和费用。 当前只有IoTDA企业版支持托管部署,使用托管部署方案后,资源费用包含在IoTDA企业版内客户不用单独为部署资源付费。IoTDA标准版可以参考非托管部署方案进行部署和运维,产生的费用参考ECS服务器或者云容器实例CCI的费用说明。 登录管理控制台,单击左侧导航栏“IoTDA实例”,选择对应的企业实例单击“详情”。 在“泛协议接入”页面单击“添加镜像”,单击“同意授权”后选择需要部署的对应镜像。 图1 泛协议-授权 进入“云网关”页面,填写云网关名称和对应要开发的端口后,在“私有镜像”列表中选择上一步骤中上传的镜像。 图2 泛协议-新增云网关(托管) 父主题: 泛协议插件开发
  • 属性上报 属性上报是指设备主动向平台上报自己的属性,更多信息请参考设备属性上报。 1234 //上报json数据,注意serviceId要与产品模型中的定义对应String jsonMsg = "{\"services\": [{\"service_id\": \"Temperature\",\"properties\": {\"value\": 57}},{\"service_id\": \"Battery\",\"properties\": {\"level\": 80}}]}";MqttMessage message = new MqttMessage(jsonMsg.getBytes());client.publish(getRreportTopic(), message, qosLevel, new IMqttActionListener();
  • 订阅接收命令 订阅某Topic的设备才能接收broker发布的关于该Topic的消息,关于平台预置Topic可参考Topic定义。详细接口信息请参考命令下发。 12 //订阅接收命令client.subscribe(getCmdRequestTopic(), qosLevel, null, new IMqttActionListener(); getCmdRequestTopic()获取接收命令的Topic,向平台订阅该Topic的命令。 123 public static String getCmdRequestTopic() { return "$oc/devices/" + deviceId + "/sys/commands/#";}
  • 操作步骤 访问设备接入服务,单击“管理控制台”进入设备接入控制台。选择您的实例,单击实例卡片进入。 单击左侧导航栏“产品”,单击页面左侧的“创建产品”。根据页面提示填写参数,然后单击“确定”,完成产品的创建。 基本信息 所属资源空间 下拉选择所属的资源空间。如无对应的资源空间,请先创建资源空间。 产品名称 为产品命名。产品名称在相同资源空间有唯一性。长度不超过64,只允许中文、字母、数字、以及_?'#().,&%@!-字符的组合。 协议类型 MQTT:使用MQTT协议接入平台的设备,数据格式可以是二进制也可以是JSON格式,采用二进制时需要部署编解码插件。 LwM2M/CoAP:使用在资源受限(包括存储、功耗等)的NB-IoT设备,数据格式是二进制,需要部署编解码插件才能与物联网平台交互。 HTTPS:HTTPS是基于HTTP协议,通过SSL加密的一种安全通信协议。物联网平台支持HTTPS协议通信。 Modbus:物联网平台支持使用Modbus协议接入,使用Modbus协议的设备接入IoT边缘节点的方式为非直连。直连设备和非直连设备差异说明,请参考这里。 HTTP(TLS加密)、ONVIF、OPC-UA、OPC-DA、Other,TCP,UDP:通过边缘接入。 数据格式 JSON:平台和设备之间的通信协议采用JSON格式。 二进制码流:您需在控制台开发编解码插件,将设备上报的二进制码流数据转换为JSON格式,将平台下发的JSON格式数据解析为二进制码流格式,设备才能与平台进行通信。 编码格式 当协议类型(protocol_type)为MQTT,数据格式(data_format)为二进制时,可通过该参数配置设备上报消息的编码格式。默认为UTF-8。 UTF-8:将二进制码流转换为Unicode编码的字符串。 BASE64:将二进制码流转换为BASE64编码的字符串。 所属行业 请根据实际情况选择。 设备类型 请根据实际情况选择。 高级配置 产品ID 定制ProductID,用于唯一标识一个产品。如果携带此参数,平台将产品ID设置为该参数值;如果不携带此参数,产品ID在物联网平台创建产品后由平台分配获得。 产品描述 产品描述。请根据实际情况填写。 产品创建成功后,您可以单击“更多-删除”删除不再使用的产品。删除产品后,该产品下的产品模型、编解码插件等资源将被清空,请谨慎操作。
  • 创建命名空间 登录云容器实例管理控制台。 在左侧导航栏中选择“命名空间”,在右侧页面中“通用计算型”命名空间下单击“创建”。 填写命名空间名称。 设置VPC,选择使用已有VPC或新建VPC,新建VPC需要填写VPC网段,建议使用网段:10.0.0.0/8~22,172.16.0.0/12~22,192.168.0.0/16~22。 设置子网网段。 您需要关注子网的可用IP数,确保有足够数量的可用IP,如果没有可用IP,则会导致负载创建失败。 单击“创建”。
  • 概述 认证模组是指通过预集成IoT Device SDK Tiny,并且通过华为测试认证,遵循华为指定AT命令规范的模组。使用华为认证的模组可以带来以下好处: 设备厂商在MCU上无需关心如何连接到华为云IoT(例如,MQTT建链时密钥的加密算法,clientID的组成方式等),只通过调用该模组提供的AT指令对接华为IoT平台,可以节约设备对接工作量和设备调试周期。 由于MCU无须集成MQTT协议栈或者IoT Device SDK Tiny,因此大大节省MCU资源的消耗。 使用认证模组开发设备的示意图如下所示:
共100000条
提示

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