阿里云物联网平台上存储的数据最多为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设置
设置完的结果如下图
操作要点:
消息类型选:物模型数据上报Topic余下部分选:thing/event/property/post
当选择好产品、设备名称后,会自动生成最终的topic:/gbs********/20210095/thing/event/property/post
2、本例数据目的设置
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,这四个变量为阿里云实例内的系统参数,查询步骤如下:
1、在实例页面点实例详情。
2、点右侧“查看开发配置”按钮。
在开发配置页面最下侧就是时序存储配置,用户名、密码、连接地址及端口号都在这里。
(2)查询变量
代码中的metric变量就是在数据流转脚本里设置的存入数据库的变量字段名,本例一共存入两个字段:“RH”、“CT”,所以查询的时候,metric只能为“RH”、“CT”。
4、测试结果
java程序中,下边这句代码是将查询结果输出到屏幕上,可以在Android studio的Run窗口看到结果。
System.out.println(lastDataValues);
查询结果如下:
结果已经能查询到,说明数据已经写入TSDB,流转配置成功!
本文章来源于互联网,如有侵权,请联系删除!原文地址:阿里云IoT物模型上报数据流转到实例内TSDB