鼎鼎知识库
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

TDengine在项目中的使用.md 11KB

TDengine时序数据库安装

云上Ubuntu服务器前期准备

apt update 
sudo apt update
apt-get update
sudo apt-get update

安装可视化桌面

apt-get install ubuntu-desktop

Windows远程桌面连接Ubuntu.Ubuntu支持xrdp和vnc两种远程桌面协议。vnc是默认的基于RFB协议的远程桌面程序,但不够友好。

sudo apt-get install xrdp
sudo apt-get install vnc4server tightvnserver(有一次没有安装成功)
sudo apt-get install xubuntu-desktop
echo "xfce4-session" >~/.xsession
sudo service xrdp restart
通过windows远程桌面连接,连接成功,输入用户名和密码,终于看到ubuntu的界面!并且可以浏览网站!

安装TDengine

确认是否有systemd命令:which systemd
登录网址:https://www.taosdata.com/cn/getting-started/ 
下载:下载deb包,输入邮件地址
安装位置:/root/Downloads/
打开命令行终端:alt+f2, gnome-terminal
查看当前位置:pwd
来到所在目录:cd Downloads
安装TDengine: sudo dpkg -i tdengine-1.6.2.2.deb
安装成功提示:
    TDengine is installed successfully!
    To configure TDengine: edt /etc/taos/taos.cfg
    To start TDengine: sudo systemctrl start taosd
    To access TDengine: use taos in shell
回到根目录: cd ~
来到TDengine的配置文件:cd /etc/taos/
检查taosd状态:systemctl status taosd
启动服务:systemctl start taosd
再次查看服务状态:systemctl status taosd

更新TDengine

-- 远程登录服务器
-- 检查taosd状态:systemctl status taosd
-- 停掉taosd服务:systemctl stop taosd
-- 登录网址:https://www.taosdata.com/cn/getting-started/ ,下载deb包,会把安装包发送到邮箱
-- 查看当前目录:pwd
-- 来到下载文件所在目录:cd Downloads
-- 查看文件:ls
-- 安装新版:sudo dpkg -i TDengine-server-1.6.6.0-Linux-x64.deb
-- 提示:TDEngine is removed successfully!TDengine is installed successfully! /etc/taos/taos.cfg
-- 再次查看状态:systemctl status taosd
-- 再次启动: systemctl start taosd
-- 下载客户端并安装,被安装到了C:\TDengine中
-- 登录,版本已经升级为1.6.6.0

在linux上小试牛刀

taos
创建数据库:create database db;
查看所有数据库:show databases;
使用数据库:use db;
创建表:create table t(ts timestamp, cdata int);
插入数据:
    insert into t values ('2019-07-15 00:00:00',10);
    insert into t values ('2019-07-15 01:00:00', 20);

查询:select * from t;

Windows连接Ubuntu上的TDengine

初次连接失败: ./taos.exe -h ip
查看是否ping通:ping ip
安装最新的客户端版本

还是不行。熟悉vi的使用,修改配置文件。

三种命令模式:
    命令模式切换到插入模式:i
    从插入模式切回到命令模式:esc
    在命令模式下,按 :wq 表示保存并退出, 按 :q! 表示不保存并退出
三种插入模式:
    i 从光标当前位置开始
    a 从光标所在位置的下一个位置开始
    o 从光标的行首插入一行
命令模式下光标的移动:
    h 向左
    l 向右
    k 向上
    j 向下
    数字0 本行最开头
    G 最后一行最开头
    $ 本行行尾
    ^ 所在行行首
    w 下一个字母的开头
    e 下一个字母的结尾
    b 上一个字母的开头
命令模式下删除文字
    x 每按一次删除光标位置后面的一个字符
    6x 删除光标位置后面的6个字符
    X 每按一次删除光标位置前面的一个字符
    20X 删除光标位置前面的20个字符
    dd 删除光标所在行

修改taos.cfg配置文件

