luoguangyi 3 anni fa
parent
commit
05e4d4971a
1 ha cambiato i file con 473 aggiunte e 1 eliminazioni
  1. 473 1
      docs/iot/description.md

+ 473 - 1
docs/iot/description.md

@@ -57,7 +57,7 @@ BDTP-数据服务中的对象数据如下:
 
 用数学范式表达时序可以被定义为:
 
-![640](./img/640.png)
+![image2](./img/image0.jpg)
 
 示例:
 
@@ -157,6 +157,8 @@ BDTP-数据服务中的对象数据如下:
 
 - 三类数据库之间的关系如下
 
+  ![image1](./img/image1.png)
+
 - 根据原始数据的采集周期,确定相对应操作数据库的分精度步长,即每个参数都对应一个采集属性CollectProperty = {(Contu,T ) / Pulse}.
 
 - 系统暂时只处理低频采集数据,对于采集频率<1min的高频数据,系统不会长期保存原始数据,分精度数据按照低频数据的标准统一处理
@@ -164,3 +166,473 @@ BDTP-数据服务中的对象数据如下:
 - 采集周期无论长短,系统都会提供分精度处理。当采集周期较长时,系统提供的短周期分精度数据不能保障其有效性。即根据采集属性参数的情况,关联数据库中,有些库ProtectFlag = 1(1.不保障;0.保障)
 
 下表标记说明:1)黑体加粗字,蓝色框,为操作数据库;2)其余均为相关数据库;3)橙色框,为不保障数据库。
