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…...
MIPI D-PHYv2.5笔记(5) -- 不同的PHY配置方式
声明:作者是做嵌入式软件开发的,并非专业的硬件设计人员,笔记内容根据自己的经验和对协议的理解输出,肯定存在有些理解和翻译不到位的地方,有疑问请参考原始规范看 规范5.7章节列举了一些常见的PHY配置,但实…...
【周末闲谈】文心一言,模仿还是超越?
个人主页:【😊个人主页】 系列专栏:【❤️周末闲谈】 周末闲谈 ✨第一周 二进制VS三进制 文章目录周末闲谈前言一、背景环境二、文心一言?(_)?三、文心一言的优势?😗😗😗四、文心一…...
《一“企”谈》 | 「佛山市政」:携手企企通,让采购业务数智化
近日,国家施工总承包壹级企业「佛山市市政建设工程有限公司」(以下简称“佛山市政”)正积极布局数字化建设工作,基于采购业务数智化,携手企企通打造了SaaS采购云平台。 01、岭南建筑强企 匠心铸造精品 …...
Spark运行架构
目录 1 运行架构 2 核心组件 2.1 Driver 2.2 Executor 2.3 Master & Worker 2.4 ApplicationMaster 3 核心概念 3.1 Executor 与 Core 3.2 并行度( Parallelism) 3.3 有向无环图( DAG) 4 提交流程 …...
基于卷积神经网络CNN的水果分类预测,卷积神经网络水果等级识别
目录 背影 卷积神经网络CNN的原理 卷积神经网络CNN的定义 卷积神经网络CNN的神经元 卷积神经网络CNN的激活函数 卷积神经网络CNN的传递函数 卷积神经网络CNN水果分类预测 基本结构 主要参数 MATALB代码 结果图 展望 背影 现在生活,为节能减排,减少电能…...
Spring Boot 框架总结
Spring Boot 框架总结 1. springboot的引言 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的 初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不 再需要定义样板化的配置。通过这种方式࿰…...
【数据结构】第五站:带头双向循环链表
目录 一、链表的八种结构 二、带头双向循环链表的实现 1.链表的定义 2.链表的接口定义 3.接口的具体实现 三、带头双向循环链表的完整代码 四、顺序表和链表的区别 一、链表的八种结构 我们已经知道链表可以有以下三种分法 而这三种结构又可以排列组合,形成八…...
Springboot生成二维码
Springboot生成二维码整合 我们使用两种方式,去生成二维码,但是其实,二维码的生成基础,都是zxing包,这是Google开源的一个包,第一种是使用原始的zxing方式去实现,第二种是使用hutool来实现&…...
“独裁者”何小鹏,再造小鹏汽车
文丨智能相对论 作者丨沈浪 如果没有何小鹏,小鹏汽车将失去灵魂。 2014年,夏珩、何涛等人在广州组建小鹏汽车(当时还叫“橙子汽车”),何小鹏还只是股权投资人。 夏珩、何涛原任职于广汽,负责新能源汽车…...
数据结构 | 泛型 | 擦除机制| 泛型的上界
目录 编辑 1.泛型 1.1Object类引出泛型概念 2.泛型语法 2.1泛型编写代码 3.泛型的机制 3.1擦除机制 4.泛型的上界 4.1泛型上界的语法 4.2泛型上界的使用 5.泛型方法 5.1泛型方法语法 5.2泛型方法的使用 1.泛型 一般的类和方法中,只能使用具体的代码…...
赣州快车微信公众号/福州seo视频
本文为Adam Johansson & Mohamed Osman的学士论文,共56页。 本项目首先概述了什么是敏感数据、加密算法和本论文项目所需的其他知识。这是因为本论文的目的,即寻找最佳的方式来加密通过URL传递的数据,以保护web应用程序中的敏感数据。通…...
如何做可以微信转发的网站/深圳网络推广营销
2019独角兽企业重金招聘Python工程师标准>>> 在前几篇中,我们搭建好了Go语言的开发环境,从今天开始就正式进入Go语言的编程学习了。 一、Go语言程序基本结构与外部包的导入 首先来看Go语言程序的基本结构: 以上就是最基本的结构&a…...
江苏seo网站排名优化/宁波seo公司排名
SQLalchemy 是 Python 中的 ORM 模型,在开发的过程中,遇到了如何对字段值进行判空的坑 方法一 table.name is None 这样的写法 Python 的解释器不会报错,但是结果和预期不符,解释器直接忽略这一行 方法二 table.name None 这…...
如何再网站上做免费广告/品牌营销公司
上面我们说了神经网络的基础知识,根据上章的基础尝试搭建一个标准的3层神经网络,参考https://www.cnblogs.com/bestExpert/p/9128645.html 1.框架代码 1.>初始化函数 — 设定输入层节点、隐藏层节点、输出层节点的数量,设置学习率和各层的…...
临沂哪家做网站最好/关键词搜索名词解释
分析: 根据欧拉函数的那个性质 if(p是质数){if(i % p 0) f[i * p] f[i] * p;else f[i * p] f[i] * (p - 1);}每次区间乘的那个数小于等于100,所以我们可以考虑把100以内的数质因数分解,区间乘100相当于区间乘两个2和两个5,但是…...
国外做蛋糕网站/企业营销网站制作
一、格式化文件系统 mkfs当完成硬盘分区以后要进行硬盘的格式化,mkfs系列对应的命令用于将硬盘格式化为指定格式的文件系统。mkfs 本身并不执行建立文件系统的工作,而是去调用相关的程序来执行。例如,若在 -t 参数中指定 ext2,则m…...