安装thisngboard
步骤1. 安装Java 8(OpenJDK)
sudo apt update
sudo apt install openjdk-8-jdk
sudo update-alternatives --config java
java -version
步骤2. 安装服务
wget https://github.com/thingsboard/thingsboard/releases/download/v3.4.1/thingsboard-3.4.1.deb
sudo dpkg -i thingsboard-3.1.1.deb
步骤3. 配置数据库
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
RELEASE=$(lsb_release -cs)
echo "deb http://apt.postgresql.org/pub/repos/apt/ ${RELEASE}"-pgdg main | sudo tee /etc/apt/sources.list.d/pgdg.list
sudo apt update
sudo apt -y install postgresql-12
sudo service postgresql start
一旦安装了PostgreSQL您可能想要创建一个新用户或为主要用户设置密码。
以下说明帮助你设置PostgreSQL用户密码
sudo su - postgres
psql
\password
\q
然后,按“Ctrl+D”返回主用户控制台并连接到数据库以创建Thingsboard DB:
psql -U postgres -d postgres -h 127.0.0.1 -W
CREATE DATABASE thingsboard;
\q
步骤4.ThingsBoard配置
sudo nano /etc/thingsboard/conf/thingsboard.conf
将“PUT_YOUR_POSTGRESQL_PASSWORD_HERE”替换postgres用户真实密码
export DATABASE_ENTITIES_TYPE=sql
export DATABASE_TS_TYPE=sql
export SPRING_JPA_DATABASE_PLATFORM=org.hibernate.dialect.PostgreSQLDialect
export SPRING_DRIVER_CLASS_NAME=org.postgresql.Driver
export SPRING_DATASOURCE_URL=jdbc:postgresql://localhost:5432/thingsboard
export SPRING_DATASOURCE_USERNAME=postgres
export SPRING_DATASOURCE_PASSWORD=PUT_YOUR_POSTGRESQL_PASSWORD_HERE
export SPRING_DATASOURCE_MAXIMUM_POOL_SIZE=5
export SQL_POSTGRES_TS_KV_PARTITIONING=MONTHS
步骤5.低性能配置
export JAVA_OPTS="$JAVA_OPTS -Xms256M -Xmx256M"
步骤6. 运行安装脚本
sudo /usr/share/thingsboard/bin/install/install.sh --loadDemo
步骤7. 启动服务
sudo service thingsboard start
使用以下链接打开Web UI:
http://localhost:8080/
如果在安装脚本的执行过程中指定了-loadDemo则可以使用以下默认凭据:
系统管理员: sysadmin@thingsboard.org / sysadmin
租户管理员: tenant@thingsboard.org / tenant
客户: customer@thingsboard.org / customer
创建控制UI
登陆
登陆系统管理员>租户>默认租户>管理租户管理员>以管理员身份登陆
创建设备
设备>添加设备>填写名称,标签勾选是否网关>复制访问令牌(用于mqtt通讯)
创建仪表板库
仪表板库>添加仪表板>创建新仪表板>填写标题>添加>打开仪表板>进入编辑模式>添加新部件>创建新部件>control widgets>Knob Control>创建一个新别名>填写别名>筛选器类型:单个实体>类型:设备>创建设备时的名字>添加>编辑部件>高级>Value设置,默认值设置为0,最小值设置为99,最大值设定为99>设置,显示标题,显示标题图标,启用全屏>数据:特殊符号展示值设定%。
RPC API
客户端订阅服务端RPC命令必须SUBSCRIBE消息发送下面主题:
v1/devices/me/rpc/request/+
订阅后客户端会收到一条命令作为对相应主题的PUBLISH命令:
v1/devices/me/rpc/request/$request_id
$request_id表示请求的整型标识符。
客户端PUBLISH下面主题进行响应:
v1/devices/me/rpc/response/$request_id
代码实现
class MyMqtt(object):
def __init__(self, ip, acess_token, port):
self.float_value = 0.0
self.bool_value = False
self.client = mqtt.Client()
self.client.on_connect = self.on_connect
self.client.on_message = self.on_message
self.client.on_disconnect = self.on_disconnect
self.client.connect(ip, port, 60)
self.client.username_pw_set(acess_token)
self.client.loop_start()
self.onConnect = False
def on_connect(self, client, userdata, flags, rc):
print("Connected with result code "+str(rc))
if rc == 0:
self.onConnect = True
self.client.subscribe("v1/devices/me/rpc/request/+")
def on_disconnect(self, client, userdata, rc):
if rc != 0:
self.onConnect = False
def on_message(self, client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
topic_name = msg.topic
_msg = json.loads(msg.payload)
try:
if _msg['method'] == 'setValue':
if isinstance(_msg['params'], float) or isinstance(_msg['params'], int):
self.float_value = _msg['params']
print(self.float_value)
elif isinstance(_msg['params'], bool):
self.bool_value = _msg['params']
elif _msg['method'] == 'getValue':
recv_msg = '{"velocity":' +str(self.float_value)+'}'
pub_topic = topic_name.replace('request', 'response')
print(pub_topic + str(recv_msg))
self.client.publish(topic=pub_topic, payload=recv_msg)
elif _msg['method'] == 'getTermInfo':
recv_msg = '{"method":"getTermInfo"' + ',"params": '+str(self.float_value)+'}'
pub_topic = topic_name.replace('request', 'response')
print(pub_topic + str(recv_msg))
self.client.publish(topic=pub_topic, payload=recv_msg)
except KeyError as e:
if _msg['error'] == 'timeout':
print('publish timeout')
def publish(self, value):
if self.onConnect:
msg = b'{"formaldehyde": ' +str(value) + ' }'
self.client.publish(topic="formaldehyde", payload=msg, qos=1, retain=False)
def get_float_value(self):
return self.float_value
def get_bool_value(self):
return self.bool_value
``
class tc214b(object):
def init(self, ina_chip, ina_channel, inb_chip , inb_channel):
self.pwm_ina = PWM(ina_chip, ina_channel)
self.pwm_ina.frequency = 1e3
self.pwm_ina.duty_cycle = 0.0
self.pwm_ina.polarity = "normal"
self.pwm_inb = PWM(inb_chip, inb_channel)
self.pwm_inb.frequency = 1e3
self.pwm_inb.duty_cycle = 0.0
self.pwm_inb.polarity = "normal"
self.enable()
def enable(self):
self.pwm_ina.enable()
self.pwm_inb.enable()
def disable(self):
self.pwm_ina.disable()
self.pwm_inb.disable()
def onward(self, percentage):
self.pwm_ina.duty_cycle = percentage
self.pwm_inb.duty_cycle = 0.0
def backward(self, percentage):
self.pwm_ina.duty_cycle = 0.0
self.pwm_inb.duty_cycle = percentage
def brake(self):
self.pwm_ina.duty_cycle = 1.0
self.pwm_inb.duty_cycle = 1.0
def standby(self):
self.pwm_ina.duty_cycle = 0.0
self.pwm_inb.duty_cycle = 0.0
if __name__=="__main__":
my_mqtt = MyMqtt(MQTT_IP, MQTT_ACCESS_TOKEN, MQTT_PORT)
t = tc214b(1, 0, 2, 0)
while True:
value = my_mqtt.get_float_value()
if value >= -1.0 and value <= 1.0:
t.brake()
elif value < -1.0:
t.backward(abs(value)/100.0)
elif value > 1.0:
t.onward(abs(value)/100.0)