+
+
+
+![image2](./img/image2.jpg)
+
+
+
+![image3](./img/image3.jpg)
+
+### 3.3  计算说明
+
+#### 单库计算
+
+Q. 系统如何获知每个采集数据应该对应操作库的哪种时间分精度?
+
+A. 人工配置。通常是批量化的,配置难度不大。
+需人工指定每个参数的采集属性CollectProperty = {(Contu, T ) / Pulse}. 即采集进来时是连续变量还是脉冲变量,若是连续变量,采集周期是多少。
+采集属性会影响后续计算方法,主要区别在于脉冲式无“丢数”的概念,无法做数据诊断相关的系列计算。为此,限定累积量和瞬时量的采集属性都必须是连续型,哪怕采集周期设置较长。
+
+
+
+Q. 系统如何获知每个采集数据应该对应操作库的哪种类型?
+
+A. 根据参数的funcid自动匹配。funcid由项目实施方在采集器和调研文件中配置完成。
+
+
+
+Q. 某些参数的物理意义决定其为整型变量,系统如何区分和处理?
+
+A. 根据参数的funcid预定该参数是否为整型。
+数据库中存储数据不区分整型和非整型;取整计算在使用侧定义,即当应用调用对象模型中的某整型参数,或调用某个整型的funcid参数时,在调用接口处做取整计算。
+
+
+
+Q. 某些参数的物理意义决定其为整型变量,系统如何区分和处理?
+
+A. 根据参数的funcid预定该参数是否为整型。
+
+
+
+Q. 累积量插值结果是否会出现数值递减的情况?
+
+A. 分精度插值计算采用P3 Hermite方法,即分段三阶Hermite插值法。这种插值方法具有保形性,即插值曲线的单调性与给定端点一致。
+
+
+
+Q. 插值计算需要一定的样本段,在实时计算过程中,新的插值结果会不会跟之前的插值结果不同,从而导致计算结果不稳定?
+
+A. 分段三阶Hermite插值法只保证一阶导数连续,不保证二阶导数连续,即计算结果对于一个采集周期以后的插值数据是稳定的。例如采集T = 1h,如下图
+![image4](./img/image4.png)
+Hermite插值计算至少需要4个点,所以每次计算回溯历史的长度至少5T. 虽然最后一个T内的计算结果是不稳定的,但前面4T内的数据都是稳定的,不会对相关库计算造成重大影响。
+
+#### 关联计算
+
+Q. 关联数据库可以被人为操作么?
+
+A. 不行。
+每个数据的采集频度决定了操作数据库的时间分精度等级,对这个数据永远只能在这个精度等级上进行操作。
+例如某参数X的操作分精度是15min,在逐日维度诊断出数据有误,需要修改数据,只能对15min数据列进行操作,进而得到逐日数据,不能直接修改1d数据列。
+例如某参数X的操作分精度是15min,参数Y的操作分精度是1h,基于15min数据联合分析X与Y之后,需要修改Y数据,只能对1h数据列进行操作,进而得到15min数据,不能直接修改15min数据列。
+这种问题在数据诊断和修补里会十分普遍。
+
+
+
+Q. 修补数据库的精度如何确定?
+
+A. 每个参数的修补数据库与该参数的操作数据库的时间精度一致。
+
+
+
+Q. 这几个库之间的联动计算机制?
+
+A. 1)实时联动计算,即一旦下级库发生计算,计算结束后就触发上级库计算。上下级关系如上图所示。
+2)操作库、操作库的诊断标签和关联库是覆盖式计算;自动修补和人工修补库不覆盖,存储每一次的增量结果。
+3)操作库只跟着原始库的变化发生计算,原始库有新数据,或发生改变,操作库进行对应时段的分精度计算。
+4)诊断和自动修补计算有三种触发方式
+i. 随时间实时计算。即当丢数时,操作库没有数据,但仍然在时间节点上打诊断标签,提供参考数据
+ii. 操作库发生改变后,跟随计算。即数据再次恢复上传后,基于更新后的操作库,重新打诊断标签,重新提供参考数据
+iii. 人为指定诊断和修补计算
+5)操作库、自动修补库和人工修补库,任何一个库发生改变,关联库都要触发相应时段的更新计算。
+6)关联库计算取用数据,以及应用取用操作精度的数据,取用原则是
+i. 当操作数据诊断标记是正常时,直接使用操作库的数据;
+ii. 否则,使用最新的修补数据。
+按照时间先后做优先选择,不按照人工或自动做优先选择。
+
+### 3.4 分精度数据条件
+
+##### 3.4.1 数据采集条件
+
+(1)采集器和采集软件所在服务器的网络通畅
+
+(2)采集协议(UDP、TCP)统一
+
+(3)采集端口能够接通
+
+##### 3.4.2 分精度数据计算条件
+
+(1)原始数据original_month、original_day中有点位对应数据
+
+(2)original_present中有>=计算时间的数据
+
+(3)项目计算时间已经设定
+
+(4)dy_pointlist中有参与计算的点位信息
+
+##### 3.4.3分精度数据(读数)
+
+分精度数据(单值时序数据)
+
+|                    |       |                                                              |
+| ------------------ | ----- | ------------------------------------------------------------ |
+| **瞬时值**         | Inst  | 5min邻近值,15min邻近值,1h邻近值,1h平均值,1d平均值        |
+| **累积值**         | Acc   | 15min累计值,1h累计值,1d累计值,15min差分值,1h差分值,1d差分值 |
+| **布尔时序量**     | Boolv | 变化脉冲,5min邻近值,15min邻近值,1h邻近值                  |
+| **单选枚举时序量** | Enumv | 变化脉冲,5min邻近值,15min邻近值,1h邻近值                  |
+
+(1)fjd_0_near:通过计算软件进行计算的分精度数据
+
+(2)fjd_1_near:自动修复功能进行修复的分精度数据
+
+(3)fjd_2_near:手动修复功能进行修复的分精度数据3、点位类型
+
+### **3.5 数据的博锐业务分类** 
+
+| 表分类                                    | 博锐业务说明                                                 | HBase表名/分表举例                                           |
+| ----------------------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| 原始(读)数original_month                  | 由采集器发送给采集软件的采集数据                             | original_month/original_month_yyyyMM                         |
+| ①分精度数据fjd_0_near_***time***          | ①将在时间上分布不规则采集数据,通过一定算法计算,得出的时间精度规则均匀的原始数据 | fjd_0_near_15min、fjd_0_near_1h、fjd_0_near_1d               |
+| ②fjd_1_near_***time***                    | ②对原始数①的数据通过一定算法进行修正过的数据                 | fjd_1_near_15min、fjd_1_near_1h、fjd_1_near_1d               |
+| ③fjd_2_near_***time***                    | ③对原始数①的数据进行人为的手动修正后的数据                   | fjd_2_near_15min、fjd_2_near_1h、fjd_2_near_1d               |
+| fjd_statinst_**time**                     | 极值(最大值、最小值)、极值时间、采集次数、平均值、数据是否保障其有效性 | fjd_statinst_15min、fjd_statinst_1h、fjd_statinst_1d         |
+| **业务相关**                              |                                                              |                                                              |
+| 能耗数据、仪表能耗data_servicedata_*time* | 由仪表的分精度数据通过做差得出来的仪表的差分能耗数据         | data_servicedata_15min、data_servicedata_1h、data_servicedata_1d |
+| 计算单元能耗data_objectdata_*time*        | 由计算单元与仪表的数学关系,通过对多个仪表能耗数据进行运算得出 | data_objectdata_15min、data_objectdata_1h、data_objectdata_1d |
+| 分项能耗data_energydata_*time*            | 由分项与仪表或者支路(支路与仪表具有关联)的关系公式,计算得出(公式有可能会乘以变比系数) | data_energydata_15min、data_energydata_1h、data_energydata_1d |
+
+## 5.IOT数据存储
+
+使用了什么数据库,什么中间件,存在哪些表里面?
+
+所有物理世界的静态数据使用mysql存储
+
+所有动态的IOT数据使用Hbase 存储,底层是byte数组;
+
+操作Hbase使用中间件是zillion,zillion是公司自研的中间,提供Hbase的二级索引功能和常用数据格式支持,提供自定义的JSON格式的DDL,DML(库表的增删改查,数据记录的增删改查),自研配置zillion的Hbase界面化工具HbaseCat,类似于navicat操作mysql。
+
+### 常用库表说明
+
+| 库名      | 表名                      | 表说明                                                       | 分库分表(默认否) |
+| --------- | ------------------------- | ------------------------------------------------------------ | ------------------ |
+| db_public | original_present          | iot实时数据表                                                |                    |
+| db_public | original_month            | iot历史数据                                                  | 月份分表           |
+| db_public | originalsetpresent        | 控制指令实时值                                               |                    |
+| db_public | originalset               | 控制指令历史记录                                             |                    |
+| db_public | fjd_0_near_**time**       | time分精度结果表                                             | 月份分表           |
+| db_public | fjd_statinst_**time**     | 极值(最大值、最小值)、极值时间、采集次数、平均值、数据是否保障其有效性 | 月份分表           |
+| db_public | dy_pointlist              | 分精度配置规则,配置所有需要计算分精度的 项目ID+表号+功能号+最小分精度类型 |                    |
+| db_public | fjd_0_buildingcomputetime | 配置要计算分精度的项目和开始下次计算分精度的时间,每次计算分精度后自动更新该时间 |                    |
+| db_public | fjd_0_computedetail       | 分精度计算详情                                               |                    |
+| db_public | fjd_0_metercomputetime    | 分精度计算时间表,记录所有表号-功能号下次计算分精度的时间    |                    |
+| db_public | original_happening        | 记录所有文本类型的数据,不带表号功能号                       |                    |
+| db_public | original_textpresent      | 带表号-功能号的文本数据,实时数据表                          |                    |
+| db_public | original_text             | 带表号-功能号的文本数据,历史数据表                          | 月份分表           |
+
+**[MySQL与HBase对比](https://blog.csdn.net/weixin_41605937/article/details/110933984)**
+
+## 6.IOT服务待改进点
+
+#### 1.服务有状态,无法做集群部署
+
+##### 有状态体现在两点:	1.实时数据本地内存缓存、	2.云边通讯TCP、UDP,集群有通讯问题
+
+iot服务只有一式两份的iot-collect/iot-control服务对外提供接口:采集实时数据、分精度数据、采集值统计、控制指令、查询指令结果。
+
+提供的核心接口就是实时数据、分精度数据,分精度数据数据量,每次从数据库查询。实时数据查询具有批量和高并发的特点,所以实时数据有内存缓存,并且每次有IOT数据后实时更新缓存,查询的时候不查库只查内存。
+
+#### 2.服务性能、稳定性、功能
+
+**稳定性:**
+
+香港置地的iot-collect服务 偶尔发生阻塞后无法提供服务,分精度不计算(2次);
+
+云端服务重启后几率性无法自动重连问题
+
+**性能:**
+
+**功能:**
+
+mqtt支持、
+
+直接接受http格式iot数据等
+
+在线状态信息点判断机制。
+
+#### 3.服务架构
+
+服务通过(Mina、Netty)TCP/UDP的数据传输,IOT数据不重不漏,自动补发。数据失败后的自动补发机制目前依赖iot-client。
+
+zillion的维护和新功能、扩展性;(对比开源Phoenix)
+
+招商集团的安全要求,不能TCP直连;
+
+时序数据库的考虑
+
+分精度人为配置**易忘易漏易错易不一致**、没有和数据字典打通,不支持数据反查。
+
+#### 4.报文格式、数据类型、代码注释
+
+数据的报文格式较多,考虑优化精简
+
+整数和小数无法区分
+
+回包机制(回包根据表号和功能号查找判断,可报文格式增加报文来源地址)
+
+#### 5、...
+
+## 附录1:部分文档地址
+
+[数据与计算基础知识](https://thoughts.teambition.com/workspaces/5f7001fdd8b0840016e073e7/docs/5ff7f3faeaa1190001062c6a)
+
+[iot-collect部署文档](https://thoughts.teambition.com/workspaces/5f7001fdd8b0840016e073e7/docs/5fe1af23eaa11900016f409a)
+
+[iot-control部署文档](https://thoughts.teambition.com/workspaces/5f7001fdd8b0840016e073e7/docs/5fe1b5884cc5830001a3f212)
+
+[iot-project部署文档](https://thoughts.teambition.com/workspaces/5f7001fdd8b0840016e073e7/docs/60094e5ceaa11900015f142a)
+
+[iot云端服务接口](http://39.102.40.239:9991/swagger-ui.html#/)
+
+[BDTP-数据服务](http://39.102.54.110:9009/)
+
+[MySQL与HBase对比](https://blog.csdn.net/weixin_41605937/article/details/110933984)
+
+[时序数据库](https://www.12770.cn/655244)
+
+## 附录2:能耗常用表结构
+
+
+
+##### 原始数记录表(按月)original_month
+
+|             |        |              |
+| ----------- | ------ | ------------ |
+| 字段名      | 类型   | 说明         |
+| building    | String | 建筑唯一标识 |
+| data        | Double | 读数         |
+| funcid      | Long   | 功能号       |
+| meter       | String | 表号         |
+| receivetime | String | 接收         |
+
+##### 原始数记录表(按天)original_day
+
+|             |        |              |
+| ----------- | ------ | ------------ |
+| 字段名      | 类型   | 说明         |
+| building    | String | 建筑唯一标识 |
+| data        | Double | 读数         |
+| funcid      | Long   | 功能号       |
+| meter       | String | 表号         |
+| receivetime | String | 接收         |
+
+##### 原始数最新接收数据表original_present
+
+|             |        |              |
+| ----------- | ------ | ------------ |
+| 字段名      | 类型   | 说明         |
+| building    | String | 建筑唯一标识 |
+| data        | Double | 读数         |
+| funcid      | Long   | 功能号       |
+| meter       | String | 表号         |
+| receivetime | String | 接收时间     |
+
+##### 点位计算信息表(仪表清单)dy_pointlist
+
+|               |        |                                          |
+| ------------- | ------ | ---------------------------------------- |
+| 字段名        | 类型   | 说明                                     |
+| building      | String | 建筑唯一标识                             |
+| meter         | String | 表号                                     |
+| funcid        | Long   | 功能号                                   |
+| data_type     | String | 数据类型(Acc 累积量,Inst   瞬时量...) |
+| collect_cycle | String | 分精度计算的最小时间粒度                 |
+
+##### 项目计算时间信息表fjd_0_buildingcomputetime
+
+|                    |        |              |
+| ------------------ | ------ | ------------ |
+| 字段名             | 类型   | 说明         |
+| building           | String | 建筑唯一标识 |
+| compute_time       | String | 计算到的时间 |
+| first_compute_time | String | 首次计算时间 |
+
+##### 仪表计算的记录信息表fjd_0_metercomputetime
+
+|                    |        |              |
+| ------------------ | ------ | ------------ |
+| 字段名             | 类型   | 说明         |
+| building           | String | 建筑唯一标识 |
+| meter              | String | 表号         |
+| funcid             | Long   | 功能号       |
+| first_compute_time | String | 首次计算时间 |
+| next_data_time     | String |              |
+
+##### 分精度数据记录表fjd_0_near_*time*
+
+|            |        |                    |
+| ---------- | ------ | ------------------ |
+| 字段名     | 类型   | 说明               |
+| building   | String | 建筑唯一标识       |
+| meter      | String | 表号               |
+| funcid     | Long   | 功能号             |
+| data_time  | String | 时间               |
+| data_flag  | Long   | 数据可靠标签0 可靠 |
+| data_value | Double | 数值               |
+
+##### 分精度数据计算日志表fjd_0_computelog
+
+|                       |        |                            |
+| --------------------- | ------ | -------------------------- |
+| 字段名                | 类型   | 说明                       |
+| building              | String | 建筑唯一标识               |
+| compute_round         | Long   | 计算轮次                   |
+| fjd_compute_time_from | String | fjd数据开始时间            |
+| fjd_compute_time_to   | String | fjd数据结束时间            |
+| is_finished           | Long   | 是否计算完成1 完成0 未完成 |
+| compute_time_from     | String | 计算开始时间               |
+| compute_time_to       | String | 计算结束时间               |
+
+##### 分精度数据计算详细日志表fjd_0_computedetail
+
+|                 |        |                 |
+| --------------- | ------ | --------------- |
+| 字段名          | 类型   | 说明            |
+| building        | String | 建筑唯一标识    |
+| compute_round   | Long   | 计算轮次        |
+| funcid          | Long   | 功能号          |
+| meter           | String | 仪表id          |
+| operate_time_to | String | 计算操作时间    |
+| valid_time_from | String | fjd数据开始时间 |
+| valid_time_to   | String | fjd数据结束时间 |
+
+##### 仪表能耗表data_servicedata_*time*
+
+|            |        |              |
+| ---------- | ------ | ------------ |
+| 字段名     | 类型   | 说明         |
+| building   | String | 建筑唯一标识 |
+| meter      | String | 仪表ID       |
+| funcid     | Long   | 功能号       |
+| data_time  | String | 数据时间     |
+| data_value | Double | 能耗数据     |
+
+##### 设备能耗记录表data_objectdata_*time*
+
+|            |      |              |
+| ---------- | ---- | ------------ |
+| 字段名     | 类型 | 说明         |
+| building   |      | 建筑唯一标识 |
+| data_time  |      | 数据时间     |
+| data_value |      | 能耗数据     |
+| objectSign |      | 设备唯一标识 |
+
+##### 分项能耗记录表data_energydata_*time*
+
+|                     |        |                    |
+| ------------------- | ------ | ------------------ |
+| 字段名              | 类型   | 说明               |
+| building            | String | 建筑唯一标识       |
+| data_time           | String | 数据时间           |
+| data_value          | Double | 能耗数据           |
+| energyModelNodeSign | String | 能耗模型树节点标识 |
+| energyModelSign     | String | 能耗模型标识       |
+
+##### 计算任务表ci_instance 
+
+|                          |        |                                                              |
+| ------------------------ | ------ | ------------------------------------------------------------ |
+| 字段                     | 类型   | 说明                                                         |
+| object_sign              | String | 1101050001,1101050001-001                                   |
+| instance_name            | String | fjd_0_Acc_EnumV:计算分精度servicedata:能耗计算EMS:调研中计算单元和分项能耗计算stat_Inst:数据统计计算 |
+| flag_valid               | Long   |                                                              |
+| compute_interval_seconds |        | 计算时间间隔(秒)                                           |
+
+##### 计算任务输入信息表ci_instanceinput
+
+|                      |        |      |                                                         |
+| -------------------- | ------ | ---- | ------------------------------------------------------- |
+| 字段                 | 类型   | 说明 | 举例                                                    |
+| dao_key              | String |      | {"building":"1101050001","meter":"1001","funcid":10101} |
+| dao_type             | String |      | fjd_near                                                |
+| data_class           | String |      | near                                                    |
+| input_sign           | String |      | meterdata_1001_10101                                    |
+| instance_name        | String |      | servicedata                                             |
+| object_sign          | String |      | 1101050001                                              |
+| source_instance_name | String |      | fjd                                                     |
+| source_object_sign   | String |      | 1101050001                                              |
+| source_output_sign   | String |      | 1001_10101                                              |
+| time_period          | String |      | 15min                                                   |
+
+##### 计算任务输出信息表ci_instanceoutput 
+
+|                        |         |              |                                                         |
+| ---------------------- | ------- | ------------ | ------------------------------------------------------- |
+| 字段                   | 类型    | 说明         | 举例                                                    |
+| custom_function_name   | String  |              |                                                         |
+| custom_paramsMap       | String  |              |                                                         |
+| dao_key                | String  |              | {"building":"1101050001","meter":"1001","funcid":10101} |
+| dao_type               | String  |              | servicedata                                             |
+| data_class             | String  |              | consumption                                             |
+| expression             | String  | 计算公式     | (meterdata_1001_10101'+1­meterdata_1001_10101)*1.0      |
+| instance_name          | String  | 实例名称     | servicedata                                             |
+| mode                   | String  |              | expression                                              |
+| need_all_var_data      | Boolean |              | True                                                    |
+| object_sign            | String  | 建筑唯一标识 | 1101050001                                              |
+| ouput_sign             | String  |              | servicedata_1001_10101                                  |
+| time_begin             | String  |              | 19700101000000                                          |
+| time_end               | String  |              | 19700102000000                                          |
+| time_period            | String  | 计算数据密度 | 15min                                                   |
+| time_period_intialized | Boolean |              | True                                                    |
+
+##### 计算日志表ce_computelog 
+
+|                   |        |                  |                |
+| ----------------- | ------ | ---------------- | -------------- |
+| 字段              | 类型   | 说明             | 举例           |
+| compute_round     | Long   | 所计算的当前轮数 | 2110           |
+| compute_time_from | String | 计算开始时间     | 20180707021500 |
+| compute_time_to   | String | 计算结束时间     | 20180707023000 |
+| instance_name     | String | 计算任务类型名称 | servicedata    |
+| is_finished       | Long   | 是否计算结束1 是 | 1              |
+| object_sign       | String | 项目表示         | 3101130001     |
+
+##### 计算日志输入信息表ce_computeinputlog 
+
+|                      |        |              |             |
+| -------------------- | ------ | ------------ | ----------- |
+| 字段                 | 类型   | 说明         | 举例        |
+| compute_round        | Long   | 计算轮次     | 27          |
+| compute_rounds       | String |              | 13,101      |
+| instance_name        | String | 计算实例名称 | servicedata |
+| object_sign          | String | 建筑唯一标识 | 1302020001  |
+| source_instance_name | String |              | fjd_1       |
+| source_object_sign   | String |              | 1302020001  |
+
+##### 计算日志输入信息详细表ce_computeinputdetail 
+
+|                 |        |      |                  |
+| --------------- | ------ | ---- | ---------------- |
+| 字段            | 类型   | 说明 | 举例             |
+| compute_round   | Long   |      | 1                |
+| input_sign      | String |      | meterdata_1001_0 |
+| instance_name   | String |      | servicedata      |
+| object_sign     | String |      | 1302020001       |
+| valid_time_from | String |      | 20160101000000   |
+| valid_time_to   | String |      | 20160108000000   |
+
+##### 计算日志输出信息详细表ce_computeoutputdetail 
+
+|                 |        |      |                        |
+| --------------- | ------ | ---- | ---------------------- |
+| 字段            | 类型   | 说明 | 举例                   |
+| compute_round   | Long   |      | 1                      |
+| instance_name   | String |      | servicedata            |
+| object_sign     | String |      | 1302020001             |
+| output_sign     | String |      | servicedata_1001_10101 |
+| valid_time_from | String |      | 20151231234500         |
+| valid_time_to   | String |      | 20160108000000         |
+
+
+
+