总的来说:
相同点:
四个大厂,基本的架构相同:用户侧通过IoT SDK或者MQTT、CoAP、HTTP接口接入,IoT云提供消息的路由转发、计算存储等。安全方案则通过TLS+用户鉴权(用户名、密码,Acess Token等),协议数据的Payload部分均采用Json字符串,华为同时还支持二进制。
不同点:
阿里的功能更完善,用户鉴权部分最复杂,腾讯次之,华为偏重于硬件,小米的产品更像只供内部使用的一个原型 。阿里和华为的Topic命名以“/”开头,违反的业界的最佳实践。从公开的资料看,小米只支持HTTP接口的调用方式。
名词 | 描述 |
产品 | 设备的集合,通常指一组具有相同功能的设备。物联网平台为每个产品颁发全局唯一的ProductKey。每个产品下最多可以包含50万个设备。 |
设备 | 归属于某个产品下的具体设备。物联网平台为设备颁发产品内唯一的证书DeviceName。设备可以直接连接物联网平台,也可以作为子设备通过网关连接物联网平台。 |
分组 | 物联网平台支持建立设备分组,分组中可包含不同产品下的设备。通过设备组来进行跨产品管理设备。 |
网关 | 能够直接连接物联网平台的设备,且具有子设备管理功能,能够代理子设备连接云端。 |
子设备 | 本质上也是设备。子设备不能直接连接物联网平台,只能通过网关连接。 |
设备证书 | 设备证书指ProductKey、DeviceName、DeviceSecret。
|
ProductSecret | 由物联网平台颁发的产品密钥,通常与ProductKey成对出现,可用于一型一密的认证方案。该参数很重要,需要您保管好,不能泄露。 |
设备X.509证书 | 物联网平台支持设备使用X.509数字证书进行身份验证。您创建认证方式为X.509证书的设备后,物联网平台为设备颁发对应的X.509证书,证书信息包括:X.509数字证书(Certificate)、X.509证书ID(CertSN)和X.509证书密钥(PrivateKey)。 |
Topic | Topic是UTF-8字符串,是发布(Pub)/订阅(Sub)消息的传输中介。可以向Topic发布或者订阅消息。 |
Topic类 | 同一产品下不同设备的Topic集合,用${productkey}和${deviceName}通配一个唯一的设备,一个Topic类对一个ProductKey下所有设备通用。 |
发布 | 操作Topic的权限类型,对应的英文名称为Pub。可以往此类Topic中发布消息。 |
订阅 | 操作Topic的权限类型,对应的英文名称为Sub。可以从此类Topic中订阅消息。 |
RRPC | 全称:Revert-RPC。RPC(Remote Procedure Call)采用客户机/服务器模式,用户不需要了解底层技术协议,即可远程请求服务。RRPC则可以实现由服务端请求设备端,并能够使设备端响应的功能。 |
标签 | 标签分为产品标签、设备标签和分组标签。
|
Alink协议 | 阿里云定义的设备与云端之间的通信协议。 |
物模型 | 是对设备在云端的功能描述,包括设备的属性、服务和事件。物联网平台通过定义一种物的描述语言来描述物模型,称之为 TSL(即 Thing Specification Language),采用JSON格式,您可以根据TSL组装上报设备的数据。 |
属性 | 设备的功能模型之一,一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。属性支持 GET 和 SET 请求方式。应用系统可发起对属性的读取和设置请求。 |
服务 | 设备的功能模型之一,设备可被外部调用的能力或方法,可设置输入参数和输出参数。相比于属性,服务可通过一条指令实现更复杂的业务逻辑,如执行某项特定的任务。 |
事件 | 设备的功能模型之一,设备运行时的事件。事件一般包含需要被外部感知和处理的通知信息,可包含多个输出参数。例如,某项任务完成的信息,或者设备发生故障或告警时的温度等,事件可以被订阅和推送。 |
数据解析脚本 | 针对采用透传格式/自定义数据格式的设备,需要在云端编写数据解析脚本,将设备上报的二进制数据或自定义的JSON数据,转换为物联网平台支持的Alink JSON数据格式;将平台下发的Alink JSON格式数据,转换为设备支持的格式。 |
设备影子 | 是一个JSON文档,用于存储设备或者应用的当前状态信息。每个设备都会在云端有唯一的设备影子。无论该设备是否连接到Internet,您都可以使用设备影子通过MQTT协议或HTTP协议获取和设置设备的状态。 |
规则引擎 | 通过创建、配置规则,以实现数据流转和场景联动。 |
数据流转 | 物联网平台规则引擎的数据流转功能,可将Topic中的数据转发至其他Topic或其他阿里云服务进行存储或处理。 |
场景联动 | 场景联动是一种开发自动化业务逻辑的可视化编程方式。您可以通过可视化的方式定义设备之间联动规则,并将规则部署至云端或者边缘端。 |
服务端订阅 | 服务端订阅产品下所有类型的消息:设备上报消息、设备状态变化通知、网关发现子设备上报消息、设备生命周期变更消息和设备拓扑关系变更消息。目前支持两种方式实现服务端订阅:HTTP/2 SDK和消息服务(MNS)队列。 |
设备连接物联网平台,与物联网平台进行数据通信。物联网平台可将设备数据流转到其他阿里云产品中进行存储和处理。这是构建物联网应用的基础。
物联网平台提供IoT SDK,设备集成SDK后,即可安全接入物联网平台,使用设备管理、数据分析、数据流转等功能。
只有支持TCP/IP协议的设备可以集成IoT SDK。
边缘计算能力允许您在最靠近设备的地方构建边缘计算节点,过滤清洗设备数据,并将处理后的数据上传至云平台。
IoT Hub帮助设备连接阿里云物联网平台服务,是设备与云端安全通信的数据通道。IoT Hub支持PUB/SUB与RRPC两种通信方式,其中PUB/SUB是基于Topic进行的消息路由。
IoT Hub具有下列特性:
- 高性能扩展:支持线性动态扩展,可以支撑十亿设备同时连接。
- 全链路加密:整个通信链路以RSA,AES加密,保证数据传输的安全。
- 消息实时到达:当设备与IoT Hub成功建立数据通道后,两者间将保持长连接,以减少握手时间,保证消息实时到达。
- 支持数据透传: IoT Hub支持将数据以二进制透传的方式传到自己的服务器上,不保存设备数据,从而保证数据的安全可控性。
- 支持多种通信模式:IoT Hub支持RRPC和PUB/SUB两种通信模式,以满足您在不同场景下的需求。
- 支持多种设备接入协议:支持设备使用CoAP、MQTT、HTTPS协议接入物联网平台。
数据分析服务包括流数据分析和空间可视化。流数据分析用于设置数据处理任务,空间可视化可以将设备数据实时在二维地图或三维模型上展示出来。
物联网平台为您提供功能丰富的设备管理服务,包括:生命周期、设备分组、设备影子、物模型、数据解析、数据存储、在线调试、固件升级、远程配置、实时监控等。具体请参见相关功能文档。
当设备基于Topic进行通信时,您可以编写SQL对Topic中的数据进行处理,然后配置转发规则将数据转发到其他Topic或阿里云服务上进行存储和处理。例如:
- 转发到云数据库RDS、表格存储(Table Store)和时序时空数据库(TSDB)中进行存储。
- 转发到DataHub中,进而使用实时计算进行计算,使用MaxCompute进行大规模离线计算。
- 转发到函数计算(FC)中,进行事件计算。
- 转发到消息队列(RocketMQ)或消息服务(MNS)中,实现高可靠消费数据。
- 转发到另一个Topic中实现M2M通信。
-
- 安全认证&权限策略
-
安全是IoT的重要话题。阿里云物联网平台提供多重防护保障设备云端安全。
- 物联网平台为每个设备颁发唯一证书,设备使用证书进行身份验证连接物联网平台。
- 针对不同安全等级和产线烧录的要求,物联网平台为开发者提供了多种设备认证方式。
- 授权粒度精确到设备级别,任何设备只能对自己的Topic发布、订阅消息。服务端凭借阿里云AccessKey对账号下所属的Topic进行操作。
接入侧提供物联网SDK接入阿里云IoT。设备连接、消息路由可以由MQTT的Broker完成,设备认证、安全权限和设备管理由运动在IoT平台的服务程序完成。
物联网平台中,服务端和设备端通过Topic来实现消息通信。Topic是针对设备的概念,Topic类是针对产品的概念。产品的Topic类会自动映射到产品下的所有设备中,生成用于消息通信的具体设备Topic。
为了方便海量设备基于海量Topic进行通信,简化授权操作,物联网平台增加了产品Topic类的概念。Topic类是一类Topic的集合。例如,产品的自定义Topic类/${YourProductKey}/${YourDeviceName}/user/update
是具体Topic/${YourProductKey}/device1/user/update
和/${YourProductKey}/device2/user/update
的集合。
您创建设备后,产品的所有Topic类会自动映射到设备上。您无需单独为每个设备创建Topic。
关于Topic类的说明:
- Topic类中,以正斜线(/)进行分层,区分每个类目。其中,有两个类目为既定类目:${YourProductKey}表示产品的标识符ProductKey;${YourDeviceName}表示设备名称。
- 类目命名只能包含字母,数字和下划线(_)。每级类目不能为空。
- 设备操作权限:发布表示设备可以往该Topic发布消息;订阅表示设备可以订阅该Topic获取消息。
- Topic类是一个Topic模版配置,编辑更新某个Topic类后,可能对产品下所有设备使用该类Topic通信产生影响。建议在设备研发阶段设计好,设备上线后不再变更Topic类。
- 产品Topic类的订阅操作权限是定义产品(所有设备)对此类Topic是否有发起订阅指令(SUB)的权限。 订阅(SUB)和取消订阅(UNSUB)都需由设备发起。设备发送SUB指令订阅某个Topic后,该订阅永久生效;仅在设备发起UNSUB指令取消订阅该Topic后,订阅才会被取消。
如果您需要管控单个设备的消息收发,请在控制台的设备列表页或服务端调用DisableThing接口,禁用该设备;或在业务上管控发送给设备的消息。
产品的Topic类不用于通信,只是定义Topic。用于消息通信的是具体的设备Topic。
- Topic格式和Topic类格式一致。区别在于Topic类中的变量${YourDeviceName},在Topic中是具体的设备名称。
- 设备对应的Topic是从产品Topic类映射出来,根据设备名称而动态创建的。设备的具体Topic中带有设备名称(即DeviceName),只能被该设备用于消息通信。例如,Topic:
/${YourProductKey}/device1/user/update
归属于设备名为device1的设备,所以只能被设备device1用于发布或订阅消息,而不能被设备device2用于发布或订阅消息。
物联网平台有两类Topic。
类别 | 说明 |
系统Topic | 物联网平台预定义的Topic。 系统Topic包含展示在控制台产品、设备详情页下的Topic和各功能使用的Topic。具体功能使用的Topic请在对应功能的文档中查看。 例如,物模型相关的Topic一般以 |
自定义Topic | 您可以根据业务需求,自定义。 |
-
-
- M2M通讯
-
以智能灯和手机App连接为例,基于物联网平台的Topic消息路由服务,构建一个M2M设备间通信架构。智能灯控制流程如下图:
操作步骤
本示例中,智能灯的ProductKey为al123456789;DeviceName为light。
- 开发智能灯设备端。
本示例中,设备与物联网平台间的通信协议为MQTT。
- 在物联网平台,为手机App注册产品和设备。
上图示例中,手机App的ProductKey为al987654321;DeviceName为ControlApp。
当手机App用户注册登录时,服务器将App设备信息发送给手机App。手机App可以作为一个设备连接到物联网平台。
- 使用服务器,调用云端接口CreateTopicRouteTable,创建App Topic与智能灯Topic之间的消息路由关系。
- 将入参SrcTopic指定为App的Topic:
/al987654321/ControlApp/user/update
。 - 将入参DstTopics指定为智能灯的Topic:
/al123456789/light/user/set
。
- 将入参SrcTopic指定为App的Topic:
- 开发手机App。
本示例中,手机App与物联网平台间的通信协议为HTTPS。
手机App发送的智能灯控制指令payload数据格式如下:
{
"TargetDevice"
:
"light",
"Switch"
:
"off",
"Timestamp"
:
1557750407000
}
- 手机App用户通过扫码,将App与智能灯绑定。
当App向服务器发送绑定设备的请求后,服务器将返回绑定成功的智能灯设备名称deviceName。本示例中,智能灯设备名称为light。
- 通过App发送控制指令。
- 手机App发送指令到Topic:
/al987654321/ControlApp/user/update
。指令为JSON格式的数据。 - 物联网平台根据已定义的Topic路由关系,将指令信息路由到智能灯设备的Topic:/al123456789/light/user/set。
- 智能灯设备接收到指令后,执行相关操作。
- 手机App发送指令到Topic:
物联网平台支持广播通信,即向产品下的所有设备发送消息。设备仅需订阅广播Topic,即可收到服务器发送的广播消息。本文介绍广播通信的具体配置流程。
厂家有多个温度计接入物联网平台,现在需要服务器向全部温度计发送一条相同的精度指令。
设备端订阅相同的广播Topic,服务器调用PubBroadcast向该Topic发布消息。
-
-
- OTA升级
-
在物联网平台控制台上,创建新固件,上传固件文件包,完成固件验证,将固件推送给指定设备用于升级。
前提条件:
- 设备端已配置OTA升级功能。
只有设备端已支持OTA服务,才能上报固件版本,接收云端推送的升级消息,下载固件,进行升级等OTA升级操作。
- 已根据业务需要,编辑好新的固件文件。本示例的固件文件,请参见配置设备端OTA升级中的附录章节。
操作步骤
- 登录物联网平台控制台。
- 在左侧导航栏,选择监控运维 > 固件升级。
- 在固件升级页,单击新增固件。
- 在添加固件对话框中,输入固件信息,上传固件文件。
传入的固件文件是上一步配置设备端OTA升级中生成的.bin文件。
- 在固件列表中,单击固件对应的验证固件按钮,使用测试设备进行固件验证。
测试设备升级成功后,验证通过。批量升级功能显示为可用状态。
物联网平台支持使用云监控进行事件监控报警和阈值监控报警。事件监控报警基于物联网平台系统限流进行监控和报警;阈值监控报警基于您设置的业务指标数值进行监控和报警。
RAM 和 STS 是阿里云提供的权限管理系统。
RAM 的主要作用是控制账号系统的权限。通过使用 RAM,创建、管理子账号,并通过给子账号授予不同的权限,控制子账号对资源的操作权限。
STS 是一个安全凭证(Token)的管理系统,为阿里云子账号(RAM 用户)提供短期访问权限管理。通过 STS 来完成对临时用户的访问授权。
RAM 和 STS 解决的一个核心问题是如何在不暴露主账号的 AccessKey 的情况下,安全地授权他人访问。因为一旦主账号的 AccessKey 被泄露,会带来极大的安全风险:获得该账号 AccessKey 的人可任意操作该账号下所有的资源,盗取重要信息等。
RAM 提供的是一种长期有效的权限控制机制。通过创建子账号,并授予子账号相应的权限,将不同的权限分给不同的用户。子账号的 AccessKey 也不能泄露。即使子账号泄露也不会造成全局的信息泄露。一般情况下,子账号长期有效。
相对于 RAM 提供的长效控制机制,STS 提供的是一种临时访问授权。通过调用 STS,获得临时的 AccessKey 和 Token。可以将临时 AccessKey 和 Token 发给临时用户,用来访问相应的资源。从 STS 获取的权限会受到更加严格的限制,并且具有时间限制。因此,即使出现信息泄露的情况,影响相对较小。
使用 RAM 和 STS 涉及以下基本概念:
- 子账号:在 RAM 控制台中,创建的用户,每个用户即一个子账号。创建时或创建成功后,均可为子账号生成独立的 AccessKey。创建后,需为子账号配置密码和权限。使用子账号,可以进行已获授权的操作。子账号可以理解为具有某种权限的用户,可以被认为是一个具有某些权限的操作发起者。
- 角色(Role):表示某种操作权限的虚拟概念,但是没有独立的登录密码和 AccessKey。子账号可以扮演角色。扮演角色时,子账号拥有的权限是该角色的权限。
- 授权策略(Policy):用来定义权限的规则,如允许子账号用户读取或者写入某些资源。
- 资源(Resource):代表子账号用户可访问的云资源,如表格存储所有的 Instance、某个 Instance 或者某个 Instance 下面的某个 Table 等。
子账号和角色可以类比为个人和其身份的关系。如,某人在公司的角色是员工,在家里的角色是父亲。同一人在不同的场景扮演不同的角色。在扮演不同角色的时候,拥有对应角色的权限。角色本身并不是一个操作的实体,只有用户扮演了该角色之后才是一个完整的操作实体。并且,一个角色可以被多个不同的用户同时扮演。
为避免阿里云账号的 AccessKey 泄露而导致安全风险,某阿里云账号管理员使用 RAM 创建了两个子账号,分别命名为 A 和 B ,并为 A 和 B 生成独立的 AccessKey。A 拥有读权限,B 拥有写权限。 管理员可以随时在 RAM 控制台取消子账号用户的权限。
现在因为某些原因,需要授权给其他人临时访问物联网平台接口的权限。这种情况下,不能直接把 A 的 AccessKey 透露出去,而应该新建一个角色 C,并给这个角色授予读取物联网平台接口的权限。但请注意,目前角色 C 还无法直接使用。因为并不存在对应角色 C 的 AccessKey,角色 C 仅是一个拥有访问物联网平台接口权限的虚拟实体。
需调用 STS 的 AssumeRole 接口,获取访问物联网平台接口的临时授权。在调用 STS 的请求中,RoleArn 的值需为角色 C 的 Arn。如果调用成功,STS 会返回临时的 AccessKeyId、AccessKeySecret和 SecurityToken 作为访问凭证(凭证的过期时间,在调用 AssumeRole 的请求中指定)。将这个凭证发给需要访问的用户,该用户就可以获得访问物联网平台接口的临时权限。
虽然 RAM 和 STS 的概念和使用比较复杂,但这是为了账号的安全性和权限控制的灵活性而牺牲了部分易用性。
将子账号和角色分开,主要是为了将执行操作的实体和代表权限集合的虚拟实体分开。如果某用户需要使用多种权限,如读/写权限,但是实际上每次操作只需要其中的一部分权限,那么就可以创建两个角色。这两个角色分别具有读或写权限。然后,创建一个可以扮演这两个角色的用户子账号。当用户需要读权限的时候,就可以扮演其中拥有读权限的角色;使用写权限的时候同理。这样可以降低每次操作中权限泄露的风险。而且,通过扮演角色,可以将角色权限授予其他用户,更加方便了协同使用。
STS 对权限的控制更加灵活。如按照实际需求设置有效时长。但是,如果需要一个长期有效的临时访问凭证,则可以只适用 RAM 子账号管理功能,而无需使用 STS。
MQTT协议是基于PUB/SUB的异步通信模式,不适用于服务端同步控制设备端返回结果的场景。物联网平台基于MQTT协议制定了一套请求和响应的同步机制,无需改动MQTT协议即可实现同步通信。物联网平台提供API给服务端,设备端只需要按照固定的格式回复PUB消息,服务端使用API,即可同步获取设备端的响应结果。
- RRPC:Revert-RPC。RPC(Remote Procedure Call)采用客户机/服务器模式,用户不需要了解底层技术协议,即可远程请求服务。RRPC则可以实现由服务端请求设备端并能够使设备端响应的功能。
- RRPC 请求消息:云端下发给设备端的消息。
- RRPC 响应消息:设备端回复给云端的消息。
- RRPC 消息ID:云端为每次RRPC调用生成的唯一消息ID。
- RRPC 订阅Topic:设备端订阅RRPC消息时传递的Topic,含有通配符。
-
- RRPC原理
-
- 物联网平台收到来自用户服务器的RRPC调用,下发一条RRPC请求消息给设备。消息体为用户传入的数据,Topic为物联网平台定义的Topic,其中含有唯一的RRPC消息ID。
- 设备收到下行消息后,按照指定Topic格式(包含之前云端下发的唯一的RRPC消息ID)回复一条RRPC响应消息给云端,云端提取出Topic中的消息ID,和之前的RRPC请求消息匹配上,然后回复给用户服务器。
- 如果调用时设备不在线,云端会给用户服务器返回设备离线的错误;如果设备没有在超时时间内(8秒内)回复RRPC响应消息,云端会给用户服务器返回超时错误。
使用规则引擎,您需要基于Topic编写SQL处理数据。自定义Topic中数据格式由您自己定义,物联网平台不做处理。系统Topic中数据格式由物联网平台定义,此时您需要根据平台定义的数据格式处理数据。本文讲述了系统Topic中的数据格式。
通过该Topic获取设备的上下线状态。
数据流转Topic:/as/mqtt/status/{productKey}/{deviceName}
数据格式:
{
"status"
:
"online|offline",
"productKey"
:
"12345565569",
"deviceName"
:
"deviceName1234",
"time"
:
"2018-08-31 15:32:28.205",
"utcTime"
:
"2018-08-31T07:32:28.205Z",
"lastTime"
:
"2018-08-31 15:32:28.195",
"utcLastTime"
:
"2018-08-31T07:32:28.195Z",
"clientIp"
:
"123.123.123.123"
}
参数说明:
参数 | 类型 | 说明 |
status | String | 设备状态,online:上线;offline:离线。 |
productKey | String | 设备所属产品的唯一标识。 |
deviceName | String | 设备名称。 |
time | String | 发送通知的时间点。 |
utcTime | String | 发送通知的UTC时间点。 |
lastTime | String | 状态变更前最后一次通信的时间。 说明 为避免消息时序紊乱造成影响,建议您根据lastTime来维护最终设备状态。 |
utcLastTime | String | 状态变更前最后一次通信的UTC时间。 |
clientIp | String | 设备公网出口IP。 |
通过该Topic获取设备上报的属性信息。
Topic:/sys/{productKey}/{deviceName}/thing/event/property/post
数据格式:
{
"iotId"
:
"4z819VQHk6VSLmmBJfrf00107ee200",
"productKey"
:
"1234556554",
"deviceName"
:
"deviceName1234",
"gmtCreate"
:
1510799670074,
"deviceType"
:
"Ammeter",
"items"
:{
"Power"
:{
"value"
:
"on",
"time"
:
1510799670074
},
"Position"
:{
"time"
:
1510292697470,
"value"
:{
"latitude"
:
39.9,
"longitude"
:
116.38
}
}
}
}
参数说明:
参数 | 类型 | 说明 |
iotId | String | 设备在平台内的唯一标识。 |
productKey | String | 设备所属产品的唯一标识。 |
deviceName | String | 设备名称。 |
deviceType | String | 设备类型。 |
items | Object | 设备数据。 |
Power | String | 属性名称。产品所具有的属性名称请参见产品的TSL描述。 |
Position | String | 属性名称。产品所具有的属性名称请参见产品的TSL描述。 |
value | 根据TSL定义 | 属性值。 |
time | Long | 属性产生时间,如果设备没有上报默认采用云端生成时间。 |
gmtCreate | Long | 数据流转消息产生时间。 |
通过该topic获取设备上报的事件信息。
Topic:/sys/{productKey}/{deviceName}/thing/event/{tsl.event.identifier}/post
数据格式:
{
"identifier"
:
"BrokenInfo",
"name"
:
"损坏率上报",
"type"
:
"info",
"iotId"
:
"4z819VQHk6VSLmmBJfrf00107ee200",
"productKey"
:
"X5eCzh6fEH7",
"deviceName"
:
"5gJtxDVeGAkaEztpisjX",
"gmtCreate"
:
1510799670074,
"value"
:{
"Power"
:
"on",
"Position"
:{
"latitude"
:
39.9,
"longitude"
:
116.38
}
},
"time"
:
1510799670074
}
参数说明:
参数 | 类型 | 说明 |
iotId | String | 设备在平台内的唯一标识。 |
productKey | String | 设备所属产品的唯一标识。 |
deviceName | String | 设备名称。 |
type | String | 事件类型,事件类型参见产品的TSL描述。 |
value | Object | 事件的参数。 |
Power | String | 事件参数名称。 |
Position | String | 事件参数名称。 |
time | Long | 事件产生时间,如果设备没有上报默认采用远端时间。 |
gmtCreate | Long | 数据流转消息产生时间。 |
通过该Topic获得设备创建、删除、禁用、启用等消息。
Topic:/sys/{productKey}/{deviceName}/thing/lifecycle
数据格式:
{
"action"
:
"create|delete|enable|disable",
"iotId"
:
"4z819VQHk6VSLmmxxxxxxxxxxee200",
"productKey"
:
"X5eCxxxxEH7",
"deviceName"
:
"5gJtxDVeGAkaEztpisjX",
"deviceSecret"
:
"",
"messageCreateTime"
:
1510292739881
}
参数说明:
参数 | 类型 | 说明 |
action | String |
|
iotId | String | 设备在平台内的唯一标识。 |
productKey | String | 产品的唯一标识。 |
deviceName | String | 设备名称。 |
deviceSecret | String | 设备密钥,仅在action为create时包含。 |
messageCreateTime | Integer | 消息产生时间戳,单位毫秒。 |
通过该Topic获得子设备和网关之间拓扑关系建立和解除信息。
Topic:/sys/{productKey}/{deviceName}/thing/topo/lifecycle
数据格式:
{
"action"
:
"add|remove|enable|disable",
"gwIotId"
:
"4z819VQHk6VSLmmBJfrf00107ee200",
"gwProductKey"
:
"1234556554",
"gwDeviceName"
:
"deviceName1234",
"devices"
: [
{
"iotId"
:
"4z819VQHk6VSLmmxxxxxxxxxxee201",
"productKey"
:
"1234xxxx569",
"deviceName"
:
"deviceName1234"
}
],
"messageCreateTime"
:
1510292739881
}
参数说明:
参数 | 类型 | 说明 |
action | String |
|
gwIotId | String | 网关设备在平台内的唯一标识。 |
gwProductKey | String | 网关产品的唯一标识。 |
gwDeviceName | String | 网关设备名称。 |
devices | Object | 变更的子设备列表。 |
iotId | String | 子设备在平台内的唯一标识。 |
productKey | String | 子设备产品的唯一标识。 |
deviceName | String | 子设备名称 |
messageCreateTime | Integer | 消息产生时间戳,单位毫秒。 |
在一些场景中网关能够检测到子设备,并将检测到的子设备信息上报。此时可以通过该Topic获取到上报的信息。
Topic:/sys/{productKey}/{deviceName}/thing/list/found
数据格式:
{
"gwIotId"
:
"4z819VQHk6VSLmmBJfrf00107ee200",
"gwProductKey"
:
"1234556554",
"gwDeviceName"
:
"deviceName1234",
"devices"
:[
{
"iotId"
:
"4z819VQHk6VSLmmxxxxxxxxxxee201",
"productKey"
:
"1234xxxx569",
"deviceName"
:
"deviceName1234"
}
]
}
参数说明:
参数 | 类型 | 说明 |
gwIotId | String | 网关设备在平台内的唯一标识。 |
gwProductKey | String | 网关产品的唯一标识。 |
gwDeviceName | String | 网关设备名称。 |
devices | Object | 发现的子设备列表。 |
iotId | String | 子设备在平台内的唯一标识。 |
productKey | String | 子设备产品的唯一标识。 |
deviceName | String | 子设备名称。 |
通过该Topic可以获取,通过异步方式下发指令给设备,设备进行处理后返回的结果信息。如果下发指令过程中出现错误,也可以通过该Topic得到指令下发的错误信息。
Topic:/sys/{productKey}/{deviceName}/thing/downlink/reply/message
数据格式:
{
"gmtCreate"
:
1510292739881,
"iotId"
:
"4z819VQHk6VSLmmxxxxxxxxxxee200",
"productKey"
:
"123xxxx554",
"deviceName"
:
"deviceName1234",
"requestId"
:
1234,
"code"
:
200,
"message"
:
"success",
"topic"
:
"/sys/123xxxx554/deviceName1234/thing/service/property/set",
"data"
:{
}
}
参数说明:
参数 | 类型 | 说明 |
gmtCreate | Long | UTC时间戳。 |
iotId | String | 设备在平台内的唯一标识。 |
productKey | String | 设备所属产品的唯一标识。 |
deviceName | String | 设备名称。 |
requestId | Long | 阿里云产生和设备通信的信息ID。 |
code | Integer | 调用的结果信息。 |
message | String | 结果信息说明。 |
data | Object | 设备返回的结果。Alink格式数据直接返回设备处理结果,透传格式数据则需要经过脚本转换。 |
返回信息:
参数 | 类型 | 说明 |
200 | success | 请求成功。 |
400 | request error | 内部服务错误, 处理时发生内部错误。 |
460 | request parameter error | 请求参数错误, 设备入参校验失败。 |
429 | too many requests | 请求过于频繁。 |
9200 | device not actived | 设备没有激活。 |
9201 | device offline | 设备不在线。 |
403 | request forbidden | 请求被禁止,由于欠费导致。 |
名词 | 解释 |
APPEUI | LoRA网络中的设备应用标识码,由云分配或客户在创建产品时注册,全网唯一,用于标识该设备所属应用组,仅支持16位长度的16进制数(由数字0 - 9及字母a - f组合)。 |
产品 | 某一类设备的集合,通常指一组具有相同功能的设备。物联网通信为每个产品颁发全局唯一的 ProductID,每个产品下可以创建多个设备。 产品 ID 平台为产品分配的唯一标识,方便产品检索,并用于设备与平台建立连接时的身份认证。 |
产品类型 | 在物联网通信中,根据实际连接物联网通信平台的设备通信方式选择,针对 NB 与 LoRa 类的产品,平台会对数据传输链路做针对性处理。 在物联网开发平台中,根据不同的应用场景,定义了各种硬件产品在不同应用领域进行的分类 |
DevEUI | LoRA设备的唯一标识,用于标记 LoRA 设备的硬件地址,全网唯一;客户可以从供应商或设备上找到该标识,也可以使用由云端分配的局部唯一标识地址,仅支持16位长度的小写字母(a - f)与数字(0 - 9)组合。 订阅 操作 Topic 的权限类型,对应的英文名称为 Sub,具有从 Topic 中订阅消息的权限。
|
节点类型 | 根据实际连接物联网通信平台的设备类型选择,分为设备类型与网关类型。 |
ProductSecret | 产品级密钥,用于设备动态注册请求时计算设备端签名,换取设备级密钥或证书+私钥 |
认证方式 | 设备连接认证支持证书认证(基于 TLS 非对称加密认证、适用高安全要求场景)和密钥认证(对称加密验证、适用资源受限设备)方式,设备级粒度身份认证,保证云到设备和设备到云的消息的保密性。同时,平台为无法给每个设备烧录不同固件的场景设计了动态注册功能,支持通过产品级密钥注册获取设备密钥(或证书+私钥),再进行连接认证,增强了接入的灵活性 |
设备密钥 | 创建密钥认证类型的设备时平台为设备颁发的唯一密钥,用于签名计算 connect password,设备建立连接时物联网通信平台会强校验设备端密钥,确保身份合法 |
设备影子 | 本质上是一份在服务端缓存的设备数据(JSON 文档形式),主要用于保存设备的当前状态与设备的期望配置 |
设备证书 | 创建证书认证类型的设备时平台为设备颁发的唯一证书文件,设备建立连接时物联网通信平台会强校验设备端证书文件,确保身份合法 |
腾讯云物联网通信(Internet of Things Hub, IoT Hub)旨在提供一个安全、稳定、高效的连接平台,帮助开发者低成本、快速地实现“设备-设备”、“设备-用户应用”、“设备-云服务”之间可靠、高并发的数据通信。不仅可以实现设备之间的互动、设备的数据上报和配置下发,还可以基于规则引擎和腾讯云产品打通,方便快捷地实现海量设备数据的存储、计算以及智能分析。
生命周期管理
支持控制台对设备进行注册生产、删除销毁等管理能力。还可通过 SDK 工具包,快速操作,提高效率。当前支持 Python、PHP、JAVA 工具包。
设备状态
全程对设备状态监控、有效实时获取状态变更通知。
分组管理
支持对不同产品下的设备进行分组管理,满足不同业务场景下对于不同品类设备多级管理的需求。
日志采集
支持对设备上下行通信日志、设备消息内容日志以及设备端调试 SDK 日志进行采集上报,满足客户多业务场景的查询需求。
设备能发布和订阅的 topic 受到权限控制管理,一个产品下的所有设备具备相同的 topic 类权限。对于 MQTT 协议传输,支持 QoS=0 和 QoS=1 等消息特性。支持离线消息存储。借助规则引擎,可以实现设备之间的快速消息通信能力。
设备影子本质上是一份在服务器端缓存的设备数据(JSON 形式),主要用于保存:
- 设备的当前配置
- 设备的当前状态
作为中介,设备影子可以有效实现设备和用户应用之间的数据双向同步:
- 对于设备配置,用户应用不需要直接修改设备,只需要修改服务器端的设备影子,由设备影子同步到设备。即使当时设备不在线,设备上线后仍能从设备影子同步到最新配置。
- 对于设备状态,设备将状态上报到设备影子,用户应用查询时,只需查询设备影子即可。这样可以有效减少设备和服务器端的网络交互,尤其是低功耗设备。
一个腾讯云账号下,最多可以创建2000个产品,每个产品下最多创建200000个设备。一个设备只能隶属于一个产品。产品名和设备名在同一云账号下唯一。
在腾讯物联网通信,设备能够发布和订阅的 Topic 受到严格管理。一个产品下的所有设备具备相同的 Topic 类 权限,默认包括:
Topic | 说明 |
${productId}/${deviceName}/event | 发布权限,用于设备上报数据 |
${productId}/${deviceName}/control | 订阅权限,用于设备获取后台下发的数据 |
上述$符包含的 productId、deviceName,针对具体创建的设备,将映射为具体的产品 Id 和设备名字。举例,一个产品名字为 pro 的产品(假设产品Id是“pro_id”)下有2个设备(假设设备名字分别为 “dev_1”、“dev_2”),那么 dev_1 可以发布的 Topic 包括 pro_id/dev_1/event,可以订阅的 topic 包括 pro_id/dev_1/control,但是不可以发布 pro_id/dev_2/event,不可以订阅 pro_id/dev_2/control。
用户可以通过控制台进行 Topic 权限的编辑修改、增删产品的 Topic 类权限。
为了方便设备 SDK 订阅批量的 Topic ,设备进行订阅和取消订阅时可以使用通配符来表示多个符合的 Topic。
对于 MQTT 的数据传输,腾讯物联网通信支持 QoS=0 或 1,但不支持 QoS=2。基于 MQTT 协议。设备消息支持离线存储。
设备影子本质上是一份在服务器端缓存的设备数据(JSON 形式),主要用于保存:
- 设备的当前配置
- 设备的当前状态
作为中介,设备影子可以有效实现设备和用户应用之间的数据双向同步:
- 对于设备配置,用户应用不需要直接修改设备,只需要修改服务器端的设备影子,由设备影子同步到设备。即使当时设备不在线,设备上线后仍能从设备影子同步到最新配置。
- 对于设备状态,设备将状态上报到设备影子,用户应用查询时,只需查询设备影子即可。这样可以有效减少设备和服务器端的网络交互,尤其是低功耗设备。
-
-
- OTA升级
-
支持 OTA 固件升级服务,当设备固件有安全隐患或者功能漏洞时,物联网服务端支持通过 OTA 升级,消除隐患,降低安全风险。
-
-
-
- 实现原理
-
-
固件升级的过程中,需要设备订阅下面两个 Topic 来实现与云端的通信,如下图所示:
示例:
$ota/report/${productID}/${deviceName}
用于发布(上行)消息,设备上报版本号及下载、升级进度到云端
$ota/update/${productID}/${deviceName}
用于订阅(下行)消息,设备接收云端的升级消息
-
-
-
- 操作流程
-
-
以 MQTT 为例,设备的升级流程如下所示:
- 设备上报当前版本号。设备端通过 MQTT 协议发布一条消息到 Topic
$ota/report/${productID/${deviceName}
,进行版本号的上报,消息为 json 格式,内容如下:
{
"type": "report_version",
"report":{
"version": "0.1"
}
}
// type
:消息类型
// version
:上报的版本号
- 然后您可以在控制台上传固件。
- 在控制台将指定的设备升级到指定的版本。
- 触发固件升级操作后,设备端会通过订阅的 Topic
$ota/update/${productID}/${deviceName}
收到固件升级的消息,内容如下:
{
"file_size": 708482,
"md5sum": "36eb5951179db14a631463a37a9322a2",
"type": "update_firmware",
"url": "https://ota-1255858890.cos.ap-guangzhou.myqcloud.com",
"version": "0.2"
}
// type
:消息类型为
update_firmware
// version
:升级版本
// url
:下载固件的
url
// md5asum
:固件的
MD5
值
// file_size
:固件大小,单位为字节
- 设备在收到固件升级的消息后,根据 URL 下载固件,下载的过程中设备 SDK 会通过 Topic
$ota/report/${productID}/${deviceName}
不断的上报下载进度,上报的内容如下:
{
"type": "report_progress",
"report":{
"progress":{
"state":"downloading",
"percent":"10",
"result_code":"0",
"result_msg":""
},
"version": "0.2"
}
}
// type
:消息类型
// state
:状态为正在下载中
// percent
:当前下载进度,百分比
- 当设备下载完固件,设备需要通过 Topic
$ota/report/${productID}/${deviceName}
上报一条开始升级的消息,内容如下:
{
"type": "report_progress",
"report":{
"progress":{
"state":"burning",
"result_code":"0",
"result_msg":""
},
"version": "0.2"
}
}
// type
:消息类型
// state
:状态为烧制中
-
- 设备固件升级完成后,再向 Topic
$ota/report/${productID}/${deviceName}
上报升级成功消息,内容如下:
- 设备固件升级完成后,再向 Topic
{
"type": "report_progress",
"report":{
"progress":{
"state":"done",
"result_code":"0",
"result_msg":""
},
"version": "0.2"
}
}
// type
:消息类型
// state
:状态为已完成
注意:
在下载固件或升级固件的过程中,如果失败,则通过 Topic $ota/report/${productID}/${deviceName}
上报升级失败消息,内容如下:
{
"type": "report_progress",
"report":{
"progress":{
"state":"fail",
"result_code":"-1",
"result_msg":"time_out"
},
"version": "0.2"
}
}
// state
:状态为失败
// result_code
:错误码,
-1
:下载超时;
-2
:文件不存在;
-3
:签名过期;
-4:MD5
不匹配;
-5
:更新固件失败
// result_msg
:错误消息
物联网通信平台为每个创建的产品分配唯一标识 ProductID,用户可以自定义 Devicename 标识设备,用产品标识 + 设备标识 + 设备证书/密钥来验证设备的合法性。用户在创建产品时需要选择设备认证方式,在设备接入时需要根据指定的方式上报产品、设备信息与对应的密钥信息,认证通过后才能连接物联网通信平台。由于不同用户的设备端资源、安全等级要求都不同,平台提供了多种认证方案,以满足不同的使用场景。
物联网通信平台提供以下三种认证方案:
- 证书认证(设备级):为每台设备分配证书 + 私钥,使用非对称加密认证接入,用户需要为每台设备烧录不同的配置信息。
- 密钥认证(设备级):为每台设备分配设备密钥,使用对称加密认证接入,用户需要为每台设备烧录不同的配置信息。
- 动态注册认证(产品级):为同一产品下的所有设备分配统一密钥,设备通过注册请求获取设备证书/密钥后认证接入,用户可以为同一批设备烧录相同的配置信息。
三种方案在易用性、安全性和对设备资源要求上各有优劣,您可以根据自己的业务场景综合评估选择。方案对比如下:
特性 | 证书认证 | 密钥认证 | 动态注册认证 |
设备烧录信息 | ProductId、Devicename、 | ProductId、Devicename、设备密钥 | ProductId、Devicename、ProductSecret |
是否需要提前创建设备 | 必须 | 必须 | 支持根据注册请求中携带的 Devicename 自动创建 |
安全性 | 高 | 一般 | 一般 |
使用限制 | 单产品下最多创建20万设备 | 单产品下最多创建20万设备 | 单产品下最多创建20万设备,用户可自定义通过注册请求自动创建的设备数上限 |
设备资源要求 | 较高,需要支持 TLS | 较低 | 较低,支持 AES 即可 |
腾讯云 API 的所有接口均通过 HTTPS 进行通信,提供高安全性的通信通道。
支持的 HTTP 请求方法:
- POST(推荐)
- GET
POST 请求支持的 Content-Type 类型:
- application/json(推荐),必须使用 TC3-HMAC-SHA256 签名方法。
- application/x-www-form-urlencoded,必须使用 HmacSHA1 或 HmacSHA256 签名方法。
- multipart/form-data(仅部分接口支持),必须使用 TC3-HMAC-SHA256 签名方法。
GET 请求的请求包大小不得超过32KB。POST 请求使用签名方法为 HmacSHA1、HmacSHA256 时不得超过1MB。POST 请求使用签名方法为 TC3-HMAC-SHA256 时支持10MB。
均使用UTF-8
编码。
设备属性
被如下接口引用:CreateDevice。
名称 | 类型 | 必选 | 描述 |
Tags | Array of DeviceTag | 否 | 属性列表 |
批量发消息请求
被如下接口引用:CreateTask。
名称 | 类型 | 必选 | 描述 |
Topic | String | 是 | 消息发往的主题。为 Topic 权限中去除 ProductID 和 DeviceName 的部分,如 “event” |
Payload | String | 是 | 消息内容 |
批量更新设备影子任务
名称 | 类型 | 必选 | 描述 |
Desired | String | 是 | 设备影子的期望状态,格式为 Json 对象序列化之后的字符串 |
代理订阅信息
名称 | 类型 | 必选 | 描述 |
ProductId | String | 是 | 产品ID |
DeviceName | String | 是 | 设备名 |
设备详细信息
名称 | 类型 | 描述 |
DeviceName | String | 设备名 |
Online | Integer | 设备是否在线,0不在线,1在线 |
LoginTime | Integer | 设备登录时间 |
Version | String | 设备版本 |
DeviceCert | String | 设备证书,证书加密的设备返回 |
DevicePsk | String | 设备密钥,密钥加密的设备返回 |
Tags | Array of DeviceTag | 设备属性 |
DeviceType | Integer | 设备类型 |
Imei | String | IMEI |
Isp | Integer | 运营商类型 |
NbiotDeviceID | String | NB IOT运营商处的DeviceID |
ConnIP | Integer | IP地址 |
LastUpdateTime | Integer | 设备最后更新时间 |
LoraDevEui | String | LoRa设备的dev eui |
LoraMoteType | Integer | LoRa设备的Mote type |
FirstOnlineTime | Integer | 首次上线时间 |
LastOfflineTime | Integer | 最近下线时间 |
CreateTime | Integer | 设备创建时间 |
LogLevel | Integer | 设备日志级别 |
CertState | Integer | 设备证书获取状态, 1 已获取过设备密钥,0 未获取过设备密钥 |
EnableState | Integer | 设备可用状态,0禁用,1启用 |
设备属性
名称 | 类型 | 必选 | 描述 |
Tag | String | 是 | 属性名称 |
Type | Integer | 是 | 属性值的类型,1 int,2 string |
Value | String | 是 | 属性的值 |
描述键值对过滤器,用于条件过滤查询。例如过滤ID、名称、状态等
名称 | 类型 | 必选 | 描述 |
Name | String | 是 | 过滤键的名称 |
Values | Array of String | 是 | 一个或者多个过滤值 |
创建设备时返回的设备信息
名称 | 类型 | 描述 |
DeviceName | String | 设备名 |
DevicePsk | String | 对称加密密钥,base64 编码,采用对称加密时返回该参数 |
DeviceCert | String | 设备证书,采用非对称加密时返回该参数 |
DevicePrivateKey | String | 设备私钥,采用非对称加密时返回该参数,腾讯云为用户缓存起来,其生命周期与任务生命周期一致 |
Result | Integer | 错误码 |
ErrMsg | String | 错误信息 |
产品详细信息
名称 | 类型 | 描述 |
ProductId | String | 产品ID |
ProductName | String | 产品名 |
ProductMetadata | 产品元数据 | |
ProductProperties | 产品属性 |
产品元数据
名称 | 类型 | 描述 |
CreationDate | Integer | 产品创建时间 |
产品属性
名称 | 类型 | 必选 | 描述 |
ProductDescription | String | 否 | 产品描述 |
EncryptionType | String | 否 | 加密类型,1表示证书认证,2表示签名认证。如不填写,默认值是1 |
Region | String | 否 | 产品所属区域,目前只支持广州(gz) |
ProductType | Integer | 否 | 产品类型,各个类型值代表的节点-类型如下: |
Format | String | 否 | 数据格式,取值为json或者custom,默认值是json |
Platform | String | 否 | 产品所属平台,默认值是0 |
Appeui | String | 否 | LoRa产品运营侧APPEUI,只有LoRa产品需要填写 |
ModelId | String | 否 | 产品绑定的物模型ID,-1表示不绑定 |
ModelName | String | 否 | 产品绑定的物模型名称 |
ProductKey | String | 否 | 产品密钥,suite产品才会有 |
RegisterType | Integer | 否 | 动态注册类型 0-关闭, 1-预定义设备名 2-动态定义设备名 |
ProductSecret | String | 否 | 动态注册产品秘钥 |
RegisterLimit | Integer | 否 | RegisterType为2时,设备动态创建的限制数量 |
任务描述细节
名称 | 类型 | 必选 | 描述 |
UpdateShadowTask | 否 | 批量更新影子任务的描述细节,当 taskType 取值为 “UpdateShadow” 时,此字段必填。描述见下 BatchUpdateShadow | |
PublishMessageTask | 否 | 批量下发消息任务的描述细节,当 taskType 取值为 “PublishMessage” 时,此字段必填。描述见下 BatchPublishMessage |
任务列表详细信息
名称 | 类型 | 描述 |
Type | String | 任务类型,目前取值为 “UpdateShadow” 或者 “PublishMessage” |
Id | String | 任务 ID |
ProductId | String | 产品 ID |
Status | Integer | 状态。1表示等待处理,2表示调度处理中,3表示已完成,4表示失败,5表示已取消 |
CreateTime | Integer | 任务创建时间,Unix 时间戳 |
UpdateTime | Integer | 最后任务更新时间,Unix 时间戳 |
RetCode | Integer | 返回的错误码 |
ErrMsg | String | 返回的错误信息 |
创建规则请求包体
名称 | 类型 | 必选 | 描述 |
Sql | String | 是 | 规则的SQL语句,如: SELECT * FROM 'pid/dname/event',然后对其进行base64编码,得:U0VMRUNUICogRlJPTSAncGlkL2RuYW1lL2V2ZW50Jw== |
Actions | String | 否 | 行为的JSON字符串,大部分种类举例如下: |
Description | String | 否 | 规则描述 |
RuleDisabled | Boolean | 否 | 是否禁用规则 |
名词 | 描述 |
开发中心 | 是基于设备管理服务提供的物联网一站式开发工具,帮助开发者快速进行Profile(产品模型)和编解码插件的开发,同时提供在线自助测试、产品发布等多种能力,端到端指引物联网开发,帮助开发者提升集成开发效率、缩短物联网解决方案建设周期。 |
产品中心 | 产品中心为客户展示通过华为IoT生态认证的解决方案、终端产品、模组等商用产品,并与全球IoT商用平台联网,实现产品一点接入,全球可达,帮助客户缩短商业变现周期,降低商业风险。 |
项目 | 指物联网平台的资源空间。开发者在基于开发者中心进行物联网开发时,需要根据行业属性创建独立的项目,并在该项目空间内建设物联网产品和应用。 |
产品 | 某一类具有相同能力或特征的设备的集合称为一款产品。除了设备实体,产品还包含该类设备在物联网能力建设中产生的产品信息、产品模型(Profile)、插件、测试报告等资源。 |
产品模型 | 产品模型(也称Profile)用于描述设备具备的能力和特性。开发者通过定义Profile,在物联网平台构建一款设备的抽象模型,使平台理解该款设备支持的服务、属性、命令等信息。 |
服务 | 产品模型的一部分,描述设备具备的业务能力。将设备业务能力拆分成若干个服务后,再定义每个服务具备的属性、命令以及命令的参数。 |
属性 | 产品模型的一部分,一般用于描述设备运行时的状态,如环境监测设备所读取的当前环境温度等。 |
编解码插件 | 物联网平台和应用服务器使用JSON格式进行通信,所以当设备使用二进制格式上报数据时,开发者需要在物联网平台上开发编解码插件,帮助物联网平台完成二进制格式和JSON格式的转换。 |
应用 | 物联网平台中,应用包括用户在物联网平台上创建的应用和用户自行开发的应用服务器。
|
设备 | 归属于某个产品下的设备实体,每个设备具有一个唯一的标识码。设备可以是直连物联网平台的设备,也可以是代理子设备连接物联网平台的网关。 |
网关 | 具有子设备管理功能,并代理子设备连接物联网平台的设备实体。 |
子设备 | 不与IoT平台直连,通过网关连接物联网平台的设备实体。 |
边缘节点 | 是物联网的边缘“小脑”,在靠近物或数据源头的边缘侧,融合网络、计算、存储、应用核心能力的开放平台,就近提供计算和智能服务,满足行业在实时业务、应用智能、安全与隐私保护等方面的基本需求。 |
模组 | 又称通信模组,由若干个显示模块、驱动电路、控制电路、芯片以及相应的结构件构成的一个独立的显示单元,设备通过通信模组具备与物联网平台的通信能力。当前模组厂商主要提供Wifi、NB-IoT、2/3/4/5G等通信模组。 |
固件 | 固件(Firmware)一般是指设备硬件的底层“驱动程序”,承担着一个系统最基础最底层工作的软件,比如计算机主板上的基本输入/输出系统BIOS(Basic Input/output System)。 固件升级又称为FOTA(Firmware Over The Air),是指用户可以通过OTA的方式对支持LWM2M协议的设备进行固件升级,升级协议为LWM2M协议。 |
软件 | 软件(Software)一般分为系统软件和应用软件,系统软件实现设备最基本的功能,比如编译工具、系统文件管理等;应用软件可以根据设备的特点,提供不同的功能,比如采集数据、数据分析处理等。 软件升级又称为SOTA(SoftWare Over The Air),是指用户可以通过OTA的方式支持对LWM2M协议的设备进行软件升级,升级协议为PCP协议。 |
PCP协议 | 平台升级协议(PCP协议)规定了设备和平台之间升级的通信内容与格式,用于实现设备的升级。 |
nodeId | 设备唯一物理标识,如IMEI、MAC地址等,用于设备在接入物联网平台时携带该标识信息完成注册鉴权。 |
deviceId | 设备ID,用于唯一标识一个设备,在注册设备时由物联网平台分配获得,是设备在IoT平台上的内部标识,用于设备注册鉴权,及后续在网络中通过deviceId进行消息传递。 |
预置密钥 | 当NB-IoT设备、集成Agent Lite SDK的设备接入时,预置密钥用于设备和物联网平台之间的传输通道安全加密。 |
密钥 | 用于设备采用原生MQTT协议接入物联网平台时的鉴权认证。 |
数字证书 | 由国际知名的证书机构VeriSign、Symantec和GlobalSign等CA(Certification Authority)机构进行签发,用于HTTPS建链时服务端和客户端之间的身份合法性验证。 |
token | 鉴权参数,访问物联网平台API接口的凭证。应用服务器首次访问物联网平台的开放API时,需调用鉴权接口完成认证鉴权,获取accessToken。 |
群组 | 群组是一系列设备的集合,用户可以对应用下所有设备,根据区域、类型等不同规则进行分类建立群组,以便处理对海量设备的批量管理和操作。 |
标签 | 物联网平台支持定义不同的标签,并对设备打标签,通过标签,可以快速筛选设备。 |
订阅推送 | 订阅:是指应用服务器通过调用物联网平台的API接口,向平台获取发生变更的设备业务信息(如设备注册、设备数据上报、设备状态等)和管理信息(软固件升级状态和升级结果)。 推送:是指订阅成功后,物联网平台根据应用服务器订阅的数据类型,将对应的变更信息推送给指定的URL地址。 |
Topic | Topic是UTF-8字符串,是发布/订阅(Pub/Sub)消息的传输中介。可以向Topic发布或者订阅消息。 |
设备影子 | 设备影子是一个JSON文件,用于存储设备的在线状态、设备最近一次上报的设备属性、应用服务器期望下发的配置(期望值)。每个设备有且只有一个设备影子,设备可以获取和设置设备影子以此来同步状态,这个同步可以是影子同步给设备,也可以是设备同步给影子。 |
规则引擎 | 物联网平台根据用户设置的规则和设备上报的数据,当设备满足设置的条件时,即触发对应动作,给设备下发命令或将数据转发给公有云其他服务进行进一步整合利用。包含设备联动和数据转发两种类型。 |
NB-IoT | 窄带物联网(Narrow Band Internet of Things, NB-IoT)是IoT领域的一个重要技术。NB-IoT构建于蜂窝网络,只消耗大约180kHz的带宽,可直接部署于GSM网络、UMTS网络或LTE网络,以降低部署成本、实现平滑升级。其具有覆盖广、连接多、速率低、成本低、功耗低、架构优等特点,可以广泛应用于多种垂直行业,如远程抄表、智慧农业等。 |
MQTT | MQTT(Message Queue Telemetry Transport)是一个物联网传输协议,被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务。 MQTTS指MQTT+SSL/TLS,在MQTTS中使用SSL/TLS协议进行加密传输。 |
CoAP | 受约束的应用协议CoAP(Constrained Application Protocol)是一种软件协议,旨在使非常简单的电子设备能够在互联网上进行交互式通信。 CoAPS指CoAP over DTLS,在CoAPS中使用DTLS协议进行加密传输。 |
LWM2M | LWM2M(lightweight Machine to Machine)是由OMA(Open Mobile Alliance)定义的物联网协议,主要使用在资源受限(包括存储、功耗等)的NB-IoT终端。 |
华为OceanConnect 物联网平台(简称物联网平台)提供海量设备的接入和管理,配合华为云其他产品同时使用,帮助快速构筑物联网应用。
当用户在开通设备管理服务时,系统默认一起开通设备接入服务,即用户在使用设备管理服务时,包含设备接入服务的能力。
物联网平台支持终端设备直接接入,也可以通过工业网关或者家庭网关接入;支持多网络接入、多协议接入、系列化Agent接入,解决设备接入复杂多样化和碎片化难题;提供基础的设备管理功能,实现设备的快速接入。
功能 | 简介 |
多网络接入 | 支持有线和无线的接入方式,如固定宽带、2G/3G/4G/5G、NB-IoT、Z-Wave、ZigBee、eLTE等。详细请参见设备集成引导。 |
多协议接入 | 支持设备通过LWM2M、CoAP、MQTT(S)等协议接入。详细请参见设备集成引导。 |
系列化Agent接入 | 支持Agent Lite和Agent Tiny,覆盖的语言包括C、Java、Android。Agent与海思、高通主流芯片、模组预集成,缩短TTM。详细请参见设备集成引导。 |
设备双向通信 | 物联网平台提供设备数据采集功能,例如设备业务数据、设备告警,同时支持应用对设备数据的订阅。详细请参见订阅推送。 支持通过应用服务器或控制台以下发命令的方式,将命令下发到设备,达到平台对设备远程控制的效果。详细请参见命令下发。 |
应用对接 | 物联网平台开放了海量的API接口和SDK,帮助开发者快速孵化行业应用。详细查看应用对接指引。 |
设备影子 | 设备影子是一个JSON文档,用于存储设备的状态、设备最近一次上报的设备属性、应用服务器期望下发的配置。每个设备有且只有一个设备影子,设备可以获取和设置设备影子以此来同步状态,这个同步可以是影子同步给设备,也可以是设备同步给影子。详细请参见设备影子。 |
数据转发规则 | 数据转发规则是规则引擎的一种,用于将物联网平台接收的设备数据,转发到华为公有云的其它服务进行数据分析、存储等。详细请参见规则引擎。 |
设备实时状态监控 | 物联网平台实时监控设备的状态,包括在线、离线、未激活,实时获取状态变更通知。详细请参见设备监控。 |
审计日志 | 控制台对所有物联网平台的使用人员的操作日志、安全日志(登录、登出、密码修改等)进行记录,便于日志分析和故障定位。详细请参见设备监控。 |
设备管理在设备接入基础上,提供了更丰富完备的设备管理能力,简化海量设备管理复杂性,节省人工操作,提升管理效率。
功能 | 简介 |
产品模型定义 | 用于定义一款接入设备所具备的属性(如颜色、大小、采集的数据、可识别的指令或者设备上报的事件等信息),然后通过厂家、设备类型和设备型号,唯一标识一款设备,便于平台识别。产品模型可通过开发中心进行无码化开发。详细请参见产品模型。 |
设备访问授权 | 支持将设备的管理权限授权给其他应用,便于同一个用户管理多个应用的设备。详情请参见授权访问。 |
数据持久化存储 | 提供设备上报数据的存储,可按照时、天等维度查看设备上报的历史数据。历史数据最多存储7天。详情请参见数据上报。 |
设备联动规则 | 设备联动规则是规则引擎的一种,通过设置一个规则的触发条件(如温度阈值、时间等),在满足触发条件时,物联网平台会触发一个指令来使设备执行一个操作(如上报信息、打开设备开关、上报告警等)。详细请参见规则引擎。 |
告警管理 | 支持管理通过规则引擎里定义触发的设备告警,包括查看告警详情和恢复告警。详细请参见设备监控。 |
设备分组及标签 | 支持对设备进行群组和标签管理,通过有效分组和批量管理,减轻设备管理成本。详细请参见群组与标签。 |
设备批操作 | |
设备远程诊断 | 支持远程进行设备的运行日志收集、重启模组操作。详细请参见远程诊断。 |
设备配置更新 | 支持通过应用服务器或控制台以下发命令的方式,对设备的属性值进行更新。详细请参见设备配置更新。 |
设备OTA升级 | 支持通过OTA(Over the Air)的方式,对终端设备进行软件、硬件的升级操作,并通过软固件升级策略管理(群组、升级时间、并发数控制等),有效提升升级灵活性。详细请参见固件升级、软件升级。 |
报表统计 | 在控制台上提供了丰富的报表功能,方便用户查看应用和设备的使用情况。详细请参见设备监控。 |
- 物联网平台作为消息接收方时,已默认订阅了相关Topic,设备只要向对应Topic发送消息,物联网平台就可以接收。
- 设备作为消息接收方时,需要先订阅相关Topic,这样物联网平台向对应Topic发送消息时,设备才能接收到。设备需要根据具体实现的业务来决定订阅哪些Topic。
Topic | 消息发送方 (Publisher) | 消息接收方 (Subscriber) | 说明 |
/huawei/v1/devices/{deviceId}/data/{codecMode} | 设备 | 物联网平台 | 设备向物联网平台上报数据。
|
/huawei/v1/devices/{deviceId}/command/{codecMode} | 物联网平台 | 设备 | 设备接收物联网平台下发的命令。
|
当设备完成和物联网平台对接后,一旦设备上电,设备基于在设备上定义的业务逻辑进行数据采集和上报,可以是基于周期或者事件触发。数据上报到物联网平台后,设备接入服务和设备管理服务提供的能力有区别,如下:
- 仅开通设备接入服务:对设备上报的数据不进行解析和存储,通过数据转发规则转发到华为云其他云服务上进行存储和处理(若设备采用二进制上报数据,则平台进行码流base64封装后再转发),然后通过其他云服务的控制台或者API接口进行进一步的数据处理。
- 设备管理服务(默认开通设备接入服务):
- 如果数据上报格式为二进制码流,则平台通过编解码插件对设备数据进行解析(如果是JSON格式,则无需编解码插件),解析后的数据上报给设备管理服务。
- 根据在控制台上创建应用时的配置来定义是否存储历史数据,如果设置为存储,则平台最长存储7天。应用服务器可以通过调用北向接口订阅设备相关的数据,物联网平台也可以通过数据转发规则转发到华为云其他云服务上进行存储和处理。然后通过其他云服务的控制台或者API接口进行进一步的数据处理。
- 对于采用LWM2M协议的设备,设备上报的设备的在线状态、设备最近一次上报的设备属性值会存储在设备影子里,应用服务器只需要查询设备影子中存储的数据,即可获取设备最新上报的设备数据和设备状态。
-
-
- 命令下发
- 概述
- 命令下发
-
为能有效地对设备进行管理,设备的产品模型中定义了物联网平台可向设备下发的命令,应用服务器可以调用物联网平台开放的API接口向单个设备或批量设备下发命令,或者用户通过物联网平台直接向单个设备下发命令,以实现对设备的远程控制。
物联网平台有两种命令下发机制,如下表所示。
命令下发机制 | 定义 | 适用场景 | LWM2M/CoAP协议设备 | 集成Agent Lite SDK设备/原生MQTT设备 |
立即下发 | 不管设备是否在线,平台收到命令后立即下发给设备。如果设备不在线或者设备没收到指令则下发失败。支持给本应用的设备和被授予权限的其它应用的设备下发命令。 | 立即下发适合对命令实时性有要求的场景,比如路灯开关灯,燃气表开关阀。使用立即下发时,命令下发的时机需要由应用服务器来保证。 | 建议用户使用缓存下发模式,工作模式设置为PSM模式(系统默认值)。 如需使用立即下发模式(工作模式设置为DRX或eDRX模式),需要在设备上报数据后立即下发命令才能成功。 | 适用 |
缓存下发 | 物联网平台在收到命令后先缓存,等设备上线或者设备上报数据时再下发给设备,如果单个设备存在多条缓存命令,则进行排队串行下发。支持给本应用的设备和被授予权限的其它应用的设备下发命令。 | 缓存下发适合对命令实时性要求不高的场景,比如配置水表的参数。 | 适用。工作模式设置为PSM模式(系统默认值)。 | 不适用 |
-
-
-
- 业务流程
-
-
LWM2M/CoAP协议设备场景
物联网平台提供立即下发和缓存下发两种机制。应用服务器向物联网平台下发命令时,携带参数expireTime(简称TTL,表示最大缓存时间)。如果不带expireTime,则默认expireTime为48小时。
- expireTime=0:命令立即下发。
- expireTime>0:命令缓存下发。
图1 命令立即下发流程
- 应用调用创建设备命令接口,下发请求到物联网平台,携带expireTime参数为0。消息样例如下:
Method: POST
request: https://server:port/iocm/app/cmd/v1.4.0/deviceCommands
Header:
"app_key: ******"
"Authorization:Bearer******"
Content-Type:application/json
Body:
{
"deviceId": "********",
"command": {
"serviceId": "Brightness",
"method": "SET_DEVICE_LEVEL",
"paras": {
"value": "1",
}
},
"callbackUrl": "http://127.0.0.1:9999/cmd/callbackUrl",
"expireTime": 0,
"maxRetransmit": 1
}
- 物联网平台调用编解码插件对命令请求进行编码后,会通过LWM2M协议定义的设备管理和服务实现接口的Execute操作下发命令,消息体为二进制格式。
- 物联网平台向应用返回201 Created,携带命令状态为SENT。(如果设备不在线或者设备没收到指令则下发失败,命令状态为FAIL)
- 设备收到命令后返回ACK响应。
- 若应用下发命令时携带了"callbackUrl",物联网平台通过命令状态变化通知接口推送消息给应用,携带命令状态为DELIVERED。消息样例如下:
Method: POST
request:
Body:
{
"deviceId": "6543214c-72bb-4131-9e14-fad974123456",
"commandId": "108a9c71462a48e09426e06e844d47ba3",
"result": {
"resultCode": "DELIVERED",
"resultDetail": null
}
}
- 设备执行命令后通过205 Content响应返回命令执行结果。
- 若应用下发命令时携带了"callbackUrl",物联网平台会调用编解码插件对设备响应进行解码,然后通过命令状态变化通知接口推送消息给应用,携带命令状态为SUCCESSFUL。消息样例如下:
Method: POST
request:
Body:
{
"deviceId": "6543214c-72bb-4131-9e14-fad974123456",
"commandId": "108a9c71462a48e09426e06e844d47ba",
"result": {
"resultCode": "SUCCESSFUL",
"resultDetail": null
}
}
物联网平台提供设备配置更新功能,即用户可通过控制台对单个设备或批量设备的设备属性值进行修改,满足用户频繁、快捷、方便的管理设备的诉求。比如,某路灯最初设置温度属性达到A摄氏度时上报告警,用户需要修改该属性值为B摄氏度,即可修改其配置文件,然后通过控制台上传到物联网平台,以实现配置更新。
- 针对LWM2M协议设备的设备配置更新,物联网平台提供了设备影子功能,将修改设备的属性信息存储在设备影子中,待设备上线或上报数据时,将修改的设备属性值同步给设备,从而完成设备属性的修改。
- 针对原生MQTT协议接入或集成Agent Lite SDK的设备,物联网平台直接配置更新下发,修改设备的设备属性值。
物联网平台支持创建设备的“影子”。设备影子是一个JSON文件,用于存储设备的在线状态、设备最近一次上报的设备属性值、应用服务器期望下发的配置。每个设备有且只有一个设备影子,设备可以获取和设置设备影子以此来同步设备属性值,这个同步可以是影子同步给设备,也可以是设备同步给影子。
设备影子上有desired区和report区。
- desired区用于存储对设备属性的配置,即期望值。当需要修改设备的服务属性值时,可修改设备影子的desired属性值,设备在线时,desired属性值立即同步到设备。如果设备不在线,待设备上线或上报数据时,desired属性值同步到设备。
- report区用于存储设备最新上报的设备属性值,即上报值。当设备上报数据时,平台刷新report属性值为设备上报的设备属性值。
-
-
- OTA升级
-
固件(Firmware)一般是指设备硬件的底层“驱动程序”,承担着一个系统最基础最底层工作的软件,比如计算机主板上的基本输入/输出系统BIOS(Basic Input/output System)。
固件升级又称为FOTA(Firmware Over The Air),是指用户可以通过OTA的方式对支持LWM2M协议的设备进行固件升级(基于MQTT协议的设备的固件升级能力即将上线,敬请期待),固件升级协议为LWM2M协议。FOTA流程如下图所示:
FOTA升级流程的详细说明:
1~2. 用户在设备管理服务的控制台上传固件包,并在控制台或者应用服务器上创建固件升级任务。
3. NB-IoT设备上报数据,平台感知设备上线,触发升级协商流程。
4~5. 物联网平台向设备下发查询设备固件版本的命令,查询成功后,物联网平台根据升级的目标版本判断设备是否需要升级。
- 如果返回的固件版本信息与升级的目标版本信息相同,则升级流程结束,不做升级处理。
- 如果返回的固件版本信息与升级的目标版本信息不同,则继续进行下一步的升级处理。
6~7. 物联网平台查询终端设备所在的无线信号覆盖情况,获取小区ID、RSRP(Reference Signal Received Power,参考信号接收功率)和SINR(Signal to Interference Plus Noise Ratio,信号干扰噪声比)信息。
- 查询成功:则根据如下方式计算可同时升级的并发数计算,并按照步骤9进行处理。
- 如下图所示,如果设备的RSRP强度和SINR强度均落在等级“0”中,则同时可以对该小区的50个相同信号覆盖区间的设备进行同时升级。
- 如果设备的RSRP强度和SINR强度分别落在等级“0”和“1”中,则以信号较弱的等级“1”为准,则只能同时对该小区的10个设备进行升级。
- 如果设备的RSRP强度和SINR强度分别落在等级“1”和“2”中,则以信号较弱的等级“2”为准,则只能同时对该小区的1个设备进行升级。
- 如果设备的RSRP强度和SINR强度不在该3个等级范围内,且均可以查询到,则按照信号最弱覆盖等级“2”处理,则只能同时对1个设备进行升级。
- 查询失败:则按照流程步骤8进行处理。
8. 物联网平台继续下发查询小区ID信息的命令,获取终端设备所在的小区ID信息。
- 如果查询成功:物联网平台支持同时对该小区的10个相同情况的设备进行固件升级。
- 如果查询失败:则升级失败。
10~11. 物联网平台向设备下发下载固件包的URL地址,通知设备下载固件包。终端设备根据该URL地址下载固件包,固件包的下载支持分片下载,下载完成后,设备知会物联网平台固件包已下载完毕。
12~13. 物联网平台向设备下发升级的命令,终端设备进行升级操作,升级完成后终端设备向物联网平台反馈升级结束。
14~16. 物联网平台下发命令查询固件升级的结果,获取升级结果后,向终端设备取消订阅升级状态通知,并向控制台应用服务器通知升级的结果。
设备注册鉴权是指物联网平台对接入平台的设备进行注册鉴权。对于不同接入方式的设备,注册鉴权方式不同。
接入类型 | 注册鉴权方式 |
使用LWM2M/CoAP协议接入的设备 | 在设备接入物联网平台前,用户通过应用服务器调用注册设备(验证码方式)接口或通过控制台在物联网平台注册设备,并把设备的唯一标识码nodeId(如IMEI)设置为设备接入平台的验证码。在设备接入物联网平台时携带设备唯一标识,完成设备的接入鉴权。 当采用DTLS/DTLS+传输层安全协议接入时,即设备为安全设备时,通过预置密钥进行设备和物联网平台之间的传输通道安全加密。如图所示。 |
集成Agent Lite SDK的设备 | 在设备接入物联网平台前,用户通过应用服务器调用注册设备(验证码方式)接口或通过控制台在物联网平台注册设备,并把设备的唯一标识码nodeId(如IMEI)设置为设备接入平台的验证码,平台返回设备ID。当设备上电时,携带nodeId等进行平台绑定,并返回设备ID和密钥。当绑定后设备重新登录时,携带设备ID和密钥完成网关的接入鉴权。如图所示。 如果设备是网关,网关下有子设备,则当网关接入物联网平台后,在网关上通过调用Agent Lite的添加非直连设备接口,完成子设备的接入,具体请参见网关与子设备。 |
使用原生MQTT协议接入的设备 | 在设备接入物联网平台前,用户通过应用服务调用注册设备(密码方式)接口或通过控制台在物联网平台注册设备,获取设备ID和密钥,并把设备ID和密钥烧录到设备中。在设备接入物联网平台时携带设备ID和密钥、或者nodeId和密钥,通过一机一密的方式,完成设备的接入鉴权。 |
-
-
- 设备上报数据
- 接口说明
- 设备上报数据
-
设备向物联网平台上报数据。
-
-
-
- Topic
-
-
Topic | /huawei/v1/devices/{deviceId}/data/{codecMode} |
消息发送方 | 设备 |
消息接收方 | 物联网平台 |
-
-
-
- 参数说明
-
-
参数 | 必选/可选 | 类型 | 描述 |
msgType | 必选 | String | 固定值“deviceReq”,表示设备上报数据。 |
data | 必选 | List<ServiceData> | 要上报的设备数据。 |
参数 | 必选/可选 | 类型 | 描述 |
serviceId | 必选 | String | 设备服务的ID。 |
serviceData | 必选 | ObjectNode | 一个服务下的属性数据,具体字段在设备的产品模型中定义。 |
eventTime | 可选 | String | 设备采集数据的UTC时间(格式:yyyyMMddTHHmmssZ),如:20161219T114920Z。 设备上报数据不带该参数或参数格式错误时,则数据上报时间以物联网平台时间为准。 |
-
-
-
- 示例
-
-
设备向Topic发送的payload:
{
"msgType":"deviceReq",
"data": [
{
"serviceId":"******",
"serviceData":{
"meterId":"******",
"dailyActivityTime": 120,
"flow": "565656",
"cellId":"5656",
"signalStrength":"99",
"batteryVoltage":"3.5"
},
"eventTime":"20160503T121540Z"
},
{
"serviceId": "Battery",
"serviceData": {
"batteryLevel": 75
},
"eventTime":"20160503T121540Z"
}
]
}
-
-
- 设备接收命令
- 接口说明
- 设备接收命令
-
设备接收物联网平台下发的控制命令。
-
-
-
- Topic
-
-
Topic | /huawei/v1/devices/{deviceId}/command/{codecMode} |
消息发送方 | 物联网平台 |
消息接收方 | 设备 |
-
-
-
- 参数说明
-
-
参数 | 必选/可选 | 类型 | 描述 |
msgType | 必选 | String | 固定值“cloudReq”,表示平台下发的请求。 |
serviceId | 必选 | String | 设备服务的ID。 |
cmd | 必选 | String | 命令名称,在设备的产品模型中定义。 |
paras | 必选 | ObjectNode | 命令参数,具体字段在设备的产品模型中定义。 |
mid | 必选 | Integer | 命令ID,物联网平台内部分配(范围1-65535),设备响应平台命令时,需要返回该值。 |
-
-
-
- 示例
-
-
设备先订阅Topic后才能收到命令推送,设备接收到的payload:
{
"msgType": "cloudReq",
"serviceId": "******",
"mid": 1,
"cmd": "LEVEL",
"paras": {
"value": 4
}
}
-
-
- 设备响应命令
- 接口说明
- 设备响应命令
-
设备对物联网平台控制命令的应答。
-
-
-
- Topic
-
-
Topic | /huawei/v1/devices/{deviceId}/data/{codecMode} |
消息发送方 | 设备 |
消息接收方 | 物联网平台 |
-
-
-
- 参数说明
-
-
参数 | 必选/可选 | 类型 | 描述 |
msgType | 必选 | String | 固定值“deviceRsp”,表示设备的应答消息。 |
mid | 必选 | Integer | 命令ID,把物联网平台下发命令时携带的“mid”返回给平台。 |
errcode | 必选 | Integer | 命令执行的结果码。
|
body | 可选 | ObjectNode | 命令的应答,具体字段在设备的产品模型中定义。 |
-
-
-
- 示例
-
-
设备向Topic发送的payload:
{
"msgType": "deviceRsp",
"mid": 1,
"errcode": 0,
"body": {
"result": 0
}
}
名词 | 解释 |
产品 | 产品是开发者在平台注册创建的智能硬件型号,比如“小米空气净化器2代”就是一款产品,对该产品的平台配置将影响该型号下的所有设备。 |
产品Model | 产品Model是在注册创建产品时填写的,作为产品在平台的唯一标识,是开发者在开发及上线后管理的重要参数。产品Model由“企业标识”、“设备类型标识”、“产品型号”三部分组成,其中“产品型号”由开发者自行定义、由小写字母和数字组成。 |
PID | PID的全称为"Product ID",是产品在平台的唯一标识,由平台分配。 |
MIoT-Spec | MIoT Specification,小米IoT设备协议规范
|
device(设备) | 是一个独立的有意义的设备,比如:灯泡、插座、风扇 |
DID | DID的全称为“Device ID”,是设备在平台中的唯一标识。DID由平台分配 |
UID | UID的全称为“User ID”,即为用户的小米账号,是用户在平台中的唯一标识 |
小米IoT开发者平台面向智能家居、智能家电、健康可穿戴、出行车载等领域,开放智能硬件接入、智能硬件控制、自动化场景、AI技术、新零售渠道等小米特色优质资源,与合作伙伴一起打造极致的物联网体验。
智能硬件直连接入,是指通过对设备硬件的开发来接入小米IoT开发者平台的接入方式。
智能硬件直连接入有两种具体的方式,包括硬件中嵌入小米智能模组和硬件中集成设备SDK。
硬件中嵌入小米智能模组:适合于自带MCU的、控制功能相对简单的智能硬件。小米智能模组中已内置标准的设备SDK,且将功能接口封装为串口通信指令格式,开发者可直接将MCU和小米智能模组对接,MCU按照标准格式通过串口向模组上报或拉取数据。
硬件中集成设备SDK:适合于带操作系统的、控制功能相对复杂的智能硬件;也适合无MCU、直接在模组中开发功能的智能硬件。设备SDK中包含多种基本功能,开发者只需调用接口并实现硬件自身的功能逻辑即可。
-
-
- OTA升级
-
物理设备的固件升级后,可能:
仅仅是修复内部bug。
增加了设备功能。
对于第1种情况,我们不关心。
对于第2种情况,我们需要规定好升级方式。
比如一款风扇升级过N个固件,更改了3次功能,这3次升级都修改了设备实例的type:
urn:miot-spec-v2:device:fan:0000A005:zhimi-zxc:1
urn:miot-spec-v2:device:fan:0000A005:zhimi-zxc:2
urn:miot-spec-v2:device:fan:0000A005:zhimi-zxc:3
1. 升级约定
升级版本号,需要向下兼容,即:
只能添加功能,不能删除和修改旧功能。
如果更改了产品型号,则不需要考虑兼容。
绝大多数情况下,不建议升级产品型号。
2. 范例
初始版本定义
当一个设备刚被创建的时候,版本号是1,如:
{
"type": "urn:miot-spec-v2:device:fan:0000A005:zhimi-zxc:1",
"description": "Zhimi Fan",
"services": [
{
"iid": 1,
"type": "urn:miot-spec-v2:service:fan:00007808:zhimi-zxc:1",
"description": "Fan",
"properties": [
{
"iid": 1,
"type": "urn:miot-spec-v2:property:on:00000006:zhimi-zxc:1",
"description": "Switch Status",
"format": "bool",
"access": ["read", "write", "notify"]
},
{
"iid": 2,
"type": "urn:miot-spec-v2:property:fan-level:00000016:zhimi-zxc:1",
"description": "Speed Level",
"format": "uint8",
"access": ["read", "write", "notify"],
"value-range": [1, 3, 1]
}
]
}
]
}
注意:
设备实例中的type是
urn:miot-spec-v2:device:fan:0000A005:zhimi-zxc:1
风速被厂家修改了取值范围,type是
urn:miot-spec-v2:property:fan-level:00000016:zhimi-zxc:1
两个type的后缀保持一致,都是:
zhimi-zxc:1
升级
过了一段时间,厂家觉得3档太少,需要升级下固件,支持5个档位。设备实例被修改成:
{
"type": "urn:miot-spec-v2:device:fan:0000A005:zhimi-zxc:2",
"description": "Zhimi Fan",
"services": [
{
"iid": 1,
"type": "urn:miot-spec-v2:service:fan:00007808:zhimi-zxc:1",
"description": "Fan",
"properties": [
{
"iid": 1,
"type": "urn:miot-spec-v2:property:on:00000006:zhimi-zxc:1",
"description": "Switch Status",
"format": "bool",
"access": ["read", "write", "notify"]
},
{
"iid": 2,
"type": "urn:miot-spec-v2:property:fan-level:00000016:zhimi-zxc:1",
"description": "Speed Level",
"format": "uint8",
"access": ["read", "write", "notify"],
"value-range": [1, 3, 1]
},
{
"iid": 3,
"type": "urn:miot-spec-v2:property:fan-level:00000016:zhimi-zxc:2",
"description": "Speed Level",
"format": "uint8",
"access": ["read", "write", "notify"],
"value-range": [1, 5, 1]
}
]
}
]
}
注意:
设备实例中的type是(版本号变成了2):
urn:miot-spec-v2:device:fan:0000A005:zhimi-zxc:2
原有的风速(fan-level)type依旧不变(这是一个在版本1时定义的风速)
urn:miot-spec-v2:property:fan-level:00000016:zhimi-zxc:1
新增加了一个风速(iid: 3,版本号是2),档位被调整为5档,type是:
urn:miot-spec-v2:property:fan-level:00000016:zhimi-zxc:2
企业在正式使用平台前,建议先行了解平台上与企业相关的两类角色:
个人开发者:用小米账号登录,账号在平台进行邮箱验证和用户个人信息登记后,即可成为平台的个人开发者。
企业开发组:企业需要在平台以企业身份注册并经平台审核通过后,即可成为平台的企业开发组。
个人开发者是平台上的操作主体,但需要创建企业开发组或被企业开发组添加为成员,才可有权限操作平台各项功能。
企业开发组由某个个人开发者发起申请,申请通过后,负责申请的个人开发者即成为该企业开发者的拥有者,其他个人开发者可以被添加到该企业开发组的成员中,进行协助管理、开发、运营等操作。
接口:
https://api.io.mi.com/app/device/batchdevicedatas
输入参数:
data=[
{
"did":"12345678", // 设备ID
"props":[
"prop.power",
"prop.light"
]
},
{
"did":"99999999",
"props":["event.status"]
}
]
返回值:
{
"code":0,
"message":"ok",
"result":{
"12345678":{
"prop.power":"off",
"prop.light":"false"
},
"99999999":{
"event.status":"{\"state\":8}"
}
}
}
设备上报属性格式:
{"method":"props","params":{"power":"off","light":"false"},"id":1234}
设备上报事件格式:
{"id":5678,"method":"event.status", "params":[{"state":8}]}
“推送开关”功能实现相关接口:
设置插件推送开关的状态值
接口: /app/device/setsetting
参数:
data={
"did":xxx,
"settings":
{
"push_enable_[ID]": "1"
}
}
设置”push_enable_[ID]”为1, 开启推送,其他值为关闭推送
获取插件开关状态
接口:/app/device/getsetting
参数:
data={
"did":xxx,
"settings":["push_enable_[ID]"], // 如果settings为空,取所有uid+did下的settings
"prefix_filter": "xxxx" // 只返回以xxxx开头的setting
}
返回:
result={
"push_enable_[ID]": "1",
}