MQTT 介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种轻量级的、基于发布/订阅模式的消息传输协议,专为低带宽、高延迟或不可靠的网络环境设计,广泛应用于物联网(IoT)、移动应用和分布式系统中,用于实现设备之间的高效通信。它通过减少数据传输量和简化通信流程,确保消息的可靠传输,同时支持多种服务质量(QoS)等级,以满足不同的业务需求。
观测云
观测云是一款专为 IT 工程师打造的全链路可观测产品,它集成了基础设施监控、应用程序性能监控和日志管理,为整个技术栈提供实时可观察性。这款产品能够帮助工程师全面了解端到端的用户体验追踪,了解应用内函数的每一次调用,以及全面监控云时代的基础设施。此外,观测云还具备快速发现系统安全风险的能力,为数字化时代提供安全保障。
Func 平台
观测云 Func 平台(DataFlux Func)是一个基于 Python 的函数计算与数据处理开发平台,旨在帮助用户快速搭建、管理和执行数据处理任务。它主要由 Server(提供 Web UI 和 API 接口)和 Worker(提供 Python 脚本执行环境)两部分组成。该平台支持多源数据对接,内置丰富的数据源连接器,可快速实现数据汇聚与处理。此外,Func 平台还具备定时任务管理、API 接口发布等功能,支持同步、异步和定时调用,极大简化了开发流程。通过与观测云的深度集成,用户可以利用其强大的可观测性能力,实现数据的实时处理、分析和可视化。
通过各类传感器接收设备数据,进行处理并通过 MQTT 协议上报,通过 Func 消费来自 MQTT 协议的数据并上报至观测云平台进行存储、展示、分析、预警等操作。
实战
- 场景:采集 Linux 主机温度,上报至观测云。
- 准备工作:EMQX,接收 MQTT 协议的数据并供 Client 端消费数据
采集温度
Sensors(传感器)采集温度是通过物理或化学原理将温度变化转换为电信号的过程。常见的温度传感器包括热敏电阻(NTC/PTC)、热电偶、热敏二极管和数字温度传感器(如DS18B20)。这些传感器通过感知环境温度的变化,输出与温度成正比或符合特定函数关系的电压、电流或数字信号。这些信号经过放大、滤波和模数转换后,可被微控制器或数据采集系统读取,从而实现对温度的实时监测和记录。
在 Shell 中执行 sensors
可以获取到当前 CPU、硬盘等温度信息。
通过脚本方式获取温度信息:
python
import psutil
def get_system_temperatures():
temps = psutil.sensors_temperatures()if not temps:return "No temperature sensors found."
result = ""for chip, sensors in temps.items():
result += f"{chip}:\n"for sensor in sensors:
result += f" {sensor.label or 'Sensor'}: {sensor.current}°C (high={sensor.high}, critical={sensor.critical})\n"return result
# 调用函数并打印结果
system_temps = get_system_temperatures()print(system_temps)
说明:
psutil.sensors_temperatures()
返回系统中所有温度传感器的信息。- 每个传感器有
current
(当前温度)、high
(高温警戒值)和critical
(临界温度)等属性。
上报到 EMQX
python
import psutil
import paho.mqtt.client as mqtt
import time
import json
def get_system_temperatures():
temps = psutil.sensors_temperatures()
if not temps:
return "No temperature sensors found."
result = {}
for chip, sensors in temps.items():
result[chip] = []
for sensor in sensors:
if sensor.label is not None and sensor.label != "":
result[chip].append({
'host': "liurui",
'label': sensor.label,
'current': sensor.current,
'high': sensor.high,
'critical': sensor.critical
})
return result
def on_connect(client, userdata, flags, rc):
print(f"Connected with result code {rc}")
def publish_temperatures(temps, broker, port, topic):
client = mqtt.Client()
client.on_connect = on_connect
client.connect(broker, port, 60)
client.loop_start()
# 打包所有传感器数据成一个JSON对象
payload = json.dumps(temps)
client.publish(topic, payload)
print(f"Published: {payload}")
client.loop_stop()
if __name__ == "__main__":
broker = "1.1.1.1" # 替换为你的EMQX broker地址
port = 1883 # 默认MQTT端口
topic = "temperature" # 替换为你想要发布的主题
while True:
system_temps = get_system_temperatures()
if isinstance(system_temps, str):
print(system_temps)
else:
publish_temperatures(system_temps, broker, port, topic)
time.sleep(5) # 每5秒采集并上报一次
申请观测云 API Key
登陆观测云控制台,点击菜单「管理」-「API Key 管理」,新建 API Key。
保存 Key ID 和 Key,后续 Func 平台需要用到。
Func 消费 MQTT 数据
1、新建脚本集
2、新建脚本
脚本内容如下:
python
import json
guance = DFF.CONN('GuanceAPI')
@DFF.API('Message Handler')
def message_handler(topic, message):
print(f"Received message: {message} on topic {topic}")
if topic == "temperature":
parse_and_print_temperatures(message)
def parse_and_print_temperatures(temps_json):
# 解析 JSON 字符串为 Python 字典
temps_dict = json.loads(temps_json)
result = []
# 遍历每个芯片
for chip, sensors in temps_dict.items():
print(f"Chip: {chip}")
# 遍历每个传感器
for sensor in sensors:
result.append({
'measurement': 'temperature',
'tags': {
'host': sensor['host'],
'chip': chip,
'label': sensor['label']
},
'fields': {
'current': sensor['current'],
'high': sensor['high'],
'critical': sensor['critical']
}
})
uploadDataKit(result)
def uploadDataKit(data):
# 获取 DataKit 操作对象
status_code, result = guance.dataway.write_by_category_many(category='metric', data=data)
print(f"上报结果:{status_code}")
3、发布脚本
点击发布按钮进行发布。
4、创建观测云连接器
- 类型:观测云
- ID: GuanceAPI
注意:ID 需要与脚本
guance = DFF.CONN('GuanceAPI')
的 ID 一致,其他字段按照实际情况填写。
5、创建 MQTT 连接器
- 类型为 MQTT Broker (v5.0)
- 填写 ID、主机、端口
- 选择主题以及对应主题消费的脚本
- 点击测试连通性,确保 MQTT 可以正常链接
- 点击保存即可
效果展示
数据上报至观测云后,可以通过仪表板使用以下 DQL 语句可以查看温度的趋势图。
perl
M::`temperature`:(last(`current`)) BY `chip`, `label`
总结
通过观测云 Func 平台接收来自 MQTT 协议的指标、日志、链路等数据,并通过观测云提供的 API 进行封装,上报至观测云平台进行统一的管理、可视化分析、告警等。