阿里云IoT物模型上报数据流转到实例内TSDB

阿里云物联网平台上存储的数据最多为30天,为了能让数据永久保存下来,就需要把物联网平台的数据流转到其他的数据库,对于企业版实例,内部有一个实例内的时空数据库TSDB,正好可以利用。下边就介绍一下物联网平台的物模型上报数据怎么流转到实例内TSDB,怎么查看TSDB内的数据。

目录

一、阿里云物联网设备物模型属性数据格式

1、Topic

2、数据格式

二、本例items具体内容

三、数据流转设置

1、本例数据源Topic设置

2、本例数据目的设置

3、本例脚本代码

四、TSDB内容查询

1、本例主程序

2、本例程序要添加的依赖

3、代码需要改动的部分

(1)连接数据库变量

(2)查询变量

4、测试结果


一、阿里云物联网设备物模型属性数据格式

此部分内容来自阿里云物联网平台官网介绍,具体可以参考:数据格式 (aliyun.com)

1、Topic

Topic:/${productKey}/${deviceName}/thing/event/property/post

通过该Topic获取设备上报的属性信息。

2、数据格式

{
    "iotId":"4z819VQHk6VSLmmBJfrf00107e****",
    "requestId":"2",
    "productKey":"al12345****",
    "deviceName":"deviceName1234",
    "gmtCreate":1510799670074,
    "deviceType":"Ammeter",
    "items":{
        "Power":{
            "value":"on",
            "time":1510799670074
        },
        "Position":{
            "time":1510292697470,
            "value":{
                "latitude":39.9,
                "longitude":116.38
            }
        }
    },
    "checkFailedData":{
        "attribute_8":{
            "time": 1510292697470,
            "value": 715665571,
            "code":6304,
            "message":"tsl parse: params not exist -> attribute_8"
        }
    }
}

参数说明:

参数 类型 说明 iotId String 设备在平台内的唯一标识。 requestId String 设备上报消息的原始数据中的Id,String类型的数字,取值范围为0~4294967295,且每个消息ID在当前设备中具有唯一性。 productKey String 设备所属产品的唯一标识。 deviceName String 设备名称。 gmtCreate Long 数据流转消息产生时间。 deviceType String

设备所属品类。

该品类是您在物联网平台创建产品时选择的品类。具体说明,请参见创建产品或CreateProduct。

items Object 设备数据。 Power String 属性标识符。产品所具有的属性名称请参见产品的TSL描述。如果是自定义模块属性,属性标识符格式为
${模块标识符}:${属性标识符}(中间为半角冒号)。例如,物模型自定义模块标识符为test,数据格式为:

"items":{
        "test:Power":{
            "value":"on",
            "time":1510799670074
        },
        "test:Position":{
            "time":1510292697470,
            "value":{
                "latitude":39.9,
                "longitude":116.38
            }
        }
    }

Position attribute_8 checkFailedData Object 未通过物模型数据校验的数据。 value 根据TSL定义 属性值。 time Long 上报属性的时间,如果设备没有上报数据,默认采用在物联网平台生成的时间。 code Integer 数据未通过物模型数据校验时,返回的错误码。详细说明,请参见
设备端接收的错误码。 message String 数据未通过物模型数据校验时,返回的错误码信息,包含错误原因和具体的错误参数。

二、本例items具体内容

注意,上述数据格式内容里items中的那部分内容才是最核心的东西,是设备属性上报的具体内容,其他部分都是跟系统、产品、设备本身相关的属性,除deviceName之外其他可以不用关注。

本例要流转两个数据:RH(Relative Humidity,相对湿度),CT(Current Temperature,当前温度),items内的数据内容如下:

    "items":{
        "RH":{
            "value":56,
            "time":1510799670074
        },
        "CT":{
            "value":32,
            "time":1510799670074
        }

    }

三、数据流转设置

数据流转的具体操作步骤见以下文章介绍:

阿里云物联网Iot设备上下线状态数据流转的设置_m0_72963799的博客-CSDN博客

上文介绍的是设备状态流转到其他设备,跟本文的区别在于数据源的topic、数据目的和脚本内容不一致,其他操作步骤完全一样。

