SpringBoot集成IotDB

1、引入依赖

<dependency><groupId>org.apache.iotdb</groupId><artifactId>iotdb-session</artifactId><version>0.14.0-preview1</version></dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.6.3</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency>

2、iotdb 配置工具类

@Log4j2
@Component
@Configuration
public class IotDBSessionConfig {private static Session session;private static final String LOCAL_HOST = "127.0.0.1"; //改为自己服务器ip@Beanpublic Session getSession() throws IoTDBConnectionException, StatementExecutionException {if (session == null) {log.info("正在连接iotdb.......");session = new Session.Builder().host(LOCAL_HOST).port(6667).username("root").password("root").version(Version.V_0_13).build();session.open(false);session.setFetchSize(100);log.info("iotdb连接成功~");// 设置时区session.setTimeZone("+08:00");}return session;}
}

3、入参

@Data
public class IotDbParam {/**** 产品PK*/private  String  pk;/**** 设备号*/private  String  sn;/**** 时间*/private Long time;/**** 实时呼吸*/private String breath;/**** 实时心率*/private String heart;/**** 查询开始时间*/private String startTime;/**** 查询结束时间*/private String endTime;}

4、响应

@Data
public class IotDbResult {/**** 时间*/private String time;/**** 产品PK*/private  String  pk;/**** 设备号*/private  String  sn;/**** 实时呼吸*/private String breath;/**** 实时心率*/private String heart;}

5、控制层

@Log4j2
@RestController
public class IotDbController {@Resourceprivate IotDbServer iotDbServer;@Resourceprivate IotDBSessionConfig iotDBSessionConfig;/*** 插入数据* @param iotDbParam*/@PostMapping("/api/device/insert")public ResponseData insert(@RequestBody IotDbParam iotDbParam) throws StatementExecutionException, ServerException, IoTDBConnectionException {iotDbServer.insertData(iotDbParam);return ResponseData.success();}/*** 查询数据* @param iotDbParam*/@PostMapping("/api/device/queryData")public ResponseData queryDataFromIotDb(@RequestBody IotDbParam iotDbParam) throws Exception {return ResponseData.success(iotDbServer.queryDataFromIotDb(iotDbParam));}/*** 删除分组* @return*/@PostMapping("/api/device/deleteGroup")public ResponseData deleteGroup() throws StatementExecutionException, IoTDBConnectionException {iotDBSessionConfig.deleteStorageGroup("root.a1eaKSRpRty");iotDBSessionConfig.deleteStorageGroup("root.smartretirement");return ResponseData.success();}}

6、接口

public interface IotDbServer {/*** 添加数据*/void insertData(IotDbParam iotDbParam) throws StatementExecutionException, ServerException, IoTDBConnectionException;/*** 查询数据*/Object queryDataFromIotDb(IotDbParam iotDbParam) throws Exception;
}

7、实现层

@Log4j2
@Service
public class IotDbServerImpl implements IotDbServer {@Resourceprivate IotDBSessionConfig iotDBSessionConfig;@Overridepublic void insertData(IotDbParam iotDbParam) throws StatementExecutionException, ServerException, IoTDBConnectionException {// iotDbParam: 模拟设备上报消息// bizkey: 业务唯一key  PK :产品唯一编码   SN:设备唯一编码String deviceId = "root.bizkey."+ iotDbParam.getPk() + "." + iotDbParam.getSn();// 将设备上报的数据存入数据库(时序数据库)List<String> measurementsList = new ArrayList<>();measurementsList.add("heart");measurementsList.add("breath");List<String> valuesList = new ArrayList<>();valuesList.add(String.valueOf(iotDbParam.getHeart()));valuesList.add(String.valueOf(iotDbParam.getBreath()));iotDBSessionConfig.insertRecord(deviceId, iotDbParam.getTime(), measurementsList, valuesList);}@Overridepublic List<IotDbResult> queryDataFromIotDb(IotDbParam iotDbParam) throws Exception {List<IotDbResult> iotDbResultList = new ArrayList<>();if (null != iotDbParam.getPk() && null != iotDbParam.getSn()) {String sql = "select * from root.bizkey."+ iotDbParam.getPk() +"." + iotDbParam.getSn() + " where time >= "+ iotDbParam.getStartTime() + " and time < " + iotDbParam.getEndTime();SessionDataSet sessionDataSet = iotDBSessionConfig.query(sql);List<String> columnNames = sessionDataSet.getColumnNames();List<String> titleList = new ArrayList<>();// 排除Time字段 -- 方便后面后面拼装数据for (int i = 1; i < columnNames.size(); i++) {String[] temp = columnNames.get(i).split("\\.");titleList.add(temp[temp.length - 1]);}// 封装处理数据packagingData(iotDbParam, iotDbResultList, sessionDataSet, titleList);} else {log.info("PK或者SN不能为空!!");}return iotDbResultList;}/*** 封装处理数据* @param iotDbParam* @param iotDbResultList* @param sessionDataSet* @param titleList* @throws StatementExecutionException* @throws IoTDBConnectionException*/private void packagingData(IotDbParam iotDbParam, List<IotDbResult> iotDbResultList, SessionDataSet sessionDataSet, List<String> titleList)throws StatementExecutionException, IoTDBConnectionException {int fetchSize = sessionDataSet.getFetchSize();if (fetchSize > 0) {while (sessionDataSet.hasNext()) {IotDbResult iotDbResult = new IotDbResult();RowRecord next = sessionDataSet.next();List<Field> fields = next.getFields();String timeString = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(next.getTimestamp());iotDbResult.setTime(timeString);Map<String, String> map = new HashMap<>();for (int i = 0; i < fields.size(); i++) {Field field = fields.get(i);// 这里的需要按照类型获取map.put(titleList.get(i), field.getObjectValue(field.getDataType()).toString());}iotDbResult.setTime(timeString);iotDbResult.setPk(iotDbParam.getPk());iotDbResult.setSn(iotDbParam.getSn());iotDbResult.setHeart(map.get("heart"));iotDbResult.setBreath(map.get("breath"));iotDbResultList.add(iotDbResult);}}}
}

8、测试api

1.添加一条记录

接口:localhost:8080/api/device/insert

入参:

{"time":1660573444672,"pk":"a1TTQK9TbKT","sn":"SN202208120945QGJLD","breath":"17","heart":"68"
}

