Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【手把手部署UI与动态数据】
Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【部署UI与动态数据】
文章目录
- Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【部署UI与动态数据】
- 1. 页面总览
- 2. 设备
- 2.1 数据字段定义
- 2.2 设备映射关系
- 2.3 添加设备
- 3 仪表盘UI
- 3.1 地图模块
- 3.2 空气监测土地监测模块
- 3.3 光照监控
- 3.4 温度湿度
- 3.5 土壤盐分
- 3.6 报警器
- 4 模拟设备数据
- 5 实际运行
1. 页面总览
本篇博文致力于快速部署,所以不会详解thingsboard中的相关知识点。详解请参照官方文档。
基础的服务部署见笔者上一篇博文ThingsBoard开源物联网平台智慧农业实例快速部署教程(Ubuntu、CentOS适用)
搭建页面整体效果如下:

动态效果如下:

2. 设备
2.1 数据字段定义
从页面中能够看到我们有9个大棚的数据,数据是动态更新的,从页面上的数据能够看到有(命名未按标准,类型定义随意):
| 字段 | 意义 | 所用模块 | 类型 |
|---|---|---|---|
| latitude | 纬度 | 地图 | double |
| longitude | 经度 | 地图 | double |
| N | 水解性氮 | 土壤盐分折线图 | double |
| P | 有效磷 | 土壤盐分折线图 | double |
| K | 速效钾 | 土壤盐分折线图 | double |
| illumination | 光照强度 | 光照监控折线图 | double |
| temperature | 气温 | 大棚温度仪表盘 | double |
| airHumidity | 空气湿度 | 大棚湿度仪表盘 | double |
| CO2 | 二氧化碳浓度 | 空气监测表格 | double |
| soilTemperature | 土壤温度 | 土地监测表格 | double |
| pH | 土壤pH值 | 土地监测表格 | double |
| soilMoisture | 土壤湿度 | 土地监测表格 | double |
| ventilate | 通风 | 空气监测表格 | bool |
| name | 大棚编号 | 报警器 | string |
2.2 设备映射关系
10个大棚都属于大棚这个类型,在设备定义中的关系映射为有10个大棚设备,每个大棚设备大棚x都有配置大棚。

2.3 添加设备
添加设备配置




添加设备



以此类推创建9个
由于地图上需要展示设备的位置,所以需要经纬度,一般设大棚位置不变动,考虑将其固定为大棚的属性,同样大棚编号也设置为固有属性。

3 仪表盘UI
进入仪表盘库编辑UI

点击编辑的笔尖

点击实体别名
实体别名相当于将设备接入仪表盘的媒介,有多种规则接入,按需选择。



为了某些特殊需要,也可以再添加单个设备的映射

请读者点击添加别名,笔者用编辑别名来展示参数选择

3.1 地图模块
按照笔者上篇博文,已经导入了一个仪表盘,在导入的仪表盘中有一个地图组件,如果我们自行导入地图组件的话按如下操作


设置腾讯地图,使用腾讯地图的key(需要读者自行申请),设置经度纬度字段。与设备属性字段设置对应起来

接下来就是绑数据的阶段,数据源设置刚刚创建的实体,别名为Silos,因为我们的引入规则为设备类型。所以10个具有大棚配置的大棚设备的数据都进入了数据源中。

数据设置属性,将经纬度加入


效果:

3.2 空气监测土地监测模块
这一部分选择实体表实现,在之前导入的布局中已经有实体表的组件,可以直接编辑,如果自己需要自行创建,那么可以选择组件包中的这个组件

空气监测的数据源设置如下

编号字段为实体字段,映射实体的系统自有值,所以实体字段name的值就是实体代表设备的设备名:大棚1、大棚2…,注意标签反应为表格的列名,下面的值都为name字段映射的设备名

下面的通风、空气湿度等等均为时序数据,新建数据键的时候添加时序数据的类型,键名要设置好,这里的数据是通过API接收json串的key,表格的值为实时更新的value,通过传统http或者mqtt等API接入,设置单位后每个值都会自动附带单位。

空气湿度设置如下

二氧化碳浓度设置如下

空气监测的导入仪表盘组件字体与直接添加组件默认不一样,这个是在设置中实现的,手动设置了标题样式,需要一点点的html基础

土地监测组件设置

与上述设置方式基本一致




效果如下:


