物联网平台搭建的全过程介绍(七)——本地数据批量上传阿里云物联网实例内TSDB

在文章物联网平台搭建的全过程介绍(六)——物联网TSDB之基本知识及读写代码介绍中介绍了TSDB基础知识和读取和写入数据的基本操作。但在该文中只给出了单条数据写入的代码。

那么假如有这样一种情况,我物联网平台已经建立起来了,但是在平台建立之前,我很多设备的数据已经采集存到了本地,我想把这些数据上传到物联网平台内的TSDB内,应该怎么操作呢?

这就需要批量数据上传的问题。本例给出了一种简单的方案,谨供参考。

目录

一、准备工作

1、本地原始数据

2、日期时间转换成时间戳

3、把原始数据按照tsdb数据包格式进行处理

4、将数据转换为txt格式

二、编写jave程序

1、layout设计

2、 添加依赖

3、jave程序

(1)全部代码

(2)把txt文件放入res/raw文件夹下

(3)调取并打开temperature.txt文件

(4)按行读取txt文件内容

(5)把数据上传TSDB

(6)利用Handler来等待网络相关线程结束

三、测试

1、相关代码

2、读取结果


一、准备工作

1、本地原始数据

温度数据
设备编号 采集日期时间 数值
20211000 2022年7月11日 12:27:56 23.9 
20210138 2022年4月24日 9:28:09 37.6 
20210133 2022年5月13日 10:05:49 32.8 
20210143 2022年4月26日 13:54:43 38.7 
20210139 2022年6月11日 17:18:49 33.2 
20210135 2022年8月24日 10:08:00 35.3 
20210134 2022年5月11日 10:38:10 32.1 
20210130 2022年5月14日 11:46:15 28.8 
20210145 2022年8月21日 12:22:38 23.3 
20210144 2022年6月18日 7:09:12 39.3 
20210132 2022年5月13日 13:28:05 35.5 
20210141 2022年8月25日 18:41:42 37.5 
20210142 2022年4月28日 9:31:14 28.7 
20210137 2022年4月26日 13:29:09 31.2 
20210131 2022年6月7日 6:24:43 30.9 
20210136 2022年4月24日 15:47:59 26.4 
20210140 2022年6月5日 10:56:10 20.2 
20210124 2022年5月11日 9:31:18 28.0 
20210129 2022年4月28日 10:41:59 33.6 
20210160 2022年5月11日 11:27:34 30.5 

2、日期时间转换成时间戳

首先把采集日期和时间转换成时间戳,利用excel即可。计算公式:

timestamp=(XN-19-70*365)*86400-8*3600,XN为日期、时间所在的单元格。注意,此公式计算出来的是秒,本例时间戳的单位为毫秒,所以需要把最终结果再乘1000,得到以下结果。

温度数据
设备编号 时间戳 数值
20211000 1657513675760  23.9 
20210138 1650763688784  37.6 
20210133 1652407549423  32.8 
20210143 1650952483023  38.7 
20210139 1654939129220  33.2 
20210135 1661306880379  35.3 
20210134 1652236689967  32.1 
20210130 1652499974879  28.8 
20210145 1661055757676  23.3 
20210144 1655507351683  39.3 
20210132 1652419684665  35.5 
20210141 1661424101807  37.5 
20210142 1651109473699  28.7 
20210137 1650950949310  31.2 
20210131 1654554282844  30.9 
20210136 1650786478805  26.4 
20210140 1654397769561  20.2 
20210124 1652232678091  28.0 
20210129 1651113719028  33.6 
20210160 1652239653588  30.5 

3、把原始数据按照tsdb数据包格式进行处理

metric为温度值,命名为:temperature

tag为设备编号,timestamp为时间戳

metric:temperature
tag timestamp value
20211000 1657513675760  23.9 
20210138 1650763688784  37.6 
20210133 1652407549423  32.8 
20210143 1650952483023  38.7 
20210139 1654939129220  33.2 
20210135 1661306880379  35.3 
20210134 1652236689967  32.1 
20210130 1652499974879  28.8 
20210145 1661055757676  23.3 
20210144 1655507351683  39.3 
20210132 1652419684665  35.5 
20210141 1661424101807  37.5 
20210142 1651109473699  28.7 
20210137 1650950949310  31.2 
20210131 1654554282844  30.9 
20210136 1650786478805  26.4 
20210140 1654397769561  20.2 
20210124 1652232678091  28.0 
20210129 1651113719028  33.6 
20210160 1652239653588  30.5 

