• 通过 Baetyl 将数据脱敏后存储百度云 TSDB
    • 测试前准备
      • 创建物接入 Endpoint
    • 创建规则引擎 Rule
    • 创建 TSDB 数据库
    • 创建物可视展示板
    • 基本步骤流程
    • 测试与验证
      • Baetyl 主程序配置
      • Hub 服务配置
      • Function Manager 服务配置
      • Function Filter 服务配置
      • Remote 服务配置
      • 测试

    通过 Baetyl 将数据脱敏后存储百度云 TSDB

    声明

    • 本文测试所用设备系统为 Ubuntu18.04
    • 模拟 MQTT client 向百度云 IoTHub 订阅消息的客户端为 MQTT.fx
    • 模拟 MQTT client 向本地 Hub 服务发送消息的客户端为 MQTTBox
    • 本文所应用的各服务与本地 Hub 服务间通信认证强制使用 TLS/SSL 安全证书

    测试前准备

    实际应用场景中,我们需要把设备产生的数据在本地进行 脱敏 处理后上云展示。

    本文则以某实际生产车间中的温度传感器为例,应用 Baetyl,并联合 百度云天工 相关产品服务一起将温度传感器采集到的数据进行 脱敏 处理(如去除车间编号、设备型号、设备 ID 等信息),然后将 脱敏 后的数据上传至远程云端进行可视化展示。

    其数据流经的路径/服务为:

    MQTT.fx -> Baetyl Local Hub -> Baetyl Function SQL Runtime -> Baetyl Local Hub -> Baetyl MQTT Remote Module -> Baidu IoT Hub -> Baidu IoT Rule Engine -> Baidu IoT TSDB -> Baidu IoT Visualization

    ../_images/practice-write-data-to-tsdb-workflow.png本文 case 流程示意图

    因此,在正式开始测试之前,我们需要在云端先把 IoT Hub、Rule Engine、TSDB 及 Visualization 等相关配置完善。

    创建物接入 Endpoint

    相关创建过程可参考 快速创建物接入 Endpoint(包括创建用户、身份、策略及主题权限信息等),这里仅给出创建完成后的结果示意图。

    ../_images/practice-create-iothub-endpoint.png创建物接入 Endpoint

    如上,已创建好一个名为 baetyl_demo 的物接入项目。其用户名为 guqgsr9/test,身份信息为 principal,认证方式为证书认证,策略为 policy,对主题 data/filter 有发布和订阅消息的权限(详见下文测试时 MQTT Remote 远程服务模块配置)。

    创建规则引擎 Rule

    相关创建过程可参考 快速创建规则引擎 Rule(包括转换 SQL 语句编写、约束条件设置、数据目的地指定等)。这里需要创建两条规则,其一是用于对本地设备产生的原始数据进行过滤;其二是实时提取从物接入既定主题接收的数据消息,并将其转换为 TSDB 能够接收的数据内容,然后将之传送给 TSDB。创建完成后的结果示意图具体如下:

    设备生产数据过滤用规则

    ../_images/practice-filter-rule.png数据过滤、脱敏规则

    如上,已创建好一个名为 filter 的规则,该规则用于对本地设备实际产生的原始数据进行 过滤、脱敏 等处理。图中所示为筛选实际生产数据中的 temperature、ts、unit 等字段,且满足 temperature > 50 信息,然后将之上传至远程云端 Hub 模块。

    提示:这里不需要为规则设置数据目的地,仅作为云端 SQL 语句测试使用。

    物接入既定主题接收消息用规则

    ../_images/practice-hub-from-rule.png数据解析、转换 TSDB 规则

    如上,已创建好一个名为 baetyl-demo 的规则,该规则会默认从物接入 Endpoint 的 data/filter 主题提取消息,然后通过 SQL 语句进行转换,将其转换为符合 TSDB 规范 的数据,并将之存储在名为 baetyl 的 TSDB 数据库中。

    创建 TSDB 数据库

    相关创建过程可参考 快速创建TSDB(包括查询类别、时间范围、时间序列度量等),这里仅给出创建完成后的结果示意图。

    ../_images/practice-tsdb-config.png创建 TSDB

    如上,已创建好一个名为 baetyl 的 TSDB 时序数据库,该数据库会默认查询 选定时间段 的符合时间序列度量标识的时序数据信息,且默认显示前 1000 个符合上述条件的值。

    创建物可视展示板

    相关创建过程可参考 快速创建物可视(包括设置来源数据表、时间序列度量信息等),这里仅给出创建完成后的结果示意图。

    ../_images/practice-iotvz-config.png创建物可视

    如上,已创建一个名为 baetyl_demo 的物可视展示板,其展示数据来源于时序数据库 baetyl,时间序列度量信息为 device_temperature,X 轴为时间戳,Y 轴为设备温度值。

    至此,正式测试前云端相关服务的创建、设置工作已经完成。

    提示:以上创建的物接入 Endpoint、规则引擎 Rule、TSDB 数据库及物可视展示板的所属区域应为同一个(如均为北京,或是均为广州)。

    基本步骤流程

    将生产设备数据经 脱敏 后上云、写入 TSDB 及在云端物可视进行展示所涉及的流程步骤主要包括:

    • 步骤1: 创建核心并下载配置(含主程序) 在 BIE 云端管理套件页面选定区域(北京,或广州)创建核心,完善核心创建所需配置信息,点击“下载配置”,然后选择包含主程序,具体请参考BIE 快速入门
    • 步骤2: 本地启动 Baetyl 本地解压缩主程序(含配置)后,启动 Baetyl,然后点击核心连接状态按钮,如 Baetyl 正常启动,即可看到核心连接状态已变更为 已连接
      • Baetyl 启动参考命令:
        • mkdir baetyl-demo
        • cd baetyl-demo && unzip -d . baetyl-xxx.zip
        • sudo chmod +x bin/baetyl
        • sudo bin/baetyl start
    • 步骤3: 建立服务配置 进入已创建的核心,然后开始依次创建本次测试所需的服务配置信息(Hub 服务配置、Function Manager服务配置、Function Filter 服务配置、Remote服务配置),详细内容可参考BIE 操作实践
      • Hub 服务配置:需要挂载 conf、data、cert、log 四个挂载卷,分别存储 Hub 服务的配置、持久化数据、ssl认证资源和日志,存储卷挂载应用相关内容具体可参考 如何正确地引入存储卷../_images/localhub-volume.pnglocalhub_volume
      • Function Manager 服务配置:需要挂载 conf、cert、log 三个挂载卷,分别存储配置、连接 Hub 服务的客户端证书和日志数据../_images/function-manager-volume.pnglocalhubfunction_manager_volume
      • Function Filter 服务配置:需要挂载conf挂载卷,存储配置信息../_images/function-filter-volume.pnglocalhubfunction_filter_volume
      • Remote 服务配置:需要挂载 conf、localhub-cert、iothub-cert、log 四个挂载卷,存储配置、本地 localhub 服务 SSL 证书、云端 iothub 服务 SSL 证书和日志../_images/remote-mqtt-volume.pnglocalhubremote_volume
    • 步骤4: 发布及下发服务配置 完成核心所需的各个服务的配置后,点击“生成配置”按钮生成当前版本配置,然后再点击“下发配置”按钮将生成的版本配置下发至本地,Baetyl 服务会自动切换、加载该下发的新配置信息,具体可参考BIE 操作实践
      • 此过程要求 Baetyl 持续 保持连接 状态,如果 Baetyl 在下发配置前已断开连接,则重新启动 Baetyl,在连接状态恢复至 已连接 后下发新配置即可(推荐);或可选择 下载配置 按钮,将该新配置下载至本地,然后自行在本地替换,然后再启动 Baetyl
    • 步骤5: 配置 MQTTBox 连接信息 启动 MQTTBox,配置其与本地 Hub 服务建立连接所需的各配置信息
    • 步骤6: 发送测试数据 在 MQTTBox 与本地 Hub 模块建立连接后,向主题 data 发送测试数据,然后打开 TSDB 面板,查看是否有数据成功写入,同时打开物可视展示板,观察数据写入的状态
    • 步骤7:结果验证 若上述过程顺利,则可以看到刚才已发送的测试已经成功写入 TSDB,并在物可视进行展示。

    测试与验证

    本节中将会结合 智能边缘 BIE 云端管理套件从云端创建 Baetyl 执行所需的一切配置信息,然后由 智能边缘 BIE 云端管理套件下发本地部署,最后由本地启动 Baetyl,完成整个测试例的测试与验证。

    Baetyl 主程序配置

    1. version: V2
    2. services:
    3. - name: agent
    4. image: 'hub.baidubce.com/baetyl/baetyl-agent:latest'
    5. replica: 1
    6. mounts:
    7. - name: agent-conf
    8. path: etc/baetyl
    9. readonly: true
    10. - name: agent-cert
    11. path: var/db/baetyl/cert
    12. readonly: true
    13. - name: agent-volumes
    14. path: var/db/baetyl/volumes
    15. - name: agent-log
    16. path: var/log/baetyl
    17. - name: localhub
    18. image: 'hub.baidubce.com/baetyl/baetyl-hub:latest'
    19. replica: 1
    20. ports:
    21. - '1883:1883'
    22. - '8883:8883'
    23. mounts:
    24. - name: baetyl-localhub-conf
    25. path: etc/baetyl
    26. readonly: true
    27. - name: baetyl-log
    28. path: var/log/baetyl
    29. - name: baetyl-localhub-cert
    30. path: var/db/baetyl/cert
    31. readonly: true
    32. - name: baetyl-persist-data
    33. path: var/db/baetyl/data
    34. - name: function-manager
    35. image: hub.baidubce.com/baetyl/baetyl-function-manager:latest
    36. replica: 1
    37. mounts:
    38. - name: baetyl-func-manager-conf
    39. path: etc/baetyl
    40. readonly: true
    41. - name: baetyl-mqtt-client-cert
    42. path: var/db/baetyl/cert
    43. readonly: true
    44. - name: baetyl-log
    45. path: var/log/baetyl
    46. - name: function-filter
    47. image: 'hub.baidubce.com/baetyl/baetyl-function-sql:latest'
    48. replica: 0
    49. mounts:
    50. - name: baetyl-function-filter-conf
    51. path: etc/baetyl
    52. readonly: true
    53. - name: remote-mqtt
    54. image: 'hub.baidubce.com/baetyl/baetyl-remote-mqtt:latest'
    55. replica: 1
    56. mounts:
    57. - name: baetyl-remote-mqtt-conf
    58. path: etc/baetyl
    59. readonly: true
    60. - name: baetyl-remote-iothub-cert
    61. path: var/db/baetyl/iothub/cert
    62. readonly: true
    63. - name: baetyl-mqtt-client-cert
    64. path: var/db/baetyl/localhub/cert
    65. readonly: true
    66. - name: baetyl-log
    67. path: var/log/baetyl
    68. volumes:
    69. - name: agent-conf
    70. path: var/db/baetyl/agent-conf
    71. - name: agent-cert
    72. path: var/db/baetyl/agent-cert
    73. - name: agent-volumes
    74. path: var/db/baetyl
    75. - name: agent-log
    76. path: var/db/baetyl/agent-log
    77. - name: baetyl-log
    78. path: var/db/baetyl/baetyl-log
    79. - name: baetyl-localhub-cert
    80. path: var/db/baetyl/baetyl-localhub-cert
    81. - name: baetyl-persist-data
    82. path: var/db/baetyl/baetyl-persist-data
    83. - name: baetyl-mqtt-client-cert
    84. path: var/db/baetyl/baetyl-mqtt-client-cert
    85. - name: baetyl-function-filter-conf
    86. path: var/db/baetyl/baetyl-function-filter-conf
    87. - name: baetyl-localhub-conf
    88. path: var/db/baetyl/baetyl-localhub-conf
    89. - name: baetyl-remote-iothub-cert
    90. path: var/db/baetyl/baetyl-remote-iothub-cert
    91. - name: baetyl-remote-mqtt-conf
    92. path: var/db/baetyl/baetyl-remote-mqtt-conf
    93. - name: baetyl-func-manager-conf
    94. path: var/db/baetyl/baetyl-func-manager-conf

    Hub 服务配置

    1. listen:
    2. - tcp://0.0.0.0:1883
    3. - ssl://0.0.0.0:8883
    4. certificate:
    5. ca: var/db/baetyl/cert/ca.pem
    6. cert: var/db/baetyl/cert/server.pem
    7. key: var/db/baetyl/cert/server.key
    8. principals:
    9. - username: two-way-tls
    10. permissions:
    11. - action: 'pub'
    12. permit: ['#']
    13. - action: 'sub'
    14. permit: ['#']
    15. - username: test
    16. password: hahaha
    17. permissions:
    18. - action: 'pub'
    19. permit: ['#']
    20. - action: 'sub'
    21. permit: ['#']
    22. logger:
    23. path: var/log/baetyl/localhub-service.log
    24. level: "debug"

    Function Manager 服务配置

    1. hub:
    2. address: ssl://localhub:8883
    3. username: two-way-tls
    4. ca: var/db/baetyl/cert/ca.pem
    5. cert: var/db/baetyl/cert/client.pem
    6. key: var/db/baetyl/cert/client.key
    7. insecure: true
    8. rules:
    9. - clientid: localfunc-1
    10. subscribe:
    11. topic: data
    12. qos: 1
    13. function:
    14. name: filter
    15. publish:
    16. topic: data/filter
    17. qos: 1
    18. functions:
    19. - name: filter
    20. service: function-filter
    21. instance:
    22. max: 10
    23. logger:
    24. path: var/log/baetyl/func-service.log
    25. level: "debug"

    Function Filter 服务配置

    1. functions:
    2. - name: filter
    3. handler: 'SELECT temperature, ts, unit WHERE temperature > 50'

    如上配置,发送到主题 data 的消息会被 SQL 运行时进行处理(脱敏、过滤),然后将处理结果反馈给主题 data/filter

    Remote 服务配置

    1. hub:
    2. address: ssl://localhub:8883
    3. username: two-way-tls
    4. ca: var/db/baetyl/localhub/cert/ca.pem
    5. cert: var/db/baetyl/localhub/cert/client.pem
    6. key: var/db/baetyl/localhub/cert/client.key
    7. insecure: true
    8. remotes:
    9. - name: iothub
    10. address: '<iothub_endpoint>' # 从物接入的项目列表中复制 ssl 地址替换 <iothub_endpoint>,比如:ssl://xxxxxx.mqtt.iot.gz.baidubce.com:1884,xxxxxx 为 endpoint
    11. clientid: remote-iothub-1
    12. username: '<username>' # 从上面选定(address)的物接入项目下创建的用户名列表中复制支持 ssl 连接的用户名替换 <username>,比如:xxxxxx/test,xxxxxx 为 endpoint
    13. ca: var/db/baetyl/iothub/cert/ca.pem
    14. cert: var/db/baetyl/iothub/cert/client.pem
    15. key: var/db/baetyl/iothub/cert/client.key
    16. rules:
    17. - hub:
    18. subscriptions:
    19. - topic: data/filter
    20. qos: 0
    21. remote:
    22. name: iothub
    23. subscriptions:
    24. logger:
    25. path: var/log/baetyl/remote-service.log
    26. level: "debug"

    如上配置,本地 Hub 服务会将主题 data/filter 的消息发送给 Remote 远程服务(上文创建物接入 Endpoint 已拥有主题 data/filter 的订阅权限),然后远程 Hub 服务(这里指百度云 IoTHub 平台)接收到主题 data/filter 的消息触发规则 baetyl-demo (上文已创建),然后由规则引擎对消息进行封装(以满足 TSDB 规范),传送给 TSDB,最终在物可视进行可视化展示。

    测试

    依据 Hub 服务配置对 MQTTBox 进行连接设置,具体如下图示。

    ../_images/practice-mqttbox-config.png配置 MQTTBox 连接信息

    同理,依据云端物接入的配置信息,对 MQTT.fx 进行连接配置,具体如下图示。

    ../_images/practice-mqttfx-config.png配置 MQTTBox 连接信息

    然后通过 MQTTBox 向主题 data 发送消息,消息内容格式参考:

    1. {
    2. "temperature": 67.5, // 温度
    3. "ts": 1568817178, // Unix 时间戳
    4. "deviceid": "dev001", // 设备 ID
    5. "factory": "shanghai", // 生产地址
    6. "type": "temperature tensor", // 设备类型
    7. "unit": "℃" // 单位
    8. }

    如按上文的消息处理逻辑,该条消息会被筛选出来,并回传给本地 Hub 服务,再由本地 Hub 服务将数据发送给 Remote 服务,最后上传至云端物接入,经由规则 baetyl-demo 封装处理,传送给 TSDB,最终在物可视展示。相关示意图如下示。

    MQTTBox 收到处理后的消息,表示消息已被 Function Filter 服务处理,并将结果回传给了 Hub 服务。

    ../_images/practice-mqttbox-data-succ.pngMQTTBox 收到处理后的消息

    MQTT.fx 收到云端物接入的消息,表示该消息已通过 Remote 服务发往了云端物接入

    ../_images/practice-mqttfx-data-succ.pngMQTTFX 收到处理后的消息

    如果我们通过 MQTTBox 向主题 data 发送的消息内容为:

    1. {
    2. "temperature": 35.6, // 温度
    3. "ts": 1568817182, // Unix 时间戳
    4. "deviceid": "dev001", // 设备 ID
    5. "factory": "shanghai", // 生产地址
    6. "type": "temperature tensor", // 设备类型
    7. "unit": "℃" // 单位
    8. }

    则 MQTTBox 和 MQTT.fx 均不会收到处理后的消息(temperature < 50 被过滤掉)。同理,规则引擎 baetyl-demo、TSDB 和物可视均不会收到该处理后的消息。

    为更清晰地在云端展示处理后的结果,我们写入多条符合要求的数据,得到对应的 TSDB 和物可视的展示效果如下图示。

    TSDB 收到多条处理结果

    ../_images/practice-tsdb-multi-view.pngTSDB 收到多条处理结果

    物可视收到多条处理结果

    ../_images/practice-iotvz-multi-view.png物可视收到多条处理结果

    至此,通过 Baetyl 已实现将数据写入百度云 TSDB 及通过物可视进行可视化展示。