|
@@ -0,0 +1,312 @@
|
|
1
|
+# TDengine时序数据库安装
|
|
2
|
+
|
|
3
|
+云上Ubuntu服务器前期准备
|
|
4
|
+```
|
|
5
|
+apt update
|
|
6
|
+sudo apt update
|
|
7
|
+apt-get update
|
|
8
|
+sudo apt-get update
|
|
9
|
+```
|
|
10
|
+
|
|
11
|
+安装可视化桌面
|
|
12
|
+```
|
|
13
|
+apg-get install ubuntu-desktop
|
|
14
|
+```
|
|
15
|
+
|
|
16
|
+Windows远程桌面连接Ubuntu.Ubuntu支持xrdp和vnc两种远程桌面协议。vnc是默认的基于RFB协议的远程桌面程序,但不够友好。
|
|
17
|
+```
|
|
18
|
+sudo apt-get install xrdp
|
|
19
|
+sudo apt-get install vnc4server tightvnserver
|
|
20
|
+sudo apt-get install xubuntu-desktop
|
|
21
|
+echo "xfce4-session" >~/.xsession
|
|
22
|
+sudo service xrdp restart
|
|
23
|
+通过windows远程桌面连接,连接成功,输入用户名和密码,终于看到ubuntu的界面!并且可以浏览网站!
|
|
24
|
+```
|
|
25
|
+
|
|
26
|
+安装TDengine
|
|
27
|
+```
|
|
28
|
+确认是否有systemd命令:whick systemd
|
|
29
|
+登录网址:https://www.taosdata.com/cn/getting-started/
|
|
30
|
+下载:下载deb包,输入邮件地址
|
|
31
|
+安装位置:/root/Downloads/
|
|
32
|
+打开命令行终端:alt+f2, gnome-terminal
|
|
33
|
+查看当前位置:pwd
|
|
34
|
+来到所在目录:cd Downloads
|
|
35
|
+安装TDengine: sudo dpkg -i tdengine-1.6.2.2.deb
|
|
36
|
+安装成功提示:
|
|
37
|
+ TDengine is installed successfully!
|
|
38
|
+ To configure TDengine: edt /etc/taos/taos.cfg
|
|
39
|
+ To start TDengine: sudo systemctrl start taosd
|
|
40
|
+ To access TDengine: use taos in shell
|
|
41
|
+回到根目录: cd ~
|
|
42
|
+来到TDengine的配置文件:cd /etc/taos/
|
|
43
|
+检查taosd状态:systemctl status taosd
|
|
44
|
+启动服务:systemctl start taosd
|
|
45
|
+再次查看服务状态:systemctl status taosd
|
|
46
|
+```
|
|
47
|
+
|
|
48
|
+在linux上小试牛刀
|
|
49
|
+```
|
|
50
|
+taos
|
|
51
|
+创建数据库:create database db;
|
|
52
|
+查看所有数据库:show databases;
|
|
53
|
+使用数据库:use db;
|
|
54
|
+创建表:create table t(ts timestamp, cdata int);
|
|
55
|
+插入数据:
|
|
56
|
+ insert into t values ('2019-07-15 00:00:00',10);
|
|
57
|
+ insert into t values ('2019-07-15 01:00:00', 20);
|
|
58
|
+
|
|
59
|
+查询:select * from t;
|
|
60
|
+```
|
|
61
|
+
|
|
62
|
+Windows连接Ubuntu上的TDengine
|
|
63
|
+```
|
|
64
|
+初次连接失败: ./taos.exe -h ip
|
|
65
|
+查看是否ping通:ping ip
|
|
66
|
+安装最新的客户端版本
|
|
67
|
+```
|
|
68
|
+
|
|
69
|
+还是不行。熟悉vi的使用,修改配置文件。
|
|
70
|
+```
|
|
71
|
+三种命令模式:
|
|
72
|
+ 命令模式切换到插入模式:i
|
|
73
|
+ 从插入模式切回到命令模式:esc
|
|
74
|
+ 在命令模式下,按 :wq 表示保存并退出, 按 :q! 表示不保存并退出
|
|
75
|
+三种插入模式:
|
|
76
|
+ i 从光标当前位置开始
|
|
77
|
+ a 从光标所在位置的下一个位置开始
|
|
78
|
+ o 从光标的行首插入一行
|
|
79
|
+命令模式下光标的移动:
|
|
80
|
+ h 向左
|
|
81
|
+ l 向右
|
|
82
|
+ k 向上
|
|
83
|
+ j 向下
|
|
84
|
+ 数字0 本行最开头
|
|
85
|
+ G 最后一行最开头
|
|
86
|
+ $ 本行行尾
|
|
87
|
+ ^ 所在行行首
|
|
88
|
+ w 下一个字母的开头
|
|
89
|
+ e 下一个字母的结尾
|
|
90
|
+ b 上一个字母的开头
|
|
91
|
+命令模式下删除文字
|
|
92
|
+ x 每按一次删除光标位置后面的一个字符
|
|
93
|
+ 6x 删除光标位置后面的6个字符
|
|
94
|
+ X 每按一次删除光标位置前面的一个字符
|
|
95
|
+ 20X 删除光标位置前面的20个字符
|
|
96
|
+ dd 删除光标所在行
|
|
97
|
+```
|
|
98
|
+
|
|
99
|
+修改taos.cfg配置文件
|
|
100
|
+```
|
|
101
|
+- 确认配置:sudo vi /etc/taos/taos.cfg internalIP:是ifconfig中的地址
|
|
102
|
+- 确认开启服务:systemctl stop taosd systemctl start taosd systemctl status taosd
|
|
103
|
+- 确认服务器防火墙没在起作用:sudo ufw status
|
|
104
|
+- 确认服务器开放6020-6040端口,并且是TCP和UDP都要打开(安全组设置tcp和udp都要打开,小于64KB的包默认是udp发送)
|
|
105
|
+- 确认客户端命令正确:./taos.exe -h ip
|
|
106
|
+- ubuntu重启:reboot
|
|
107
|
+```
|
|
108
|
+
|
|
109
|
+# 本地环境搭建
|
|
110
|
+
|
|
111
|
+- 本地服务器:192.168.8.131 teche123
|
|
112
|
+- 确认模块ip地址:187ED5314E0C 192.168.9.134
|
|
113
|
+- 登录模块:192.168.9.134:82 root abc123
|
|
114
|
+- 修改服务器指向:192.168.8.131:8080/ebx-bishop/data/carry
|
|
115
|
+- 确认服务打开:MysqlServer, redis-server
|
|
116
|
+- 启动网站:dot.net exe TaiHe.Electricity.Web.dll
|
|
117
|
+- 打开网站:192.168.8.131:8080 TecheFwd2018(泰和网站密码DrrnFwd2018,泰和服务器密码TecheFwd123)
|
|
118
|
+- 测试可视化界面是否可以操作
|
|
119
|
+
|
|
120
|
+# SDK使用原理
|
|
121
|
+
|
|
122
|
+> Startup.cs中的设置
|
|
123
|
+
|
|
124
|
+包括参数、数据库、普通表和超级表配置、帮助类、模拟数据的背景现场。
|
|
125
|
+
|
|
126
|
+```
|
|
127
|
+ //参数配置
|
|
128
|
+ services.Configure<TConfiguration>(Configuration.GetSection("TDegnine"));//在appsetting.json中配置TDengine结点
|
|
129
|
+
|
|
130
|
+ //数据库配置
|
|
131
|
+ services.AddTransient<ITDatabase, TDatabase>();//数据库接口和实现
|
|
132
|
+
|
|
133
|
+ //普通表和超级表配置
|
|
134
|
+ services.AddTransient<ITSuperTable<SuperReal>, TSuperTable<SuperReal>>();//超级表,实时数据
|
|
135
|
+ services.AddTransient<ITSuperTable<SuperRealTj>, TSuperTable<SuperRealTj>>();//超级表,实时数据统计
|
|
136
|
+
|
|
137
|
+ services.AddTransient<ITSuperTable<SuperWarning>, TSuperTable<SuperWarning>>();//超级表,报警
|
|
138
|
+ services.AddTransient<ITSuperTable<SuperWarningTj>, TSuperTable<SuperWarningTj>>();//超级表,报警统计
|
|
139
|
+
|
|
140
|
+ services.AddTransient<ITSuperTable<SuperDl>, TSuperTable<SuperDl>>();//超级表,电量
|
|
141
|
+
|
|
142
|
+ services.AddTransient<ITSuperTable<SuperKg>, TSuperTable<SuperKg>>();//超级表,开关统计
|
|
143
|
+ services.AddTransient<ITSuperTable<SuperKgTj>, TSuperTable<SuperKgTj>>();//超级表,开关统计的统计
|
|
144
|
+
|
|
145
|
+ //子表配置
|
|
146
|
+ services.AddTransient<ITChildTable<Real>, TChildTable<Real>>();//子表,实时数据
|
|
147
|
+ services.AddTransient<ITChildTable<RealTj>, TChildTable<RealTj>>();//子表,实时数据统计
|
|
148
|
+ services.AddTransient<ITChildTable<Warning>, TChildTable<Warning>>();//子表,报警
|
|
149
|
+ services.AddTransient<ITChildTable<WarningTj>, TChildTable<WarningTj>>();//子表,报警统计
|
|
150
|
+ services.AddTransient<ITChildTable<Dl>, TChildTable<Dl>>();//子表,电量
|
|
151
|
+ services.AddTransient<ITChildTable<Kg>, TChildTable<Kg>>();//子表,开关统计
|
|
152
|
+ services.AddTransient<ITChildTable<KgTj>, TChildTable<KgTj>>();//子表,开关统计统计
|
|
153
|
+
|
|
154
|
+ //实时计算流返回结果保存到普通表
|
|
155
|
+ //services.AddTransient<ITStream<RealTj>, TStream<RealTj>>(); //实时数据流计算结果
|
|
156
|
+ //services.AddTransient<ITStream<WarningTj>, TStream<WarningTj>>();//报警数据流计算结果
|
|
157
|
+ //services.AddTransient<ITStream<KgTj>, TStream<KgTj>>();//开关统计流计算结果
|
|
158
|
+
|
|
159
|
+ //帮助类配置
|
|
160
|
+ services.AddSingleton(typeof(CommonHelper));//共用帮助类
|
|
161
|
+ services.AddTransient(typeof(MacHelper));//获取模块的帮助类
|
|
162
|
+
|
|
163
|
+ services.AddSingleton(typeof(RealHelper));//帮助类,实时数据
|
|
164
|
+ services.AddSingleton(typeof(RealTjHelper));//帮助类,实时数据统计
|
|
165
|
+
|
|
166
|
+ services.AddTransient(typeof(WarningHelper));//帮助类,报警数据
|
|
167
|
+ services.AddTransient(typeof(WarningTjHelper));//帮助类,报警数据统计
|
|
168
|
+
|
|
169
|
+ services.AddTransient(typeof(DlHelper));//帮助类,电量数据
|
|
170
|
+
|
|
171
|
+ services.AddTransient(typeof(KgHelper));//帮助类,开关统计
|
|
172
|
+ services.AddTransient(typeof(KgTjHelper));//帮助类,开关统计
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+ //后台背景线程
|
|
176
|
+ //services.AddSingleton<IHostedService, RealBackgroundService>();//模拟实时数据上传
|
|
177
|
+ //services.AddSingleton<IHostedService, WarningBackgroundService>();//模拟报警数据上传
|
|
178
|
+ //电量数据不能随机
|
|
179
|
+ services.AddSingleton<IHostedService, KgBackgroundService>();//模拟每次开或关操作记录上传
|
|
180
|
+
|
|
181
|
+ //统计实时数据、报警数据、开关数据,按分钟
|
|
182
|
+ services.AddSingleton<IHostedService, TongJiByMinuteBackgroundService>();
|
|
183
|
+```
|
|
184
|
+
|
|
185
|
+> appsettings.json中的配置
|
|
186
|
+
|
|
187
|
+```
|
|
188
|
+ "TDegnine": {
|
|
189
|
+ "DataSource": "http://192.168.8.110:6020/rest/sql",
|
|
190
|
+ "Username": "root",
|
|
191
|
+ "Password": "taosdata",
|
|
192
|
+ "Database": "liqun_nuode_1_1",
|
|
193
|
+ "PlanInterval": 5000
|
|
194
|
+ }
|
|
195
|
+```
|
|
196
|
+
|
|
197
|
+> 生成SDK类库
|
|
198
|
+
|
|
199
|
+类库的名称是:`TDengineTest.DD.dll`
|
|
200
|
+
|
|
201
|
+# 实际项目使用
|
|
202
|
+
|
|
203
|
+- 引入`TDengineTest.DD.dll`并生成
|
|
204
|
+- 在postman中测试TDengine接口是否可用
|
|
205
|
+
|
|
206
|
+```
|
|
207
|
+POST http://47.102.145.164:6020/rest/sql
|
|
208
|
+
|
|
209
|
+Headers
|
|
210
|
+ Authorization Basic cm9vdDp0YW9zZGF0YQ==
|
|
211
|
+Body
|
|
212
|
+ show databases;
|
|
213
|
+```
|
|
214
|
+
|
|
215
|
+- appsettings.json配置
|
|
216
|
+- Startup.cs配置
|
|
217
|
+- 出现报错:System.Runtime程序集版本高
|
|
218
|
+
|
|
219
|
+修改TDengineTest.DD中如下,因为局域网版本是.net core 2.0版本
|
|
220
|
+```
|
|
221
|
+ <PropertyGroup>
|
|
222
|
+ <TargetFramework>netcoreapp2.0</TargetFramework>
|
|
223
|
+ </PropertyGroup>
|
|
224
|
+```
|
|
225
|
+
|
|
226
|
+- 根据appSettings.json中的配置,创建`dingding_zhanting_1_1`数据库。
|
|
227
|
+
|
|
228
|
+```
|
|
229
|
+create database dingding_zhanting_1_1;
|
|
230
|
+show databases;
|
|
231
|
+```
|
|
232
|
+
|
|
233
|
+- 创建超级表控制器`SuperTableController`
|
|
234
|
+
|
|
235
|
+```
|
|
236
|
+Microsoft.Extensions.Options版本高了,在类库中改成2.0的
|
|
237
|
+```
|
|
238
|
+
|
|
239
|
+- 创建子表控制器`ChildTableController`
|
|
240
|
+- 打开超级表列表页
|
|
241
|
+
|
|
242
|
+```
|
|
243
|
+报错,提示没有Flurl
|
|
244
|
+ <PackageReference Include="Flurl" Version="2.8.2" />
|
|
245
|
+ <PackageReference Include="Flurl.Http" Version="2.4.2" />
|
|
246
|
+
|
|
247
|
+Could not load file or assembly 'Flurl.Http, Version=2.4.2.0, Culture=neutral, PublicKeyToken=null
|
|
248
|
+ 重新生成,拷贝所有相关程序集到服务器
|
|
249
|
+```
|
|
250
|
+- 创建子表控制器`ChildTableController`
|
|
251
|
+
|
|
252
|
+- 尝试计划任务
|
|
253
|
+
|
|
254
|
+```
|
|
255
|
+
|
|
256
|
+//容器配置
|
|
257
|
+services.AddScheduler(); //计划
|
|
258
|
+services.AddTransient<RealDataToTDengine>();//IInvocable
|
|
259
|
+
|
|
260
|
+//管道配置
|
|
261
|
+provider.UseScheduler(s =>
|
|
262
|
+{
|
|
263
|
+ //使用IInvocable 上传实时数据
|
|
264
|
+ s.Schedule<RealDataToTDengine>()
|
|
265
|
+ .EveryThirtySeconds();
|
|
266
|
+})
|
|
267
|
+ //.LogScheduledTaskProgress(Services.GetService<ILogger<Coravel.Scheduling.Schedule.Interfaces.IScheduler>>())
|
|
268
|
+ .OnError(exception => {
|
|
269
|
+ Console.WriteLine(exception.Message);
|
|
270
|
+});
|
|
271
|
+
|
|
272
|
+//计划任务
|
|
273
|
+public class RealDataToTDengine : IInvocable{}
|
|
274
|
+
|
|
275
|
+//报错
|
|
276
|
+the located assembly's manifest definition doesn't match the assembly reference
|
|
277
|
+--重新生成发布解决
|
|
278
|
+
|
|
279
|
+//计划任务无法打印实体记录
|
|
280
|
+--改成字符串
|
|
281
|
+```
|
|
282
|
+
|
|
283
|
+- 上传实时数据
|
|
284
|
+
|
|
285
|
+```
|
|
286
|
+//报错
|
|
287
|
+Microsoft.Extensions.Logging.Abstraction Version=2.2.0
|
|
288
|
+--从NuGet下载
|
|
289
|
+```
|
|
290
|
+
|
|
291
|
+- 检查上传的实时数据
|
|
292
|
+
|
|
293
|
+```
|
|
294
|
+./taos.exe -h
|
|
295
|
+use database
|
|
296
|
+select * from real_187ed5314e0c;
|
|
297
|
+```
|
|
298
|
+
|
|
299
|
+- 报警数据上传
|
|
300
|
+
|
|
301
|
+```
|
|
302
|
+原理:
|
|
303
|
+
|
|
304
|
+-- 局域网breaker→kaiguan→WarningPolicy→breaker.Value.EnableNetCtrl。
|
|
305
|
+-- 在时序数据库中每种报警类型都有两条报警记录,一条开始,一条结束成对出现
|
|
306
|
+-- 当第一次出现报警,局域网创建一条,时序数据库也创建一条开始记录
|
|
307
|
+-- 当第二次出现报警,局域网不再创建,更新报警记录,时序数据库不动作
|
|
308
|
+-- 当某个开关没有报警,局域网闭环,时序数据库创建一条结束记录
|
|
309
|
+-- 放在本地的逻辑中实现
|
|
310
|
+```
|
|
311
|
+
|
|
312
|
+- 电量数据上传:放在`DataServer`中
|