摘要:?本文深入淺出地介紹了物聯網、云平臺、MQTT、HTTP、數據可視化等核心概念,并結合 EMQX、Flask、InfluxDB、Grafana 等主流工具,手把手教你搭建一個支持多協議的物聯網云平臺。文章結構清晰,圖文并茂,代碼翔實易懂,旨在幫助讀者快速掌握物聯網云平臺搭建的核心技術。
關鍵詞:?物聯網,云平臺,MQTT,HTTP,數據可視化,EMQX,Flask,InfluxDB,Grafana
一、物聯網基礎知識
1.1 物聯網概述
物聯網(IoT,Internet of Things)是指通過各種信息傳感器、射頻識別技術、全球定位系統等,實時采集任何需要監控、連接、互動的物體或過程,實現物與物、物與人的泛在連接,進而實現對物品和過程的智能化感知、識別和管理。
1.2 物聯網架構
物聯網系統架構通常分為三層:
- 感知層:?負責采集數據,包括各種傳感器、RFID 標簽、GPS 模塊等。
- 網絡層:?負責數據傳輸,包括各種網絡協議、通信技術等,例如 WiFi、藍牙、Zigbee、NB-IoT 等。
- 應用層:?負責數據處理和應用呈現,例如數據分析、遠程控制、智能決策等。
二、云平臺與數據可視化
2.1 云平臺
云平臺是指基于互聯網的相關服務的增加、使用和交付模式,通常涉及通過互聯網來提供動態易擴展且經常是虛擬化的資源。 云平臺可以為物聯網應用提供強大的計算、存儲和網絡資源,降低物聯網應用開發和部署的成本。
2.2 數據可視化
數據可視化是指將數據以圖形、圖表等可視化形式展示出來,幫助用戶更直觀地理解數據,洞察數據背后的規律和趨勢。
三、常用協議與工具介紹
3.1 MQTT 協議
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是一種輕量級的消息發布/訂閱協議,專為低帶寬、低功耗設備和網絡而設計。MQTT 廣泛應用于物聯網領域,特別適用于資源受限的設備和不可靠的網絡環境。
3.2 HTTP 協議
HTTP(Hypertext Transfer Protocol,超文本傳輸協議)是一種應用層協議,用于在 Web 瀏覽器和 Web 服務器之間傳輸信息。 HTTP 協議簡單易用,被廣泛應用于各種網絡應用,包括物聯網領域。
3.3 EMQX
EMQX 是一款開源、高性能、可擴展的 MQTT 消息服務器,支持百萬級并發連接和消息吞吐。
3.4 Flask
Flask 是一個輕量級的 Web 應用框架,使用 Python 編寫,易于學習和使用,適合快速搭建 Web 應用和 API 接口。
3.5 InfluxDB
InfluxDB 是一款開源的時序數據庫,專為存儲和查詢時間序列數據而設計,適用于存儲物聯網傳感器數據、監控數據等。
3.6 Grafana
Grafana 是一款開源的數據可視化工具,可以連接多種數據源,創建美觀、功能強大的儀表盤,實時展示數據。
四、多協議物聯網云平臺搭建
本項目將搭建一個支持 MQTT 和 HTTP 協議的物聯網云平臺,實現以下功能:
- 多協議支持: 同時支持 MQTT 和 HTTP 協議的設備接入。
- 數據采集與存儲: 實時采集來自不同協議設備的數據,并將其存儲到 InfluxDB 數據庫。
- 數據可視化: 使用 Grafana 對采集到的數據進行可視化展示。
4.1 系統架構
?
4.2 代碼實現
1. HTTP 服務器搭建 (Flask)
# 導入 Flask 庫
from flask import Flask, request, jsonify# 創建 Flask 應用
app = Flask(__name__)# 定義 HTTP 接口,接收 POST 請求
@app.route('/data', methods=['POST'])
def receive_data():# 獲取請求數據data = request.get_json()# 數據處理邏輯,例如數據校驗、格式轉換等# ...# 將數據寫入 InfluxDB (示例)from influxdb import InfluxDBClientclient = InfluxDBClient('localhost', 8086, 'user', 'password', 'iot_data')json_body = [{"measurement": "sensor_data","tags": {"sensor_id": data.get("sensor_id")},"fields": {"temperature": data.get("temperature"),"humidity": data.get("humidity")}}]client.write_points(json_body)# 返回響應return jsonify({'message': 'Data received successfully!'}), 200# 啟動 Flask 應用
if __name__ == '__main__':app.run(debug=True)
代碼說明:
- 使用?
Flask
?框架創建 HTTP 服務器,并定義?/data
?接口接收 POST 請求。 - 使用?
request.get_json()
?獲取 HTTP 請求中的 JSON 數據。 - 進行數據處理,例如數據校驗、格式轉換等。
- 使用?
InfluxDBClient
?連接 InfluxDB 數據庫,并將數據寫入數據庫。 - 返回 JSON 格式的響應,告知客戶端數據接收成功。
2. MQTT 消息處理 (Python)
# 導入必要的庫
import paho.mqtt.client as mqtt
from influxdb import InfluxDBClient
import json# MQTT Broker 配置
MQTT_BROKER = "localhost"
MQTT_PORT = 1883
MQTT_TOPIC = "sensor/data"# InfluxDB 配置
INFLUXDB_HOST = "localhost"
INFLUXDB_PORT = 8086
INFLUXDB_USER = "user"
INFLUXDB_PASSWORD = "password"
INFLUXDB_DATABASE = "iot_data"# 創建 InfluxDB 客戶端
influxdb_client = InfluxDBClient(host=INFLUXDB_HOST,port=INFLUXDB_PORT,username=INFLUXDB_USER,password=INFLUXDB_PASSWORD,database=INFLUXDB_DATABASE
)# 連接到 MQTT Broker
def on_connect(client, userdata, flags, rc):print("Connected to MQTT Broker with result code " + str(rc))client.subscribe(MQTT_TOPIC)# 接收 MQTT 消息
def on_message(client, userdata, msg):# 解析數據data = json.loads(msg.payload.decode())# 構建 InfluxDB 數據點influxdb_data = [{"measurement": "sensor_data","tags": {"sensor_id": data.get("sensor_id"),},"fields": {"temperature": data.get("temperature"),"humidity": data.get("humidity"),}}]# 寫入 InfluxDBinfluxdb_client.write_points(influxdb_data)print("Data written to InfluxDB: " + str(influxdb_data))# 創建 MQTT 客戶端
mqtt_client = mqtt.Client()
mqtt_client.on_connect = on_connect
mqtt_client.on_message = on_message
mqtt_client.connect(MQTT_BROKER, MQTT_PORT, 60)# 啟動 MQTT 客戶端
mqtt_client.loop_start()# 保持程序運行
while True:pass
代碼說明:
- 使用?
paho.mqtt.client
?連接到 MQTT Broker,并訂閱指定主題。 - 當收到 MQTT 消息時,使用?
json.loads()
?解析消息內容。 - 將解析后的數據構建成 InfluxDB 數據點格式。
- 使用?
influxdb_client.write_points()
?將數據寫入 InfluxDB 數據庫。
3. 數據可視化 (Grafana)
- 安裝 Grafana 并配置數據源連接到 InfluxDB 數據庫。
- 創建儀表盤并在儀表盤上添加圖表,例如折線圖、柱狀圖等。
- 配置圖表的數據源為 InfluxDB,并編寫查詢語句從 InfluxDB 中獲取數據。
- 根據需要配置圖表的樣式、標題、坐標軸等屬性,使數據展示更加直觀易懂。
示例 Grafana 查詢語句:
SELECT "temperature", "humidity" FROM "sensor_data" WHERE time > now() - 1h
該查詢語句將從?sensor_data
?measurement 中查詢最近 1 小時的溫度和濕度數據。
本項目通過結合 Flask、EMQX、InfluxDB 和 Grafana 等工具,搭建了一個支持 MQTT 和 HTTP 協議的物聯網云平臺,并實現了數據的采集、存儲和可視化展示。該平臺可以靈活擴展,支持更多類型的設備和協議接入,并根據實際需求進行功能定制。
注意:
- 以上代碼僅供參考,實際應用中需要根據具體需求進行修改。
- 請確保已安裝所有依賴庫,例如?
paho-mqtt
,influxdb
,flask
?等。 - 在實際部署中,需要考慮數據的安全性、系統的穩定性等因素。
想要具體的代碼以及思路可以私信我!!!