物联网时代 跟着Thingsboard学IOT架构-MQTT设备协议
摘要:要将客户端设备属性发布到ThingsBoard服务器节点,请将PUBLISH消息发送到以下主题:。│ └── JsonMqttAdaptor.java // MQTT json转换器,在跟Thingsboard学习IOT-物模型有所讲解。
Thingsboard的MQTT设备协议
thingsboard官网: https://thingsboard.io/
thingsboard GitHub: https://github.com/thingsboard/thingsboard
thingsboard提供的体验地址: http://demo.thingsboard.io/
BY Thingsboard team
以下内容是在原文基础上演绎的译文。除非另行注明,页面上所有内容采用知识共享-署名( CC BY 2.5 AU )协议共享。
原文地址: ThingsBoard API参考: MQTT设备API
MQTT基础知识
MQTT 是一种轻量级的发布 - 订阅消息传递协议,可能使其最适合各种物联网设备。您可以 在此处 找到有关MQTT的更多信息。
ThingsBoard服务器节点充当MQTT Broker,支持QoS级别0(最多一次)和1(至少一次)以及一组预定义主题。
客户端库设置
您可以在Web上找到大量MQTT客户端库。本文中的示例将基于 Mosquitto , MQTT.js 和 Paho ,要设置其中一个工具。
键值格式
默认情况下,ThingsBoard支持JSON中的键值内容。Key始终是一个字符串,而value可以是string,boolean,double或long。也可以使用自定义二进制格式或某些序列化框架。有关详细信息,请参阅 物模型 。例如:
1 |
{"stringKey":"value1", "booleanKey":true, "doubleKey":42.0, "longKey":73} |
遥测上传API
为了将遥测数据发布到ThingsBoard服务器节点,请将PUBLISH消息发送到以下主题:
1 |
v1/devices/me/telemetry |
最简单的支持数据格式是:
1 |
{"key1":"value1", "key2":"value2"} |
要么
1 |
[{"key1":"value1"}, {"key2":"value2"}] |
请注意,在这种情况下,服务器端时间戳将分配给上传的数据!
如果您的设备能够获取客户端时间戳,您可以使用以下格式:
1 |
{"ts":1451649600512, "values":{"key1":"value1", "key2":"value2"}} |
在上面的示例中,我们假设“1451649600512”是具有毫秒精度的 unix时间戳 。例如,值’1451649600512’对应于’Fri,2016年1月1日12:00:00.512 GMT’
属性API
ThingsBoard属性API允许设备
- 将 客户端 设备属性上载到服务器。
将属性更新发布到服务器
要将客户端设备属性发布到ThingsBoard服务器节点,请将PUBLISH消息发送到以下主题:
1 |
v1/devices/me/attributes |
更多请看上文给出的连接。
Thingsboard的MQTT传输协议架构
因为Thingsboard最新release,是基于微服务架构,不利用单独理解代码。
Thingsboard源代码: https://github.com/thingsboard/thingsboard/tree/release-2.0/transport/mqtt
本文基于上面源代码后,剔除相关的安全验证和处理之后搭建简易的讲解项目:
https://github.com/sanshengshui/IOT-Technical-Guide/tree/master/IOT-Guide-MQTT
MQTT框架
因为Thingsboard是一个JVM技术栈的PaaS平台,所以使用的是基于Java通讯框架的Netty,如果有对 Netty 不太熟悉的同学,可以参考我之前搭建的Netty实践学习案例: https://github.com/sanshengshui/netty-learning-example
项目结构
1 |
. |
项目代码讲解
IOTMqttServer
1 |
private static final int PORT = 1884; |
第8行,设置服务端Netty内存读写泄漏级别,缺省条件下为: DISABLED
第10行和第11行,设置boss线程组和work线程组的线程数量。默认情况下,boss线程组的线程数量为1,work线程组的数量为运行服务机器内核数量的2倍。
第15行,通过创建 ServerBootstrap
对象,在第16行设置使用 EventLoopGroup
。
在17和19行,设置要被实例化的 NioServerSockerChannel
类,并设置最大的负载内容数量。
最后我们通过 shutdowGracefully()
函数优雅的关闭bossGroup和workGroup。
MqttTransportHandler#processMqttMsg()
1 |
private void processMqttMsg(ChannelHandlerContext ctx, MqttMessage msg) { |
第3行,通过判断消息的固定头部是否为空,如果空;则通过 processDisconnect(ctx)
将设备连接关闭。
processDisconnect(channelHandlerContext ctx)
1 |
private void processDisconnect(ChannelHandlerContext ctx) { |
第8行,通过判断固定头部的MQTT消息类型,针对不同消息做相应的处理。
MqttTransportHandler#PublishDevicePublish
以下是对发布消息进行相关的解读,更多消息类型的处理类,大家请参考我上面的IOT-Guide-MQTT进行阅读。
1 |
private void processDevicePublish(ChannelHandlerContext ctx, MqttPublishMessage mqttMsg, String topicName, int msgId) { |
我上面的代码仅是对消息的主题进行判断,然后对主题内的内容进行物模型的解析,得到相关属性或者遥测数据的获得。
演示效果
我们通过Paho或者MQTT.js和服务进行连接,发布消息到以下主题:
1 |
v1/devices/me/telemetry |
简易的数据格式如下:
1 |
{"key1":"value1", "key2":"value2"} |
Paho图示:
服务器控制台打印数据:
1 |
七月 24, 2019 1:37:18 下午 io.netty.handler.logging.LoggingHandler channelRegistered |
如上所示,希望大家对Thingsboard的IOT架构-MQTT设备协议这块有所了解!