TuyaLink 协议是涂鸦 IoT 开发平台面向物联网开发领域设计的一种数据交换规范,数据格式为 JSON,主要用于设备端和涂鸦 IoT 开发平台的双向通信,更便捷地实现了设备端和平台之间的业务数据交互。
设备的通信方式也是多种多样的。无线通信方式有蓝牙 LE、Zigbee、蓝牙 Mesh、433 协议,有线通信方式有 RS-485、RS-232、以太网以及各种工业协议等。但通信只是建立一个数据通道,要想真正运作起来,还需要了解数据包格式协议。数据协议包括 OCPP、Modbus、工业标准协议和其他自定义协议等。
本文介绍的 Tuya MQTT 标准协议是其中一种协议,也是涂鸦物联网平台最底层的基础通讯协议。开发者可根据协议完全自主地进行嵌入式开发,该协议可支持所有设备的集成。
了解设备形态
直连设备
对于不需要其他设备中转、能直接通过网络连接到云平台的设备,我们把它们叫做直连设备。任何有能力通过 Wi-Fi、以太网、蜂窝网络等,直接连上云平台的设备都是直连设备。
网关
网关的定义比较宽泛,可以是一种物理设备,也可以理解为一种能力。它也属于直连设备,广义上说,只要具备与其子设备进行通信并中转的能力,就是网关。比如,我们生活中熟知的智能音箱、电视机、插座等等都可以作为网关。
边缘网关
在一般的网关基础上,有一类具备更强的计算能力,能在边缘侧完成一部分计算能力,比如本地数据分析和统计、数据缓存、本地联动等等,业内统称为边缘网关。
网关子设备
有些设备能力受限,不具备连接云端能力,需要通过网关中转才能连接云平台,这类设备统称为子设备。常见的网关子设备有 Zigbee 设备和蓝牙设备等。
什么是 MQTT?
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅(publish/subscribe)模式的 轻量级 通讯协议。它工作在 TCP/IP 协议族上,由 IBM 在 1999 年发布。
MQTT 是一个基于客户端-服务器的简单的消息传递协议,支持 QoS,设计轻量且省带宽,与数据无关(不关心 Payload 数据格式),支持持续地会话感知能力,设计用于具有低带宽的受限设备。
设备可作为客户端的形式通过 MQTT 协议来发布和订阅消息,从而实现设备的数据上报和实时控制。目前,MQTT 协议已广泛应用于物联网领域,一定程度上成为了物联网通讯协议的代名词。
MQTT 数据交互机制
对 MQTT 的支持情况
-
消息服务质量 QoS(Quality of Service):发布消息的服务质量,即:保证消息传递的次数。支持 QoS 0 和 QoS 1,但是不支持 QoS 2。
质量等级 含义 是否支持 QoS 0 消息最多传递 1 次,如果当时客户端不可用,则会丢失该消息。 是 QoS 1(推荐) 消息传递至少 1 次。 是 QoS 2 消息仅传送 1 次。 否 -
MQTT 版本主要有三个,分别是 MQTT 3.1、MQTT 3.1.1 和 MQTT 5。目前,物联网环境中使用最多的是 MQTT 3.1.1 协议。涂鸦平台支持 MQTT 3.1.1,暂不支持 MQTT 5。
MQTT 接入点
涂鸦 IoT 开发平台支持全球多个区域的设备接入,故需要根据设备实际使用的区域,来选择对应的接入点。
全球 6 大区 MQTT 接入点如下:
区域 | MQTT 接入域名 | 端口号 |
---|---|---|
中国数据中心 | m1.tuyacn.com | 8883 |
中欧数据中心 | m1.tuyaeu.com | 8883 |
美西数据中心 | m1.tuyaus.com | 8883 |
美东数据中心 | m1-ueaz.tuyaus.com | 8883 |
西欧数据中心 | m1-weaz.tuyaeu.com | 8883 |
印度数据中心 | m1.tuyain.com | 8883 |
设备身份认证
我们在快速入门提供了一个简单的设备接入和控制例子。如果您还没阅读,强烈建议您先了解一下。具体详情,请参考 快速入门。
设备身份验证指在设备向云平台发起 MQTT 连接请求时,设备需要携带自身的身份信息,云平台会对这些信息进行验证。如果验证不通过,云平台会拒绝本次连接。这个验证过程就是设备身份认证。
直连设备认证
一机一密认证
一机一密认证是预先为每个设备烧录其唯一的设备证书(即 ProductID
、DeviceID
和 DeviceSecret
)。当设备与云平台建立连接时,云平台对其携带的设备证书信息进行加密计算,最后使用 username/password
的方式认证。
在快速入门里,已经介绍了如何在平台上注册一个设备。
在 激活验证 页面得到三个重要信息,即设备证书,如下所示:
参数名称 | 参数说明 |
---|---|
ProductID | 产品的信息 |
DeviceID | 设备的身份信息,用于连接云端授权和通信使用 |
DeviceSecret | 设备的密码信息,用于连接云端授权使用 |
username
和 password
的计算规则如下:
参数名称 | 参数说明 | 示例 |
---|---|---|
user name | ${DeviceID}|signMethod=hmacSha256,timestamp=${当前 10 位时间戳},secureMode=1,accessType=1; | 例如:6c828cba434ff40c074wF2|signMethod=hmacSha256,timestamp=1607837283,secureMode=1,accessType=1 |
password | hmacSha256(content, DeviceSecret), content 的格式:deviceId=${DeviceID},timestamp=${当前 10 位时间戳},secureMode=1,accessType=1 需要按照 deviceId,timestamp,secureMode,accessType 这个顺序组装明文内容。 64 位字符的 16 进制数,不足 64位时前面需要补零。 | content 例如:“deviceId=6c828cba434ff40c074wF2,timestamp=1607635284,secureMode=1,accessType=1” DeviceSecret 例如:ffad8eb66ae8c717 password 例如:9088f1608df4744e2a933ff905ffdde58dc7213510f25ad786a89896a5ea1104 |
在使用一机一密普通认证时,建议开启自动重连。网络抖动会导致设备断开连接,当网络恢复时,无需人工干预,设备可自动恢复连接。
X.509 证书认证
功能暂未对外开放,若需要可提交技术工单咨询。
一型一密认证
功能暂未对外开放,若需要可提交技术工单咨询。
网关子设备认证
结合上文介绍,网关子设备主要是依赖于网关的连接机制。网关自身是一个直连设备,其接入方式与普通直连设备没有差别,所以本章节是在网关接入的前提下,介绍子设备的认证方式。
网关可以是一种设备,也可能是一种功能。现实生活中,既有一类网关设备,其除了作为中转没有其他功能,也有网关是智能音箱、电视机,甚至插座都可以具备网关能力。
网关的通信特点是具备两个方向的通信能力:
- 向上和云平台通信,可以直连云平台。
- 向下和子设备通信,可以和子设备建立通信链路,理解子设备的协议并转换数据发送到云平台。
为了适配不同的使用场景,我们提供了三套子设备认证流程,详见 拓扑关系管理。
MQTT 保活
MQTT 保活或者 MQTT 心跳是指设备在一个心跳周期内向云端发送保活报文,云端依据此报文判断设备是否在线。
保活时间建议是 60 秒,不建议低于此值。从设备端发起的 CONNECT
报文开始计时,在收到 PING 消息时云端重置计时器。在超过 2.5 个心跳周期,云平台未收到消息,云平台会断开连接,设备此时是离线状态。
例如:设备设置的心跳周期是 60s,当设备断网 150s(60 × 2.5 = 150s)左右时,能观察到设备在云端是离线状态。
安全连接
为保证设备与云平台的通信安全性,需要使用 TLS 1.2 的方式建立连接。如果您使用 SDK 的方式接入,SDK 已经实现了 TLS 连接,您无需自己实现。需要指出的是,有些资源受限的设备,虽然有以太网能力,但是无法运行 TLS 套件,建议以子设备的形态接入。
如果您的设备环境比较复杂,SDK 无法满足,需要自己实现接入协议,您需要下载根证书。关于根证书的使用方法,请参考 C Demo 和 Java Demo。