写在前面:文章内容为本人的学习过程,路过大神不喜勿喷!
一、准备条件
- KEPServerEX 6 : 连接设备侧软件
- IoTDB:数据存储侧软件
- EMQX 或 Mosquitto:中间转发MQTT消息的服务端
- Java8 x64 和 x86:64位为运行环境,x86为KEP6的MQTT客户端运行环境
- MQTTX:客户端连接工具
- WorkBench:数据库操作工具
二、安装KEPServerEX6
- 大家自行网络遨游寻找KEPServerEX 6 下载,下载安装以后还需要进行破解(破解版仅学习使用吧,如果大家商用请支持正版),由于需要使用KEPServerEX的Iot GetWay组件,如果不破解有可能会提示到期时间的警告。
- 当安装好KEPServerEX 6后需要配置下32位的jre环境
- 在开始菜单中启动
- 在桌面右下角,右键KEPServerEX选择设置,配置32位jre的根目录位置。
至此,KEPServerEX6基础已经安装好。
三、安装IoTDB
- IoTDB为Apache的开源项目,所以直接去官网或者Git上下载即可
选择Http下载压缩包,解压缩到本地即可使用。
四、整体数据流转方式
- 个人认为,根据实际数据量、设备数量、点位数量选择不同的数据流转方式吧。
IoTDB的官方示例:1000设备,每个设备100 测点,共 100000 序列,INT32类型。采样频率1Hz(每秒一次),存储1年,3副本。
完整计算公式:1000设备 * 100测点 * 12字节每数据点 * 86400秒每天 * 365天每年 * 3副本/10压缩比=11T
简版计算公式:1000 * 100 * 12 * 86400 * 365 * 3 / 10 = 11T
- 方式二对比方式一来看,多了一个独立的MQTT服务端,以至于更好的可以对外提供服务,但是需要多布置一台MQTT服务端,增加维护和部署的难度。
- 此处,我使用第一种方式进行学习和试验。
五、配置KEPServer点位
此处,遵循一下IoTDB的存储形式,来增加KEPServer的设备点位。以下是官网的一段描述:
- 我们以风电场物联网场景为例,说明如何在 IoTDB 中创建一个正确的数据模型。
- 根据企业组织结构和设备实体层次结构,我们将其物联网数据模型表示为如下图所示的属性层级组织结构,即电力集团层-风电场层-实体层-物理量层。其中 ROOT 为根节点,物理量层的每一个节点为叶子节点。IoTDB 采用树形结构定义数据模式,以从 ROOT 节点到叶子节点的路径来命名一个时间序列,层次间以“.”连接。例如,下图最左侧路径对应的时间序列名称为ROOT.ln.wf01.wt01.status。
- 在KEPServer中添加测试点位
- 右键连接性新建通道 —> 右键通道新建设备 —> 右键设备新建分组 —> 右键分组新建标记
- 使用KEPServer的IoT Getway组件,右键IoT Getway选择New Agent。
- 配置MQTT的URL和Topic,其他选项根据需要修改吧。
- 根据MQTT服务端的需要,配置ClientID、用户名和密码。注意要确保ClientID不在整个流程中重复。用户名和密码如果MQTT服务端需要身份验证,则需要填写,如何没有配置身份验证空着即可。
- 选择完成后,双击打开编辑器,选择Message,选择Message Fomat类型为Advanced Template,修改Template格式。此处要考虑到后面IoTDb的一些格式化问题。MQTT的消息有效载荷可以由 Java SPI 加载的PayloadFormatter格式化为事件,默认实现为JSONPayloadFormatter,此处格式与后面自定义格式化的Java类所处理的格式对应,根据实际情况修改。为方便处理,我将默认格式修改成了一下格式:
[
|#each VALUES|
{
"device": "|TAGNAME|", "values": |VALUE|, "timestamp": |TIMESTAMP| } |#unless @last|,|/unless|
|/each|
]
六、配置IoTDB
- 修改${IOTDB_HOME}/conf/iotdb-datanode.properties , 根据需要修改IP和Port即可,其他就默认。
####################
### Data Node RPC Configuration
####################
# Used for connection of IoTDB native clients(Session)
# Could set 127.0.0.1(for local test) or ipv4 address
# Datatype: String
dn_rpc_address=192.168.20.131
# Used for connection of IoTDB native clients(Session)
# Bind with dn_rpc_address
# Datatype: int
dn_rpc_port=8007
# Used for communication inside cluster.
# could set 127.0.0.1(for local test) or ipv4 address.
# Datatype: String
dn_internal_address=192.168.20.131
# Used for communication inside cluster.
# Bind with dn_internal_address
# Datatype: int
dn_internal_port=10730
# Port for data exchange among DataNodes inside cluster
# Bind with dn_internal_address
# Datatype: int
dn_mpp_data_exchange_port=10740