- 确认配置:sudo vi /etc/taos/taos.cfg  internalIP:是ifconfig中的地址
- 确认开启服务:systemctl stop taosd systemctl start taosd systemctl status taosd
- 确认服务器防火墙没在起作用:sudo ufw status
- 确认服务器开放6020-6040端口,并且是TCP和UDP都要打开(安全组设置tcp和udp都要打开,小于64KB的包默认是udp发送)
- 确认客户端命令正确:./taos.exe -h ip
- ubuntu重启:reboot

本地环境搭建

  • 本地服务器:192.168.8.131 teche123
  • 确认模块ip地址:187ED5314E0C 192.168.9.134
  • 登录模块:192.168.9.134:82 root abc123
  • 修改服务器指向:192.168.8.131:8080/ebx-bishop/data/carry
  • 确认服务打开:MysqlServer, redis-server
  • 启动网站:dot.net exe TaiHe.Electricity.Web.dll
  • 打开网站:192.168.8.131:8080 TecheFwd2018(泰和网站密码DrrnFwd2018,泰和服务器密码TecheFwd123)
  • 测试可视化界面是否可以操作

SDK使用原理

Startup.cs中的设置

包括参数、数据库、普通表和超级表配置、帮助类、模拟数据的背景现场。

 //参数配置
            services.Configure<TConfiguration>(Configuration.GetSection("TDegnine"));//在appsetting.json中配置TDengine结点

            //数据库配置
            services.AddTransient<ITDatabase, TDatabase>();//数据库接口和实现

            //普通表和超级表配置
            services.AddTransient<ITSuperTable<SuperReal>, TSuperTable<SuperReal>>();//超级表,实时数据
            services.AddTransient<ITSuperTable<SuperRealTj>, TSuperTable<SuperRealTj>>();//超级表,实时数据统计

            services.AddTransient<ITSuperTable<SuperWarning>, TSuperTable<SuperWarning>>();//超级表,报警
            services.AddTransient<ITSuperTable<SuperWarningTj>, TSuperTable<SuperWarningTj>>();//超级表,报警统计

            services.AddTransient<ITSuperTable<SuperDl>, TSuperTable<SuperDl>>();//超级表,电量

            services.AddTransient<ITSuperTable<SuperKg>, TSuperTable<SuperKg>>();//超级表,开关统计
            services.AddTransient<ITSuperTable<SuperKgTj>, TSuperTable<SuperKgTj>>();//超级表,开关统计的统计

            //子表配置
            services.AddTransient<ITChildTable<Real>, TChildTable<Real>>();//子表,实时数据
            services.AddTransient<ITChildTable<RealTj>, TChildTable<RealTj>>();//子表,实时数据统计
            services.AddTransient<ITChildTable<Warning>, TChildTable<Warning>>();//子表,报警
            services.AddTransient<ITChildTable<WarningTj>, TChildTable<WarningTj>>();//子表,报警统计
            services.AddTransient<ITChildTable<Dl>, TChildTable<Dl>>();//子表,电量
            services.AddTransient<ITChildTable<Kg>, TChildTable<Kg>>();//子表,开关统计
            services.AddTransient<ITChildTable<KgTj>, TChildTable<KgTj>>();//子表,开关统计统计

            //实时计算流返回结果保存到普通表
            //services.AddTransient<ITStream<RealTj>, TStream<RealTj>>(); //实时数据流计算结果
            //services.AddTransient<ITStream<WarningTj>, TStream<WarningTj>>();//报警数据流计算结果
            //services.AddTransient<ITStream<KgTj>, TStream<KgTj>>();//开关统计流计算结果

            //帮助类配置
            services.AddSingleton(typeof(CommonHelper));//共用帮助类
            services.AddTransient(typeof(MacHelper));//获取模块的帮助类

            services.AddSingleton(typeof(RealHelper));//帮助类,实时数据
            services.AddSingleton(typeof(RealTjHelper));//帮助类,实时数据统计

            services.AddTransient(typeof(WarningHelper));//帮助类,报警数据
            services.AddTransient(typeof(WarningTjHelper));//帮助类,报警数据统计

            services.AddTransient(typeof(DlHelper));//帮助类,电量数据

            services.AddTransient(typeof(KgHelper));//帮助类,开关统计
            services.AddTransient(typeof(KgTjHelper));//帮助类,开关统计


            //后台背景线程
            //services.AddSingleton<IHostedService, RealBackgroundService>();//模拟实时数据上传
            //services.AddSingleton<IHostedService, WarningBackgroundService>();//模拟报警数据上传
            //电量数据不能随机
            services.AddSingleton<IHostedService, KgBackgroundService>();//模拟每次开或关操作记录上传

            //统计实时数据、报警数据、开关数据,按分钟
            services.AddSingleton<IHostedService, TongJiByMinuteBackgroundService>();