4、将数据转换为txt格式

把以上数据去除表头之后的数据转换为txt格式,命名为temperature.txt并存放起来,以备用。 

注意,此txt文件最好是从excel直接拷贝过来的。这样保证每列数据之间是tab格,而不是多个空格,如果有多余的空格,后边读取每一行字符串并解析设备编号、时间戳和温度值三个变量数据的时候会出错。文本最后一行多余的空格也要删掉。

物联网平台搭建的全过程介绍(七)——本地数据批量上传阿里云物联网实例内TSDB

二、编写jave程序

1、layout设计

随便放一个按钮和Textview,点按钮后执行写入程序,Textview用于显示操作结果即可,不详细介绍了。

2、 添加依赖

    implementation 'com.aliyun:hitsdb-client:0.2.7'
    implementation 'org.slf4j:slf4j-simple:1.7.25'

3、jave程序

(1)全部代码

package com.example.readtsdb;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.widget.TextView;
import android.widget.Button;

import android.content.ContentValues;
import android.content.Intent;
import android.view.View;
import android.widget.TextClock;


import com.aliyun.hitsdb.client.TSDB;
import com.aliyun.hitsdb.client.TSDBClientFactory;
import com.aliyun.hitsdb.client.TSDBConfig;
import com.aliyun.hitsdb.client.value.request.Point;
import com.aliyun.hitsdb.client.value.request.Point;


import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import java.io.InputStream;
import android.content.res.Resources;

public class MainActivity extends AppCompatActivity {
    Button bt1;
    TextView tv1;
    String connectString = "ts-*****************.hitsdb.rds.aliyuncs.com";
    int port = 3242;
    //实例详情页面中的时序数据存储用户名、密码。
    String username = "iotuser";
    String password = "***********";    


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        bt1=this.findViewById(R.id.write);
        tv1 = this.findViewById(R.id.status);
        final Resources res = super.getResources();//获取资源文件

        
        //以下为点按钮把数据写入tsdb

        bt1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

        
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    final TSDBConfig config = TSDBConfig.address(connectString, port)
                            .basicAuth(username, password)
                            // 网络连接池大小,默认为64。
                            .httpConnectionPool(128)
                            // HTTP 等待时间,单位为秒,默认为90秒。
                            .httpConnectTimeout(90)
                            // IO 线程数,默认为1。
                            .ioThreadCount(1)
                            .config();

                    TSDB tsdbClient = TSDBClientFactory.connect(config);
                    long now = System.currentTimeMillis();

                    
                    // 读取raw目录下txt文件temperature
                    InputStream input = res.openRawResource(R.raw.temperature);	
                    
                    // 实例化Scan
                    Scanner scan = new Scanner(input);

                    String TempInfo = null; //定义txt文件内的行字段变量

                    // 循环读取
                    while (scan.hasNext()) {								
                        
                        // 按行读取
                        TempInfo =scan.nextLine();
                        
                        //数据按空格拆分存入数组内                          
                        String[] ArrayTempInfo=TempInfo.split("t+");

                        //从数组中取出时间戳、设备编号、温度等字符串并转成相应类型数据
                        long timestamp = Long.parseLong(TempInfo[1]);
                        String deviceName=TempInfo[0];
                        Double temp=Double.parseDouble(TempInfo[2]);
                                                
                        
                        // 构造Point。
                        Point point = Point.metric("Temperature")
                            .tag("deviceName", deviceName)
                            .timestamp(timestamp).value(temp)
                            .build();
                     
                        //直接提交数据。
                        tsdbClient.put(point);

                    }
                   
                    //关闭输入流
                    scan.close();
                    mHandler.sendEmptyMessage(0);
                    


                } catch (Exception e) {
                    e.printStackTrace();

                }
            }
        }).start();


            }
        });

    }


    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    tv1.setText("数据写入完成!");
                    break;
            }
        }
    };

}

