百度天工物联网平台实践

2020-01-14  本文已影响0人  李征兵

物联网发展至今已经非常成熟,物联网平台是智慧治理的基础平台,只有收集海量的探测数据才能够进行相应的大数据分析,从而实现特定的智慧决策。最近有机会深入研究了一下物联网基本架构,并横向对比了几家大厂提供的物联网平台,今天就百度的天工物联网平台做一完整的梳理,也是对这几天研究的总结。

物联网整体架构

物联网包含:硬件设备、物联网基础平台、时序数据库、可视化数据展示、大数据分析&AI、物联网应用等几大部分,这些部分的相互关系如图。


物联网架构

通常物联网平台都会提供SDK给硬件设备,使得硬件接入更加的便捷。本文重点在物联网平台及应用,硬件集成不专业就不描述了。

硬件数字孪生定义

物联网平台实现了硬件设备的数字孪生,百度天工平台采用“物模型”来实现这种映射,也就是对每种硬件设备定义一个物模型,这个模型里边定义了硬件设备的数字属性,从而定义了硬件数据采集的格式。

  1. 创建项目
    每个项目都明确了MQTT接入的方式。


    创建项目
  2. 创建物模型
    一个项目下可以创建多个物模型,物模型定义若干个属性。


    创建物模型
  3. 创建物影子
    物影子是和实体硬件一一对应的,是物模型的对象,逻辑上对物影子的操作就是对硬件的操作,从OOP的概念上理解,物模型就是Class,物影子就是Object。


    创建物影子

利用MQTT模拟器调试

经过以上3步建立好硬件的数字孪生环境后就可以使用MQTT模拟器进行验证了。实现MQTT客户端的软件很多,推荐使用MQTT.fx。
创建项目的时候平台提供了MQTT接入的地址,创建物影子的时候提供了MQTT接入的用户名、密码及发布消息的Topic(MQTT协议的基础知识自行脑补)。


MQTT发布消息

通过向该Topic发布JSON数据就可以模拟硬件设备上报数据过程。


MQTT订阅消息
通过订阅该Topic就可以接收硬件设备上报的数据。

存储数据

百度天工提供了对物联网数据的持久化存储并且实现了和物影子的无缝连接。如果在物影子的属性配置中设置了“数据存储”并且对属性字段指明了“存储配置策略”,则设备上报的数据就会存储到百度的时序数据库中。后续的物联网应用就可以基于该数据库进行相关的操作。


时序数据库

物可视

百度天工也提供了良好的数据可视化解决方案,就是“物可视”,其依托时序数据库利用各种可视化的图表来展示从硬件设备采集过来的数据,平台提供了很多的图表组件,每种都有使用场景和配置方法,这里不再详细描述。


物可视

应用开发

百度天工提供了对接时序数据库的SDK,利用该SDK可以非常方便的开发自己的物联网应用。

  1. maven依赖
    <!--百度时序数据库-->
    <dependency>
        <groupId>com.baidubce</groupId>
        <artifactId>bce-java-sdk</artifactId>
        <version>0.10.31</version>
    </dependency>
  1. 配置接入百度天工的参数
@Configuration
@ConfigurationProperties(prefix = "baidu.tsdb")
@Data
public class TsdbConf {
    private String accessKeyId;
    private String secretAccessKey;
    private String endpoint;
}
#百度时序数据库配置
baidu:
  tsdb:
    accessKeyId: c4ba3****aecf3aaca0d
    secretAccessKey: 61d80cb****b2786f1173
    endpoint: mytestone.tsdb-ex4n6gb8ukg7.tsdb.iot.bj.baidubce.com
  1. 查询
@RestController
@Slf4j
public class Controller {
    @Autowired
    private TsdbClient tsdbClient;;

    @GetMapping("/getMethane")
    @ApiOperation(value = "获取沼气池数据", notes = "沼气监控")
    public ResponseData getMethane() {
        ResponseData result = new ResponseData();
        String metric = "smart_gas";
        List<String> fields = Arrays.asList("ch4","co2","pressure","temperature");

        // 构造查询对象
        List<Query> queries = Arrays.asList(new Query()  // 创建Query对象
                .withMetric(metric)          // 设置metric
                .withFields(fields)           // 设置查询的域名,不设置表示查询默认域
                .withFilters(new Filters()     // 创建Filters对象
                        .withRelativeStart("2 hours ago"))  // 设置相对的开始时间,这里设置为2小时前
                .withLimit(100));   // 设置返回数据点数目限制
        // 查询数据
        QueryDatapointsResponse response = tsdbClient.queryDatapoints(queries);
        JSONObject data = new JSONObject();
        data.put("times",response.getResults().get(0).getGroups().get(0).getValues());
        result.setStatus(ResponseCode.SUCCESS);
        result.setData(data);
        return result;
    }
}
  1. 嵌入物可视
    平台提供的物可视UI可以嵌入到应用开发的功能里边,以H5的方式整合提供。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="renderer" content="webkit">

    <!-- 加载 物可视SDK-->
    <script type="text/javascript" src="https://iotviz2.cdn.bcebos.com/bin/prod/sdk/bdiotvizplayer.min.js"></script>

    <style>
        html, body {
            font-size: 12px;
            font-family: "PingFang SC";
            display: block;
            margin: 0;
            width: 100%;
            height: 100%;
        }

        #content {
            width: 100%;
            height: 100%;
        }
    </style>
</head>

<body>
<div id="content"></div>

<script type="text/javascript">
    const bdIotVizPlayer = window.BDIotVizPlayer;
    const container = document.getElementById('content');
    const myDashboard = bdIotVizPlayer({
        containerElement: container,
        dashboardId: '5e1c4b849488b1403a0871eb',
        fillMode: 'none', // <-- Optional, Possible value: 'none', 'contain', 'cover', 'responsive'
        token: {
            type: 'embedded', // <-- Must be 'embedded'
            value: 'd3dd660696e77ff240a89d7ed5af004b' // <-- Access Token for current dashboard
        }
    });
    myDashboard.getDashboardConfig().then(function(config){
        console.log(config); // <--- Current Dashboard Config
    });
    // 'myDashboard' exposes the API to the dashboard loaded
    // refer to API doc for complete API description
</script>
</body>
</html>
上一篇下一篇

猜你喜欢

热点阅读