开源物联网云平台 Thingsboard入门

开源物联网云平台 Thingsboard入门

本文主要介绍一下Thingsboard 物联网云平台的简单使用。

一. Thingsboard 基础知识和架构

ThingsBoard具有以下特点:
1.遥测数据收集功能: 可以可靠地收集和存储遥测数据,以应对网络和硬件故障。使用可自定义的Web仪表板或服务器端API访问收集的数据。
2.开箱即用的多租户支持多租户安装: 单个租户可能具有多个租户管理员以及数百万个设备和客户。
3.数据可视化: 提供了现成的30个可配置小部件,并能够使用内置编辑器创建自己的小部件。内置线图,数字和模拟仪表,地图等等。
4. 水平可伸缩性: 随着以集群模式添加新的Thingsboard服务器,受支持的服务器端请求和设备的数量呈线性增加。无停机时间,服务器重启或应用程序错误。
5. 物联网规则引擎: 基于实体属性或消息内容,使用灵活的规则链处理传入的设备数据。使用自定义逻辑将数据转发到外部系统或触发警报。在警报上配置复杂的通知链。增强服务器端功能或使用高度可定制的规则来操作设备。使用拖放规则链设计器定义您的应用程序逻辑。
6.容错: 所有物联网服务器都是相同的。没有主人工人或热备用人员。自动检测到节点故障。可以在不停机的情况下更换故障节点。使用可靠的NoSQL数据库复制持久数据。
7.设备管理: 提供注册和管理设备的功能。允许监视客户端和供应服务器端设备属性。为服务器端应用程序提供API,以将RPC命令发送到设备,反之亦然。
8.安全性支持: MQTT和HTTP协议的传输加密。支持设备认证和设备凭证管理。
9.资产管理: 提供注册和管理资产的功能。允许供应服务器端资产属性并监视相关警报。使用关系建立实体层次结构的能力。
10. 自定义和集成: 使用可自定义的规则链,窗口小部件和传输实现来扩展默认平台功能。除了MQTT,CoAP和HTTP支持之外,ThingsBoard用户还可以使用自己的传输实现或自定义现有协议的行为。
11.警报管理: 提供创建和管理与您的实体(设备,资产,客户等)相关的警报的功能。允许实时警报监视以及将警报传播到相关实体层次结构。在设备断开连接或不活动事件时发出警报。
12.100%开源: ThingsBoard已获得Apache许可2.0的许可,因此您可以在商业产品中免费使用任何它。您甚至可以将其托管为SaaS或PaaS解决方案。
13. 微服务或单片支持为入门或小型环境提供单片部署。提供升级到微服务的功能,以实现高可用性和水平可伸缩性。
14.SQL,NoSQL和混合数据库支持: 各种数据库选项,并能够选择在何处存储主要实体以及在何处存储遥测数据.

在这里插入图片描述

总体架构:
系统分层:
Device端:数据采集,需要支持MQTT或HTTP等协议
通讯通道:数据采集监听
规则引擎:对数据进行过滤,处理
核心业务规则
服务侧AIP和GW
用户端:用户和应用
在这里插入图片描述

测量数据处理:
在这里插入图片描述
RPC 过程:
在这里插入图片描述

规则引擎:
在这里插入图片描述
IoT网关:
在这里插入图片描述

规则引擎:
规则VS插件
生命周期
作用域
规则:过滤器,处理器,Action
插件:
处理消息
服务侧API请求
WebSocket和应用
持久化和查询事件
插件间RPC通信
在这里插入图片描述
在这里插入图片描述

遥测插件-系统插件,负责处理与设备属性和遥测有关的各种请求。
RPC插件-允许使用REST API对设备执行RPC调用。 RPC调用将使用支持的网络协议传递到设备。
设备消息传递插件-允许分配给相同客户交换事件的设备。
发送邮件插件-允许发送电子邮件。您可以指定邮件服务器属性。有关更多详细信息,请参见插件文档。
Kafka插件-允许将遥测消息推送到Apache Kafka。有关更多详细信息,请参见插件文档。
RabbitMQ插件-允许将遥测消息推送到RabbitMQ。有关更多详细信息,请参见插件文档。
REST API呼叫插件-允许使用REST API将遥测消息推送到外部服务器。有关更多详细信息,请参见插件文档。 时间RPC插件-允许从设备发送RPC请求以获取当前服务器端时间戳。