 2.根据SQL查询时间区间记录

接口:localhost:8080/api/device/queryData
入参:
{"pk":"a1TTQK9TbKT","sn":"SN202208120945QGJLD","startTime":"2022-08-14 00:00:00","endTime":"2022-08-16 00:00:00"
}

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/35576.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA小知识29:IO流(上)

IO流是指在计算机中进行输入和输出操作的一种方式&#xff0c;用于读取和写入数据。IO流主要用于处理数据传输&#xff0c;可以将数据从一个地方传送到另一个地方&#xff0c;例如从内存到硬盘&#xff0c;从网络到内存等。IO流在编程中非常常见&#xff0c;特别是在文件操作和…

如何使用Java中的正则表达式

如何使用Java中的正则表达式 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在Java开发中&#xff0c;正则表达式是处理文本和字符串的重要工具。本文将介绍如何…

第4章 客户端-Java客户端Jedis

1.获取Jedis maven配置加入项目中 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.2</version> </dependency>2.Jedis的基本使用 Jedis的使用方法非常简单&#xff0c;只要下面三…

陕西师范大学的教育学、汉语语言文学、外国语言文学(英语)和历史学专业的招聘专业要求

结合西安教师招聘汇公众号的信息以及参考文章中的相关内容&#xff0c;对于陕西师范大学的教育学、汉语语言文学、外国语言文学&#xff08;英语&#xff09;和历史学专业的招聘专业要求&#xff0c;可以做出如下总结和推荐&#xff1a; 教育学专业 专业要求与特点&#xff1…

每天一个数据分析题(三百八十七)- 线性回归分析

下列关于线性回归分析中的残差&#xff08;Residuals&#xff09;的假设说法正确的是&#xff1f; A. 残差均值总是为零 B. 残差均值总是小于零 C. 残差均值总是大于零 D. 以上说法都不对 数据分析认证考试介绍&#xff1a;点击进入 题目来源于CDA模拟题库 点击此处获取…

首次30米空间分辨率生成中国年度耕地栅格数据1986-2021

中国1986-2021年30米分辨率年度耕地数据集 数据介绍 精确、详细且及时的耕地范围信息对于粮食安全保障和环境可持续性至关重要。然而&#xff0c;由于农业景观的复杂性和足够训练样本的缺乏&#xff0c;在大范围下进行高时空分辨率的耕地动态监测仍然具有挑战性&#xff0c;尤其…

如何在next14项目中加入favicon

如何在next14项目中加入favicon 第一次碰见这个问题的时候很头疼&#xff0c;直接搜官方文档也没有详细介绍这个&#xff0c;但其实next14提供了很简单的方法&#xff1a; Convention 将 favicon.ico 放置在 app/ 或 public/ 文件夹中&#xff0c;Next.js 将自动生成必要的元…

基于深度学习的双目重建

基于深度学习的双目重建 双目重建是通过从两个相机视角的图像中提取深度信息&#xff0c;重建场景的三维结构。传统的双目重建方法依赖于特征匹配和几何计算&#xff0c;而基于深度学习的方法通过训练神经网络&#xff0c;可以直接从图像对中学习到深度信息和场景的三维结构。…

通俗易懂的理解zookeeper的作用

举个例子&#xff0c;乌鸡国国王想找唐僧师徒安排点任务&#xff0c;所以乌鸡国国王找了唐僧师徒团队的leader唐僧&#xff0c;因为唐僧可以管理团队的成员&#xff0c;知道团队内的大大小小事情。唐僧协调安排了合适的人帮乌鸡国国王解决需求。 那么leader唐僧&#xff0c;实…

ChatGPT的原理简介

ChatGPT的原理简介 目录 ChatGPT简介自然语言处理基础 词嵌入序列模型注意力机制 生成式预训练模型 Transformer架构GPT模型 ChatGPT的工作原理 预训练微调生成回复 应用和局限 应用场景局限和挑战 未来发展方向总结 ChatGPT简介 ChatGPT是OpenAI开发的一种生成式预训练模型…

sql优化方法

基础优化方法 1.使用索引&#xff0c;在创建索引时&#xff0c;需要考虑查询的频率和数据的更新频率&#xff0c;避免过度索引或不必要的索引。 2.尽量避免使用SELECT *&#xff0c;而是明确指定需要查询的字段。这样可以减少返回的数据量&#xff0c;提高查询效率。 优化查询…

洞察用户需求,Xinstall数据统计App让你的App运营如虎添翼

在互联网时代&#xff0c;App推广和运营面临着前所未有的挑战。流量红利逐渐衰退&#xff0c;用户获取成本不断攀升&#xff0c;如何确保在多变的互联网环境下&#xff0c;迅速搭建起能时刻满足用户需求的运营体系&#xff0c;成为众多企业急待解决的问题。今天&#xff0c;我们…

docker部署FastDFS整合Springboot

文章目录 1、FastDFS是什么&#xff1f;2、搭建docker环境3、部署fastdfs4、整合springboot5、接口测试参考文章 1、FastDFS是什么&#xff1f; FastDFS是一个开源的轻量级分布式文件系统&#xff0c;它对文件进行管理&#xff0c;功能包括&#xff1a;文件存储、文件同步、文…

聚星文社官网

推文工具可以帮助你将小说内容简洁明了地转化为推文形式&#xff0c;以便更好地在社交媒体上进行宣传和推广。以下是一些建议的小说推文工具&#xff1a; 聚星文社 字数统计工具&#xff1a;使用字数统计工具&#xff0c;如Microsoft Word或在线字数统计器&#xff0c;来确保你…

[JS]对象

介绍 对象是一种无序的数据集合, 可以详细的描述某个事物 事物的特征在对象中用属性来表示, 事物的行为在对象中用方法来表示 使用 创建对象 let 对象名 {属性名&#xff1a;值&#xff0c;方法名&#xff1a;函数&#xff0c; } let 对象名 new Object(); 对象名.属性…

【MySQL】记一次 SQL 优化

1 背景 我们的数据库中配置了一套慢 SQL 的监控(这里存在 SQL 本身不慢, 但是触发某些场景, 比如 filesort 等也会被采集), 会不定时的输出一批需要排查的 SQL, 下面挑了几条比较有意思的进行分享。 2 table_1 表结构: CEATE TABLE table_1 (column_1,column_2,column_3,co…

工业网关的功能与作用解析-天拓四方

在工业4.0和智能制造的时代背景下&#xff0c;工业网关作为连接现场设备与云端平台的桥梁&#xff0c;正发挥着日益重要的作用。它不仅为工业设备的远程监控和管理提供了可能&#xff0c;还为企业实现数字化转型和智能化升级提供了有力支持。本文将对工业网关的功能与作用进行解…

Python:基于TSFEL库对时间序列进行特征分析

1. TSFEL 时间序列作为主要TSFEL提取方法的输入传递&#xff0c;要么作为先前加载在内存中的数组传递&#xff0c;要么存储在数据集中的文件中。 由于TSFEL可以处理多维时间序列&#xff0c;因此随后应用了一套预处理方法&#xff0c;以确保信号质量足够和时间序列同步&#xf…

AI音乐大模型:深度剖析创意与产业的双重变革

随着AI技术的飞速发展&#xff0c;音乐大模型在最近一个月内纷纷上线&#xff0c;这一变革性技术不仅颠覆了传统的音乐创作方式&#xff0c;更是对整个音乐产业及创意产业带来了深远的影响。本文将从多个维度出发&#xff0c;深度剖析AI音乐大模型对创意与产业的双重变革。 一、…

ONLYOFFICE 8.1:引领桌面办公新潮流,功能升级全面提升

目录 一、ONLYOFFICE是什么&#xff1f; 二、功能完善的PDF编辑器 三、幻灯片版式升级 四、改进从右至左显示 五、新的本地化选项 六、多媒体功能增强 七、应用价值探讨 一、ONLYOFFICE是什么&#xff1f; ONLYOFFICE 是一款功能强大的办公套件&#xff0c;旨在提供全面…