读者的应该是暂时没有数据的,动态数据制造会在下面的章节4中介绍。
3.3 光照监控
光照监控使用如下组件


如下设置数据源

注意标签使用变量表达式(${entityName}),这样有条理

效果如下:

3.4 温度湿度
温度湿度采用这个部件


设置数据源,由于我们这个组件最大允许一个数据源,所以我们设置实体为单个设备的大棚1,数据键为时序字段。

设置标题并显示

设置刻度与最值

设置标题显示以及单位显示

效果如下

接下来设置湿度组件,湿度使用如下组件


设置数据源


设置刻度最值

设置单位

效果如下

3.5 土壤盐分
土壤盐分也是单个大棚显示多项数据,设置一个大棚的数据与光照监控的组件用法一致,不再赘述,时序数据源设置如下

设置标题显示

设置你要选择显示的统计信息

效果如下

但是这仍然只能显示一个大棚数据,切换多个查看大棚实时数据数据在这里使用动作->状态改变来实现,动作是在组件上形成反馈的功能,状态类似于页面
状态在这里选择

为大棚2单独设置一个状态,添加大棚2状态


将默认页面的组件复制过去

选择大棚2粘贴

将盐分数据源设为大棚2


在大棚1中添加按钮动作,设置为更新当前仪表盘状态,转到大棚2状态

设置如下:

大棚2等也是如此设置动作,效果如下(后期笔者动过部分组件,正常来说复制的完全一样差别不会这么大)

同样的方法设置温度和湿度,效果如上
由于笔者对API不熟悉,实际上应该有办法通过代码来直接变更数据源,但是短时间内笔者未找到,而且这是一篇快速部署教程,暂时也不拘泥于细节。
事实上动作可以采用自定义动作类型,但是widget上下文中只能使用当前数据源,没有找到能够读到全局实体别名并重新设置数据源的办法。如果有有经验的读者希望不吝赐教,十分感谢!
3.6 报警器
报警器需要在设备配置中设置告警规则,操作流程如下

详细设置:

支持若干条件表达,添加键名和规则


添加完成后来到仪表盘,添加如下部件

添加数据源,为了不使报警信息消失,采用一年的时间让消息堆积(看个人需求)

注意:除了位置是设备属性“编号”以外,其余的均为告警字段可以联系到内部的alarm,仅标签按照自己的需要设计即可




效果如下

至此UI设计(拖拖拽拽完毕)
4 模拟设备数据
为了让页面动起来,我们设计Linux脚本使用HTTP API进行模拟设备数据上报。
使用POST方式发送json串来上报数据,url格式如下:
http(s)://host:port/api/v1/$ACCESS_TOKEN/telemetry
$ACCESS_TOKEN为设备访问令牌,获取方式为