API-REST API
http://YOUR_HOST:PORT/swagger-ui.html 比如:http://localhost:9090/swagger-ui.html#/
获取tokens:
curl -X POST --header ‘Content-Type: application/json’ --header ‘Accept: application/json’ -d ‘{“username”:“[email protected]”, “password”:“tenant”}’ 'http://THINGSBOARD_URL/api/auth/login‘
使用tokens:X-Authorization

在这里插入图片描述

基本消息参见MQTT消息
设备连接:
Topic: v1/gateway/connect Message: {“device”:“Device A”}
Topic: v1/gateway/disconnect Message: {“device”:“Device A”}
属性API:
Topic: v1/gateway/attributes Message: {“Device A”:{“attribute1”:“value1”, “attribute2”: 42}, “Device B”:{“attribute1”:“value1”, “attribute2”: 42}}
Topic: v1/gateway/attributes/request Message: {“id”: $request_id, “device”: “Device A”, “client”: true, “key”: “attribute1”}

二. 从源代码编译的方法和注意事项

mvn clean install -DskipTests
在这里插入图片描述
我第一次编译时遇到了错误,折腾了好几次,
靠谱的方法如下: 选择一个你要编译的release 分支
$ git branch -a
master

  • release-2.4
    remotes/origin/HEAD -> origin/master
    remotes/origin/develop/2.4
    remotes/origin/develop/3.0
    remotes/origin/feature/backpressure
    remotes/origin/feature/claiming
    remotes/origin/feature/edge
    remotes/origin/feature/geofencing
    remotes/origin/feature/missing-translate-ua-ru
    remotes/origin/feature/security-updates
    remotes/origin/feature/spring-boot-2
    remotes/origin/feature/sql-rate-limits
    remotes/origin/feature/swagger-config-to-file
    remotes/origin/master
    remotes/origin/openjdk8
    remotes/origin/pgrisu-features/add_optional_widget_title_tooltip
    remotes/origin/pgrisu-features/widget_entity_datakeys_mixed_creation_order
    remotes/origin/release-1.0
    remotes/origin/release-1.1
    remotes/origin/release-1.2
    remotes/origin/release-1.3
    remotes/origin/release-1.4
    remotes/origin/release-2.0
    remotes/origin/release-2.2
    remotes/origin/release-2.3
    remotes/origin/release-2.4
    remotes/origin/revert-1637-release-2.3-entity-view-cn
    remotes/origin/revert-1642-mqtt-keep-alive-fix
    remotes/origin/revert-1692-1686-No-response-to-client-side-RPC-via-CoAP

git checkout release-2.4
#然后执行:
mvn clean install -DskipTests
中间遇到多次 node.js 编译的问题, 基本都是权限问题引起的,
注意:1.要确保你的当前用户可以修改和当前用户目录下的.npm/目录
2.确保源代码目录下的文件夹你都有访问权限。
之前因为遇到了权限问题,使用了sudo 导致编译老是出问题。
正常情况下用当前用户编译即可。

三. 安装部署

docker 单实例安装: start-thingsboard-docker.sh
把下面的代码拷贝到文件start-thingsboard-docker.sh,然后添加执行权限 chmod +x start-thingsboard-docker.sh ,然后执行即可.
首次启动需要几分钟时间。

#!/usr/bin/env bash

echo "https://hub.docker.com/r/thingsboard/tb-cassandra"
#docker pull thingsboard/tb-cassandra

docker stop mytb
docker rm   mytb

docker run -it \
-p 9090:9090 \
-p 1883:1883 \
-p 5683:5683/udp \
-v `pwd`/mytb-data:/data \
-v `pwd`/mytb-logs:/var/log/thingsboard \
--name mytb \
--restart always \
thingsboard/tb-cassandra

echo "http://localhost:9090"
echo "ThingsBoard login page. Use the following default credentials:"
echo "系统管理员: [email protected] / sysadmin"
echo "租户管理员: [email protected] / tenant"
echo "用户账号: [email protected] / customer"

echo "-p 9090:9090 - connect local port 9090 to exposed internal HTTP port 9090"
echo "-p 1883:1883 - connect local port 1883 to exposed internal MQTT port 1883"
echo "-p 5683:5683 - connect local port 5683 to exposed internal COAP port 5683"

用户类型有3种,密码账号如上所示.
系统管理员: [email protected] 密码: sysadmin
租户管理员: [email protected] 密码: tenant
用户账号: [email protected] 密码: customer

四. 测试验证

使用系统管理员登陆:
在这里插入图片描述
在这里插入图片描述

租户管理员登陆:
在这里插入图片描述

在这里插入图片描述

测试: 添加一个IoT设备,然后持续持续的发送数据, 然后读取和展示