appsettings.json中的配置

  "TDegnine": {
    "DataSource": "http://192.168.8.110:6020/rest/sql",
    "Username": "root",
    "Password": "taosdata",
    "Database": "liqun_nuode_1_1",
    "PlanInterval": 5000
  }

生成SDK类库

类库的名称是:TDengineTest.DD.dll

实际项目使用

  • 引入TDengineTest.DD.dll并生成
  • 在postman中测试TDengine接口是否可用
POST http://47.102.145.164:6020/rest/sql

Headers
    Authorization   Basic cm9vdDp0YW9zZGF0YQ==
Body
    show databases;
  • appsettings.json配置
  • Startup.cs配置
  • 出现报错:System.Runtime程序集版本高

修改TDengineTest.DD中如下,因为局域网版本是.net core 2.0版本

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  </PropertyGroup>
  • 根据appSettings.json中的配置,创建dingding_zhanting_1_1数据库。
create database dingding_zhanting_1_1;
show databases;
  • 创建超级表控制器SuperTableController
Microsoft.Extensions.Options版本高了,在类库中改成2.0的
  • 创建子表控制器ChildTableController
  • 打开超级表列表页
报错,提示没有Flurl
    <PackageReference Include="Flurl" Version="2.8.2" />
    <PackageReference Include="Flurl.Http" Version="2.4.2" />

Could not load file or assembly 'Flurl.Http, Version=2.4.2.0, Culture=neutral, PublicKeyToken=null
    重新生成,拷贝所有相关程序集到服务器
  • 创建子表控制器ChildTableController

  • 尝试计划任务


//容器配置
services.AddScheduler(); //计划 
services.AddTransient<RealDataToTDengine>();//IInvocable 

//管道配置
provider.UseScheduler(s =>
{
    //使用IInvocable 上传实时数据
    s.Schedule<RealDataToTDengine>()
        .EveryThirtySeconds();
})
    //.LogScheduledTaskProgress(Services.GetService<ILogger<Coravel.Scheduling.Schedule.Interfaces.IScheduler>>())
    .OnError(exception => {
        Console.WriteLine(exception.Message);
});

//计划任务
public class RealDataToTDengine : IInvocable{}

//报错
the located assembly's manifest definition doesn't match the assembly reference
--重新生成发布解决

//计划任务无法打印实体记录
--改成字符串
  • 上传实时数据
//报错
Microsoft.Extensions.Logging.Abstraction Version=2.2.0
--从NuGet下载
  • 检查上传的实时数据
./taos.exe -h 
use database
select * from real_187ed5314e0c;
  • 报警数据上传
原理:

-- 局域网breaker→kaiguan→WarningPolicy→breaker.Value.EnableNetCtrl。
-- 在时序数据库中每种报警类型都有两条报警记录,一条开始,一条结束成对出现
-- 当第一次出现报警,局域网创建一条,时序数据库也创建一条开始记录
-- 当第二次出现报警,局域网不再创建,更新报警记录,时序数据库不动作
-- 当某个开关没有报警,局域网闭环,时序数据库创建一条结束记录
-- 放在本地的逻辑中实现
  • 电量数据上传:放在DataServer