云服务器内容精选
-
创建产品 为了方便体验,我们提供了一个烟感的产品模型,烟感会上报烟雾值、温度、湿度、烟雾报警、还支持响铃报警命令。以烟感例,体验消息上报、属性上报等功能。 访问 设备接入服务 ,单击“管理控制台”进入设备接入控制台,选择您的实例,单击实例卡片进入。查看MQ TTS 设备接入 域名 ,保存该地址。 单击左侧导航栏“产品”,单击页面左侧的“创建产品”。 根据页面提示填写参数,然后单击“确定”完成产品的创建。 基本信息 所属资源空间 平台自动将新创建的产品归属在默认资源空间下。如需归属在其他资源空间下,下拉选择所属的资源空间。如无对应的资源空间,请先创建资源空间。 产品名称 自定义。支持字母、数字、下划线(_)、连字符(-)的字符组合。 协议类型 选择“MQTT”。 数据格式 选择“JSON”。 设备类型选择 选择”自定义类型” 设备类型 填写“smokeDetector” 高级配置 产品ID 不填写 产品描述 请根据实际情况填写。
-
如何开发网关 网关是一个特殊的设备,除具备一般设备功能之外,还具有子设备管理、子设备消息转发的功能。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":{"temperature":2,"alarm":1},"service_id":"parameter","event_time":null}],"device_id":"subdev_deviceId"}]] 查看消息跟踪 在平台上找到网关,选择 设备详情-消息跟踪,打开消息跟踪。继续让子设备发送数据,等待片刻后看到消息跟踪: 图14 消息跟踪-直连设备
-
创建产品 为了方便体验,我们提供了一个烟感的产品模型,烟感会上报烟雾值、温度、湿度、烟雾报警、还支持响铃报警命令。以烟感例,体验消息上报、属性上报等功能。 访问设备接入服务,单击“管理控制台”进入设备接入控制台,选择您的实例,单击实例卡片进入。查看MQTTS设备接入域名,保存该地址。 单击左侧导航栏“产品”,单击页面左侧的“创建产品”。 根据页面提示填写参数,然后单击“确定”完成产品的创建。 基本信息 所属资源空间 平台自动将新创建的产品归属在默认资源空间下。如需归属在其他资源空间下,下拉选择所属的资源空间。如无对应的资源空间,请先创建资源空间。 产品名称 自定义。支持字母、数字、下划线(_)、连字符(-)的字符组合。 协议类型 选择“MQTT”。 数据格式 选择“JSON”。 设备类型选择 选择”自定义类型” 设备类型 填写“smokeDetector” 高级配置 产品ID 不填写 产品描述 请根据实际情况填写。
-
设备初始化 创建设备时,需要写入在注册设备时获取的设备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接口获取设备客户端,客户端提供了消息、属性、命令等通讯接口。
-
准备工作 开发环境要求:已经安装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
-
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相关问题 日志中出现诸如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介绍。
-
调用订阅接口时,回调地址如何获取? 以业务应用订阅设备数据变化通知为例,订阅和推送的流程如下: 图1 订阅推送流程图 应用服务器通过调用 物联网平台 的订阅接口订阅设备数据变化通知(携带回调地址和通知类型),物联网平台将业务应用的回调地址和订阅的通知类型存储到订阅列表中以便向业务应用推送设备数据变化消息。 设备上报数据给物联网平台。 物联网平台根据订阅时设置的回调地址,将设备数据主动推送给业务应用。 什么是回调地址? 回调地址(callbackUrl)是指业务应用自定义的,供外部访问的restful接口地址。当物联网平台向业务应用推送消息时,实际是调用业务应用的restful接口把数据发给业务应用。 回调地址的请求方式必须为POST。 怎样获取回调地址? 回调地址由通信方式、业务应用的访问地址和restful接口的URL组成,如https://server:port/URL。 通信方式建议使用https协议,保证业务应用与物联网平台的通信安全。使用https协议通信时,物联网平台需要加载证书,制作证书参考证书制作。 由于业务应用所在的网络不同,业务应用的访问地址也不同。 业务应用部署在公网时,业务应用的访问地址就是业务应用的公网IP:端口(或域名:端口)。 业务应用部署在局域网时,需要在业务应用配置网络穿透,生成业务应用的公网访问地址,具体配置自行从网上获取网络穿透工具的配置步骤。 不同通知类型的订阅,回调地址可以相同也可以不同,根据业务需求自定义。
-
单个IoTDA实例AMQP连接数量如何统计? 消息流转连接数量计算规则说明 适用范围:本规则适用于数据流转AMQP协议和MQTT协议的连接数量统计,统计数据用于技术规格使用限制计算。 活跃连接:活跃连接是指在统计周期内发生过以下任一行为的连接: 建立连接 进行订阅操作 获取业务数据 非活跃连接:是指在统计周期内未发生上述任何行为的连接。 统计周期:统计周期为12小时,即每12小时内对连接活跃情况进行检查。 统计方法:在每个统计周期内,仅统计活跃连接的数量,非活跃连接不计入统计结果。
-
订阅后消息推送失败如何处理? 问题描述 订阅后,应用服务器未正确接收到推送消息,或参考“连通性测试”,在设备接入管理控制台中使用连通性测试功能测试“第三方应用服务(HTTP推送)”,结果为推送失败。 图2 转发目标-连通性测试结果 可能原因 如果订阅地址是HTTPS地址,可能是服务端的证书制作有问题或者服务端证书对应的CA证书未上传至物联网平台 订阅地址对应的服务端口未开放。 若订阅地址为域名,并且域名绑定多个IP,可能是DNS解析问题。 解决方法 如果订阅地址是HTTPS地址,商用时,推荐向证书机构申请证书,然后参考设备接入平台上传证书进行证书上传。如果是调测时请先确保证书制作过程无误。上传证书时如果打开了“是否检查CNAME ”开关,需要确保应用服务器的域名地址和证书中的CNAME一致;证书中的CNAME可通过证书校验工具查看。 请确认订阅地址对应的服务端口是否开放。可在其他外网机器上使用telnet命令验证下您的IP和端口是否已开放,若未开放,请将其开放或修改订阅的IP和端口。 若订阅地址为域名,并且域名绑定多个IP,请确认DNS解析后的IP地址是否正确且可达。 使用设备接入管理控制台提供的“消息跟踪”功能,触发推送后,查看消息跟踪的数据,确认平台是否触发订阅推送,以及是否推送成功。 请在应用服务器抓包确认是否接收到设备接入平台推送的消息。
-
设备数据变化通知和批量设备数据变化通知的区别是什么? 设备数据变化通知和批量设备数据变化通知接口都是订阅设备的数据变化,只是封装的数据格式不一样。 例如:一款水表设备有Battery和Connectivity两种服务类型,每次上报数据都会上报这两个服务的数据。 如果订阅deviceDatachanged(设备数据变化通知),则物联网平台分两次将数据推送到应用服务器,第一次推送Battery服务数据,第二次推送Connectivity服务数据。例如: { "notifyType":"deviceDataChanged", "deviceId":"********", "gatewayId":"********", "requestId":null, "service":{ "serviceId":"battery", "serviceType":"battery", "data":{ "batteryLevel":66 }, "eventTime":"20170211T034003Z" } } { "notifyType":"deviceDataChanged", "deviceId":"********", "gatewayId":"********", "requestId":null, "service":{ "serviceId":"Connectivity", "serviceType":"Connectivity", "data":{ "signalStrength":72, "cellId":4022250974, "tac":61374, "mnc":91, "mcc":235 }, "eventTime":"20170211T092317Z" } } 如果订阅deviceDataschanged(批量设备数据变化通知),则物联网平台将两次服务的数据封装在一起发送到应用服务器。 { "notifyType":"deviceDatasChanged", "requestId":null, "deviceId":"********", "gatewayId":"********", "services":[ { "serviceId":"battery", "serviceType":"battery", "data":{ "batteryLevel":66 }, "eventTime":"20170211T034003Z" }, { "serviceId":"Connectivity", "serviceType":"Connectivity", "data":{ "signalStrength":72, "cellId":4022250974, "tac":61374, "mnc":91, "mcc":235 }, "eventTime":"20170211T034003Z" } ] }
-
为什么设备上报一条数据后应用服务器会收到多条推送? 可能有以下几种情况: 如果订阅的“notifyType”为“deviceDataChanged”,且多条消息推送的内容不同,可能是因为设备上报的数据包含了多个service(即“data”参数内包括多个JSON对象),物联网平台会将其拆成多条消息推送。 如果是接到两条消息,且一条消息的“notifyType”为“deviceDataChanged”,另一条消息的“notifyType”为“deviceDatasChanged”,说明您同时订阅了设备数据变化和设备数据批量变化,这种情况下设备上报数据物联网平台会推送两条消息。 如果是相同的消息反复推送,可能是因为应用服务器没有及时对推送消息返回响应,物联网平台认为推送失败了,启动了重推机制反复推送相同的消息。
-
计费周期 包年/包月设备接入资源的计费周期是根据您购买的时长来确定的(以UTC+8时间为准)。一个计费周期的起点是您开通或续费资源的时间(精确到秒),终点则是下一个自然月/年到期日的23:59:59,您可以简单的将月份/年份加1计算。 例如: 如果您在2023/03/08 15:50:04开通了一个时长为一个月的标准版实例,那么其计费周期为:2023/03/08 15:50:04 ~ 2023/04/08 23:59:59。 如果您在2023/02/08 15:50:04开通了一个时长为一个月的标准版实例,那么其计费周期为:2023/02/08 15:50:04 ~ 2023/03/08 23:59:59。 如果您在2024/02/08 15:50:04开通了一个时长为一个年的标准版实例(2024年为闰年),那么其计费周期为:2024/02/08 15:50:04 ~ 2025/02/08 23:59:59。
-
计费示例 假设您在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和购买时长,查看页面下方的“配置费用”即为您购买资源的价格。