使用租户管理员登陆: 租户管理员: [email protected] 密码: tenant

  1. (添加设备)点击右下角的中间橙色圆圈

在这里插入图片描述
在这里插入图片描述

添加成功后,点击左上角的 设备–》(你的设备名称)

在这里插入图片描述
在这里插入图片描述
复制令牌和复制设备ID 待会会用到.

测试往Thingsboard 发送数据.
把下面的python 脚本保存为simple-mqtt-python.py


import paho.mqtt.client as mqtt
from time import sleep
import random

# The callback for when the client receives a CONNACK response from the server.
def on_connect(client, userdata, rc, *extra_params):
   print("连接成功")
   print('连接结果代码 code= '+str(rc))
   #print('***' + str(r))
   # Subscribing in on_connect() means that if we lose the connection and
   # reconnect then subscriptions will be renewed.
   # client.subscribe('v1/devices/me/attributes')
   # client.subscribe('v1/devices/me/attributes/response/+')
   # client.subscribe('v1/devices/me/rpc/request/+')



# The callback for when a PUBLISH message is received from the server.
def on_message(client, userdata, msg):
   print('主题: ' + msg.topic + '\n消息: ' + str(msg.payload))
   # if msg.topic.startswith( 'v1/devices/me/rpc/request/'):
   #     requestId = msg.topic[len('v1/devices/me/rpc/request/'):len(msg.topic)]
   #     print('This is a RPC call. RequestID: ' + requestId + '. Going to reply now!')
   #     client.publish('v1/devices/me/rpc/response/' + requestId, "{\"value1\":\"A\", \"value2\":\"B\"}", 1)
   # ATTRIBUTES = '{\"firmware_version\":\"1.0.2\", \"serial_number\":\"SN-001\"}'
   # TELEMETRY = '{\"temperature\":28, \"humidity\":139.0, \"active\": false}'
   #
   # client.publish('v1/devices/me/attributes', ATTRIBUTES);
   # print("ok1 " + ATTRIBUTES)
   #
   # client.publish('v1/devices/me/telemetry', TELEMETRY);
   # print("ok2 " + TELEMETRY)

#用户需要根据实际情况填写下面的内容.

THINGSBOARD_HOST="localhost"
MQTT_PORT=1883
ACCESS_TOKEN="xWVlx8J6tkdxyrf8yvC7" #使用TOKEN进行相关验证 , 请更换为你的设备访问令牌。

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
#client.publish('v1/devices/me/attributes/request/1', "{\"clientKeys\":\"model\"}", 1)

client.username_pw_set(ACCESS_TOKEN)

#connect(self, host, port=1883, keepalive=60, bind_address=""
client.connect(THINGSBOARD_HOST, MQTT_PORT, 1)

#client.loop_forever()

client.loop_start();
sleep(1)


# ATTRIBUTES = '{\"firmware_version\":\"1.0.2\", \"serial_number\":\"SN-001\"}'
# TELEMETRY = '{\"temperature\":28, \"humidity\":149.0, \"active\": false}'

for i in range(500000):
    temperature=10 + random.randint(-15, 30)
    humidity=60+random.randint(0, 40);
    ATTRIBUTES = '{\"firmware_version\":\"1.0.2\", \"serial_number\":\"SN-001\"}'
    TELEMETRY = '{\"temperature\":'+str(temperature)+', \"humidity\":'+str(humidity)+', \"active\": false}'
    client.publish('v1/devices/me/attributes', ATTRIBUTES);
    #print("ok1 " + ATTRIBUTES)

    client.publish('v1/devices/me/telemetry', TELEMETRY);
    print("ok2 " + TELEMETRY)
    sleep(1)

client.loop_stop();
client.disconnect()


#client.disconnect();



# Blocking call that processes network traffic, dispatches callbacks and
# handles reconnecting.
# Other loop*() functions are available that give a threaded interface and a
# manual interface.


#执行环境是python3
执行python simple-mqtt-python.py

在这里插入图片描述

这时打开网页 设备–>happy-device 就可以看到 上传到Thingsboard 的实时数据
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
然后点击右下角的 红色打勾, 应用更改。即可生效。

访问实时数据:http://localhost:9090/api/v1/xWVlx8J6tkdxyrf8yvC7/attributes
在这里插入图片描述

export JWT_TOKEN=“xWVlx8J6tkdxyrf8yvC7”
curl -v -X GET http://localhost:9090/api/plugins/telemetry/DEVICE/2b58cc70-e9ab-11e9-9d84-7f35a90422a9/keys/timeseries
–header “Content-Type:application/json”
–header “X-Authorization: $JWT_TOKEN”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章