(2)把txt文件放入res/raw文件夹下

把文件temperature.txt直接拖进raw文件夹内即可。

物联网平台搭建的全过程介绍(七)——本地数据批量上传阿里云物联网实例内TSDB

(3)调取并打开temperature.txt文件

此处注意,打开文件执行完读取操作后,要用.close方法把文件关闭。

final Resources res = super.getResources();//获取资源文件
// 读取raw目录下txt文件temperature
InputStream input = res.openRawResource(R.raw.temperature);	
                    
// 实例化Scan
Scanner scan = new Scanner(input);


//此处添加打开文件后的具体操作




//操作完之后关闭输入流
scan.close();




(4)按行读取txt文件内容

按行读取temperature.txt文件,并把行字符串截分成设备编号、时间戳、数值三部分,存入数组,然后赋值给三个变量timestamp、deviceName、temp。

String TempInfo = null; //定义txt文件内的行字段变量

// 循环读取
while (scan.hasNext()) {								
                        
    // 按行读取
    TempInfo =scan.nextLine();
                        
     //数据按空格拆分存入数组内                          
    String[] ArrayTempInfo=TempInfo.split("t+");

    //从数组中取出时间戳、设备编号、温度等字符串并转成相应类型数据
    long timestamp = Long.parseLong(TempInfo[1]);
    String deviceName=TempInfo[0];
    Double temp=Double.parseDouble(TempInfo[2]);


}

(5)把数据上传TSDB

用Point(数据点)类把变量timestamp、deviceName、temp数值打包并上传。

                        // 构造Point。
                        Point point = Point.metric("Temperature")
                            .tag("deviceName", deviceName)
                            .timestamp(timestamp).value(temp)
                            .build();
                     
                        //直接提交数据。
                        tsdbClient.put(point);

(6)利用Handler来等待网络相关线程结束

因为上传数据到tsdb属于网络操作,必须在新开线程里进行。待上传tsdb线程结束后,给Handler发送一条消息,触发Handler内的case 0下的执行语句。

mHandler.sendEmptyMessage(0);//此句是触发mHandler运行的一个条件,放在网络线程结束之后的地方



    @SuppressLint("HandlerLeak")
    private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 0:
                    tv1.setText("数据写入完成!");
                    break;
            }
        }
    };

三、测试

待上传完成后,要读取一下刚上传的内容是否正确。

1、相关代码

读取代码如下(此部分代码在jave主程序里没有给,可另外设计一个”读取”按钮,把这部分代码放到按钮监听里)

注意:当没有设置tags时,那么就把所有的tags的数据都读出来了。

                    Map tags = new HashMap();
//                    tags.put("deviceName","20210181");//当不限定tag时,即搜寻所有的tags
                    String metric = "Temperature";


                    LastPointQuery query = LastPointQuery.builder()
                            .timestamp(now)
                            .backScan(0)
                            .msResolution(true)
                            .sub(LastPointSubQuery.builder(metric, tags).build()).build();
                    List lastDataValues = tsdbClient.queryLast(query);

                    System.out.println(lastDataValues);

2、读取结果

读取结果如下图所示,可以看到刚上传到tsdb里的数据都可以读取出来了。但发现读取的内容顺序和写入内容的顺序不一致,而且读出来的数据也不是按时间戳排列的。这点还需要再研究一下原因。

物联网平台搭建的全过程介绍(七)——本地数据批量上传阿里云物联网实例内TSDB

 (全文结束)

本文章来源于互联网,如有侵权,请联系删除!原文地址:物联网平台搭建的全过程介绍(七)——本地数据批量上传阿里云物联网实例内TSDB

相关推荐: 寺庙住持开发出AR佛陀,通过手机传经授道;字节去年净亏损超6千亿;苹果手表过热爆炸丨云腾五洲IoT早报

10月10日 | 星期一 今日物语 AIoT Headline 人为了生活,需要各种各样的知识。但是仅仅有知识没有实际的作用,必须把知识提升到“无论如何也要这样”的见识,进而提升到“不管任何阻力,也要把见识付诸行动”的胆识。 —— 哲学大师 安冈正笃 一、【物…