物聯網發展至今已經非常成熟,物聯網平台是智慧治理的基礎平台,只有收集海量的探測數據才能夠進行相應的大數據分析,從而實現特定的智慧決策。最近有機會深入研究了一下物聯網基本架構,並橫向對比了幾家大廠提供的物聯網平台,今天就百度的天工物聯網平台做一完整的梳理,也是對這幾天研究的總結。
物聯網整體架構
物聯網包含:硬件設備、物聯網基礎平台、時序數據庫、可視化數據展示、大數據分析&AI、物聯網應用等幾大部分,這些部分的相互關系如圖。
通常物聯網平台都會提供
SDK給硬件設備,使得硬件接入更加的便捷。本文重點在物聯網平台及應用,硬件集成不專業就不描述了。
硬件數字孿生定義
物聯網平台實現了硬件設備的數字孿生,百度天工平台采用“物模型”來實現這種映射,也就是對每種硬件設備定義一個物模型,這個模型裏邊定義了硬件設備的數字屬性,從而定義了硬件數據采集的格式。
1. 創建項目
每個項目都明確了MQTT接入的方式。
2. 創建物模型
一個項目下可以創建多個物模型,物模型定義若幹個屬性。
3. 創建物影子
物影子是和實體硬件一一對應的,是物模型的對象,邏輯上對物影子的操作就是對硬件的操作,從OOP的概念上理解,物模型就是Class,物影子就是Object。
利用MQTT模擬器調試
經過以上3步建立好硬件的數字孿生環境後就可以使用MQTT模擬器進行驗證了。實現MQTT客戶端的軟件很多,推薦使用MQTT.fx。
創建項目的時候平台提供了MQTT接入的地址,創建物影子的時候提供了MQTT接入的用戶名、密碼及發布消息的Topic(MQTT協議的基礎知識自行腦補)。
通過向該Topic發布JSON數據就可以模擬硬件設備上報數據過程。
通過訂閱該Topic就可以接收硬件設備上報的數據。
存儲數據
百度天工提供了對物聯網數據的持久化存儲並且實現了和物影子的無縫連接。如果在物影子的屬性配置中設置了“數據存儲”並且對屬性字段指明了“存儲配置策略”,則設備上報的數據就會存儲到百度的時序數據庫中。後續的物聯網應用就可以基于該數據庫進行相關的操作。
物可視
百度天工也提供了良好的數據可視化解決方案,就是“物可視”,其依托時序數據庫利用各種可視化的圖表來展示從硬件設備采集過來的數據,平台提供了很多的圖表組件,每種都有使用場景和配置方法,這裏不再詳細描述。
應用開發
百度天工提供了對接時序數據庫的SDK,利用該SDK可以非常方便的開發自己的物聯網應用。
1. maven依賴
<!--百度時序數據庫-->
<dependency>
<groupId>com.baidubce</groupId>
<artifactId>bce-java-sdk</artifactId>
<version>0.10.31</version>
</dependency>
2. 配置接入百度天工的參數
@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
3. 查詢
@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;
}
}
4. 嵌入物可視
平台提供的物可視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>