单一设备的上报脚本fakeData.sh,其接收一个参数,作为设备访问令牌,上报数据,上报的数据通过读取当前目录的data.txt进行匹配
#!/bin/bash
# Author:Moresweet
# Date:2023.3.26
# blog:https://blog.csdn.net/qq_38853759?spm=1000.2115.3001.5343# 检查脚本参数是否正确
if [ $# -ne 1 ]; thenecho "Usage: $0 <device_id>"exit 1
fi# 设置设备号和 URL
device_id=$1
url="http://127.0.0.1:8080/api/v1/${device_id}/telemetry"# 无限循环发送 POST 请求
while true; do# 读取数据文件,生成 JSON 数据并发送 POST 请求while read -r line; do# 解析数据行key=$(echo "$line" | awk '{print $1}')min=$(echo "$line" | awk '{print $2}')max=$(echo "$line" | awk '{print $3}')# 生成随机值if [ -z "$max" ]; then# 值列只有一个字段,当作字符串处理value=$minelse# 值列有两个字段,生成随机数value=$(awk -v min="$min" -v max="$max" 'BEGIN{srand(); printf("%.2f\n", min+rand()*(max-min+0.0001))}')fi# 构建 JSON 数据json="{\"${key}\":${value}}"# 发送 POST 请求curl -X POST -H "Content-Type: application/json" -d "$json" "$url"done < data.txt# 等待 5 秒钟后再次发送请求sleep 5
done
data.txt内容如下,每一行是json串的一个键值对,键为每一行的第一个数据,数据之间用空格隔开,第二个数据为合理值的最小阈值,第三个数据为合理值的最大阈值,如果本行只有第二个数据,则直接作为字符串作为对应键的值。
N 15 30
P 20 40
K 250 300
illumination 30000 35000
temperature 23 32
airHumidity 30 70
CO2 400 800
soilTemperature 15 25
pH 5.0 7.0
soilMoisture 50 80
ventilate true
start.sh为启动脚本,思路为在列表中取出所有访问令牌,作为参数后台运行fakeData.sh脚本,每个运行延时2秒,因为随机数的产生一般是取时间为种子,所以并不是真正的随机数,延时为了避免所有设备脚本产生的随机数一摸一样。
#!/bin/bash# 定义设备参数列表(按需修改此处)
devices=("xxxxxxxxxxxxxxxxx" "hdalhdaslhdalsdhasl" "cuvsaBdfdsL" "dasdsaLOHdsadL" "IkkkHJDSFSDlkjfds" "hhfds" "afsdfdsfsdfgfgfgh" "kjlhfldsjsldf" "gfeuheshfdsfjfsdkj")# 遍历设备列表执行fakeData.sh脚本并将其后台运行
for device in "${devices[@]}"
do./fakeData.sh "$device" &# 加延时防止伪随机数按时间产生“相同”的“随机”值sleep 2
done
stop.sh为结束脚本,如下所示
#!/bin/bash# 查找所有名为 fakeData.sh 的进程
pids=$(pgrep fakeData.sh)# 循环杀死每个进程
for pid in $pids; dokill $pid
done
5 实际运行
运行填补start.sh中的设备列表以及修改fakeData.sh中的ip地址即可。
设置运行权限
chmod u+x start.sh
chmod u+x stop.sh
chmod u+x fakeData.sh
启动脚本
./start.sh
停止脚本
./stop.sh
运行结果

相关文章:
Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【手把手部署UI与动态数据】
Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【部署UI与动态数据】 文章目录Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【部署UI与动态数据】1. 页面总览2. 设备2.1 数据字段定义2.2 设备映射关系2.3 添加…...
Redis事务
1、事务概要 Redis事务是一个单独的隔离操作: 事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用 串联多个命令,防止别的命令插队。 事务的3个命令 MultiExe…...
【蛤蟆先生去看心理医生】
第一章 整个人都不太好 人物性格描述蛤蟆热情、时尚、爱冒险,现在抑郁,不能自拔獾智慧、威严河鼠关心朋友,有点絮叨鼹鼠体贴善良 第二章 擎友前来相助 讲诉了鼹鼠和河鼠对蛤蟆情况的担忧和讨论。鼹鼠回忆起过去蛤蟆时髦的打扮和充满活力的生…...
JAVA开发与运维(云安全产品)
在现在的开发和运维中,云生态组件的使用率非常高,很少公司自己维护自己的物理机,网络流量 ,监控,第三方中间件,除了少数涉密程度高的部分和公司外,大多数的企业都在使用云生态。比如我们正在开发…...
[Few-shot learning] Siamese neural networks
这篇文章主要介绍的是Siamese Neural Network经典论文: Gregory Koch, et al., Siamese Neural Networks for One-shot Image Recognition. ICML 2015。 神经网络能够取得非常好的效果得益于使用大量的带标签数据进行有监督学习训练。但是这样的训练方法面临两个难题…...
利用qiankun框架在自己项目中集成拖拽式低代码数据可视化开发平台
目前微前端已经是很成熟的技术了,各大公司都推出了自己的微前端框架,比如蚂蚁的qiankun,京东的micro-app,如果你的子应用不使用vite构建的话,我会更加推荐后者,micro-app使用更加简单,micro-app…...
【spring boot】在Java中操作缓存:
文章目录一、Jedis二、Spring Data Redis(常用)【1】pom.xml【2】application.yml【3】RedisConfig【4】RuiJiWaiMaiApplicationTests三、Spring Cache【1】常用注解:【2】使用案例【3】底层不使用redis,重启服务,内存…...
擂台赛-安全攻防之使用openssh后门获取root密码实战
前言 大家好,我是沐风晓月,我们开始组队学习了,介绍下我们的情况: 这几天跟队员 迎月,虹月,心月,古月打擂台,我和心月一组,相互攻占对方服务器。 终于在今早凌晨三点拿…...
关于React入门基础从哪学起?
文章目录前言一、React简介1. React是什么2. react 与 vue 最大的区别就是:3. React特点4. React介绍描述5. React高效的原因6.React强大之处二、React基础格式1.什么是虚拟dom?2.为什么要创建虚拟dom?三、React也分为俩种创建方式1. 使用js的方式来创建…...
python玄阶斗技--tkinter库
目录 一.tkinter库介绍 二.功能实现 1.窗口创建 2.Button 按钮 3.Entry 文本输入域 4.text 文本框 5.Listbox 多选下拉框 6.Radiobutton 多选项按钮 7.Checkbutton 多选按钮 8.Scale 滑块(拉动条) 9.Scroolbar 滚动条 10.Menu 菜单栏 11. messagebox 消息框 12…...
【MySQL】MySQL的介绍MySQL数据库及MySQL表的基本操作
文章目录数据库的介绍什么是数据库数据库分类MySQL的介绍数据库的基本操作数据库的操作创建数据库查看所有数据库选中指定的数据库删除数据库常用数据类型数值类型字符串类型日期类型表的操作创建表查看指定数据库下的所有表查看指定表的结构删除表小练习数据库的介绍 什么是数…...
【每日随笔】社会上层与中层的博弈 ( 技术无关、没事别点进来看 | 社会上层 | 上层与中层的保护层 | 推荐学习的知识 )
文章目录一、社会上层二、上层与中层的保护层三、推荐学习的知识一、社会上层 社会上层 掌握着 生产资料 和 权利 ; 社会中层 是 小企业主 和 中产打工人 ; 上层 名额有限 生产资料所有者 : 垄断巨头 , 独角兽 , 大型企业主 , 大型企业股东 , 数量有限 ;权利所有者 : 高级别的…...
Cookie 和 Session的区别
文章目录时间:2023年3月23日第一:什么是 Cookie 和 Session ?什么是 Cookie什么是 Session第二:Cookie 和 Session 有什么不同?第三:为什么需要 Cookie 和 Session,他们有什么关联?第四&#x…...
leetcode使用vscode调试C++代码
leetcode使用vscode调试C代码 这里记录一下大体思路吧,关于细节配置放上别的博主的链接,他们讲的更好 vscode只是编辑器,相当于记事本,需要下载minGW提供的编译器和调试器 官方介绍: C/C拓展不包括编译器或调试器&…...
树莓派Linux源码配置,树莓派Linux内核编译,树莓派Linux内核更换
目录 一 树莓派Linux的源码配置 ① 内核源码下载说明 ② 三种方法配置源码 二 树莓派Linux内核编译 ① 内核编译 ② 编译时报错及解决方案(亲测) 三 更换树莓派Linux内核 操作步骤说明 ● dmesg报错及解决方案(亲测࿰…...
【C语言】深度讲解 atoi函数 使用方法与模拟实现
文章目录atoi使用方法:atoi模拟实现atoi 功能:转化字符串到整数 头文件: #include <stdlib.h> int atoi (const char * str); 参数 str:要转换为整数的字符串 返回值 如果转换成功,函数将转换后的整数作为int值…...
HTTPS的加密流程
1、概念HTTPS 是一个应用层协议,是在 HTTP 协议的基础上引入了一个加密层。HTTP 协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况。HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协…...
STM32配置读取BMP280气压传感器数据
STM32配置读取BMP280气压传感器数据 BMP280是在BMP180基础上增强的绝对气压传感器,在飞控领域的高度识别方面应用也比较多。 BMP280和BMP180的区别: 市面上也有一些模块: 这里介绍STM32芯片和BMP280的连接和数据读取。 电路连接 BMP28…...
【Linux】 基础IO——文件(中)
文章目录1. 文件描述符为什么从3开始使用?2. 文件描述符本质理解3. 如何理解Linux下的一切皆文件?4. FILE是什么,谁提供?和内核的struct有关系么?证明struct FILE结构体中存在文件描述符fd5. 重定向的本质输出重定向输…...
蓝桥杯刷题冲刺 | 倒计时13天
作者:指针不指南吗 专栏:蓝桥杯倒计时冲刺 🐾马上就要蓝桥杯了,最后的这几天尤为重要,不可懈怠哦🐾 文章目录1.母牛的故事2.魔板1.母牛的故事 题目 链接: [递归]母牛的故事 - C语言网 (dotcpp.c…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...