1、本例数据源Topic设置

阿里云IoT物模型上报数据流转到实例内TSDB

  

设置完的结果如下图

阿里云IoT物模型上报数据流转到实例内TSDB

操作要点:
消息类型选:物模型数据上报

Topic余下部分选:thing/event/property/post

当选择好产品、设备名称后,会自动生成最终的topic:/gbs********/20210095/thing/event/property/post

2、本例数据目的设置

阿里云IoT物模型上报数据流转到实例内TSDB

3、本例脚本代码

var data = payload("json");

var RH=getOrNull(data,"items","RH","value");
var CT=getOrNull(data,"items","CT","value");

if(RH!=null)
    {
        writeTsdb(1013,timestamp(),"RH",RH,{"deviceName":deviceName()});
    }
if(CT!=null)
    {
        writeTsdb(1013,timestamp(),"CT",CT,{"deviceName":deviceName()});
    }

 存入tsdb的函数writeTsdb(),本例有五个参数,第一个1013为数据目的ID,第二个为时间戳timestamp(),第三个”RH”就是要存入数据库的字段名,第四个RH及为相对湿度的具体数值,第五个{“deviceName”:deviceName()}为设备名称的map数据,如果系统内有多个设备的RH数据,就都会搜索出来。

四、TSDB内容查询

由于实例内的tsdb不能直接从阿里云物联网平台上查看数据库内的内容,只能借助API编写程序来查询。本例使用Android studio3.6.3开发的查询程序。

1、本例主程序

package com.example.mytsdb;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextClock;
import android.widget.TextView;

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.LastPointQuery;
import com.aliyun.hitsdb.client.value.request.LastPointSubQuery;
import com.aliyun.hitsdb.client.value.response.LastDataValue;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    
     //实例详情页面中的时序数据存储的连接地址、用户名、密码。
    String connectString = "ts-2ze0*************.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);


        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    final TSDBConfig config = TSDBConfig.address(connectString, port)
                            .basicAuth(username, password)
                            // 网络连接池大小,默认为64。
                            .httpConnectionPool(64)
                            // HTTP 等待时间,单位为秒,默认为90秒。
                            .httpConnectTimeout(90)
                            // IO 线程数,默认为1。
                            .ioThreadCount(1)
                            .config();
                            TSDB tsdbClient = TSDBClientFactory.connect(config);
                            //按标签筛选数据。
                            Map tags = new HashMap();
                            String metric = "RH";
                            long now = System.currentTimeMillis();
                            LastPointQuery query = LastPointQuery.builder()
                                    .timestamp(now)
                                    .backScan(-1)
                                    .msResolution(true)
                                    .sub(LastPointSubQuery.builder(metric, tags).build()).build();
                            List lastDataValues = tsdbClient.queryLast(query);

                            System.out.println(lastDataValues);

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

                }
            }
        }).start();


    }

}

2、本例程序要添加的依赖

implementation 'com.aliyun:hitsdb-client:0.2.7'

3、代码需要改动的部分

(1)连接数据库变量

连接数据库变量有4个:connectString、port、username、password,这四个变量为阿里云实例内的系统参数,查询步骤如下:
 

阿里云IoT物模型上报数据流转到实例内TSDB

1、在实例页面点实例详情。

2、点右侧“查看开发配置”按钮。

阿里云IoT物模型上报数据流转到实例内TSDB

在开发配置页面最下侧就是时序存储配置,用户名、密码、连接地址及端口号都在这里。

(2)查询变量

代码中的metric变量就是在数据流转脚本里设置的存入数据库的变量字段名,本例一共存入两个字段:“RH”、“CT”,所以查询的时候,metric只能为“RH”、“CT”。

4、测试结果

 java程序中,下边这句代码是将查询结果输出到屏幕上,可以在Android studio的Run窗口看到结果。

System.out.println(lastDataValues);

查询结果如下:

阿里云IoT物模型上报数据流转到实例内TSDB

 结果已经能查询到,说明数据已经写入TSDB,流转配置成功!

本文章来源于互联网,如有侵权,请联系删除!原文地址:阿里云IoT物模型上报数据流转到实例内TSDB