计算机网络编程MQTT协议基础原理详解
什么是 MQTT 协议?
MQTT 是一种轻量级的,基于发布/订阅模式的通信协议,适用于 Internet of Things(IoT)领域中的低带宽、不可靠的网络环境。
mqtt 协议构建于 TCP/IP 协议之上,通信双方包括一个客户端和一个服务器(也称为代理或 broker)。客户端面向应用系统,将数据发布到服务器或接收从服务器订阅的数据。
MQTT 协议的基本架构
传输层
MQTT 协议运行于 TCP 传输协议上。MQTT 的默认端口为 1883,使用 TLS / SSL 连接时端口为 8883。
MQTT 消息
MQTT 消息由消息头、变长消息头和消息体组成。消息头包括:
- 控制报文类型(例如:连接请求、发布消息、订阅主题、取消订阅主题等);
- DUP 标志代表是否重复;
- QoS 服务质量等级;
- 保留标志用于协议扩展;
- 剩余长度,用于标识消息头和消息体的总长度。
变长消息头包含一些固定属性和可变长度的属性,例如:主题名称,报文标识符,主题过滤器等。消息体包含实际的消息内容。
MQTT 客户端
MQTT 客户端是指部署在 IoT 设备上的应用程序,它可以发布或订阅消息。客户端之间通过 MQTT 代理(broker)相互传递消息。
MQTT 代理
MQTT 代理(broker)是一个后台运行的服务器程序,负责接收来自客户端的消息并进行转发。代理通常还拥有管理客户端的功能,例如:连接管理、安全认证和订阅管理。
MQTT 的代理划分为三个层级:集群层、桥接层和标准代理。代理之间可以相互交换数据,从而实现联网设备之间的通信。
MQTT 连接过程
MQTT 连接的过程分为四个阶段:建立连接、客户端身份验证、创建会话和清除会话。
- 建立连接
客户端使用 TCP 协议连接服务器,并发送一个 CONNECT 报文。
import paho.mqtt.client as mqtt
client = mqtt.Client()
client.connect("iot.eclipse.org", 1883, 60)
client.loop_forever()
- 客户端身份验证
服务器会对客户端的身份进行验证,如果验证失败,服务器会断开连接。
- 创建会话
如果客户端连接成功,服务器会创建一个与客户端相关的会话,该会话将在客户端与服务器之间传递消息。如果客户端提供了持久会话,服务器会保留早期的非清理消息以供未来使用。
- 清除会话
一旦会话结束,服务器会清除所有相关数据,并关闭客户端连接。
MQTT 消息发布与订阅
消息发布
通过publish
方法向指定主题发布消息。
client.publish("topic/test", "Hello World!")
消息订阅
通过subscribe
方法订阅主题,当有消息发布时,会自动接收到。
def on_message(client, userdata, message):
print("Received message: " + str(message.payload.decode("utf-8")))
client.on_message = on_message
client.subscribe("topic/test")
示例说明
示例 1 - 使用 MQTT 发送传感器数据
我们瞬间想到的一个 IoT 场景就是使用温度传感器和 MQTT 协议联网,将传感器数据发送到远程服务器。
下面是一个 Python 脚本,使用 Paho MQTT 客户端库可以连接到代理服务器,然后发送一些模拟的传感器数据:
import paho.mqtt.client as mqtt
import random
import time
def on_publish(client,userdata,result): #create function for callback
print("data published \n")
pass
client = mqtt.Client() #create client object
client.on_publish = on_publish #assign function to callback
client.connect("iot.eclipse.org", 1883, 60) #establish connection
client.loop_start() #start the loop
count = 0
while count < 100:
data = random.randint(0, 100)
client.publish("topic/test", str(data))
count += 1
time.sleep(1)
client.loop_stop() #stop the loop
运行以上代码,将在连接iot.eclipse.org代理服务器后循环100次发送随机数据,每次发送间隔1秒。
示例 2 - 使用 MQTT 接收传感器数据
建立一个 Python 应用程序,用于接收并显示来自主题的传感器数据,然后存储到数据库中。下面是使用 Django Web 框架接收来自 MQTT 代理的数据,并存储到 SQLite 数据库的示例:
import paho.mqtt.client as mqtt
from django.shortcuts import render
from .models import SensorData
def on_connect(client, userdata, flags, rc):
client.subscribe("topic/test") # 订阅主题
def on_message(client, userdata, msg):
SensorData.objects.create(data=msg.payload) # 存储数据对象到 SQLite 数据库
def home(request):
latest_data = SensorData.objects.order_by('time')[:10]
client = mqtt.Client()
client.connect("iot.eclipse.org", 1883, 60) # 连接 MQTT 代理
client.on_connect = on_connect # 设置连接回调函数
client.on_message = on_message # 设置消息回调函数
client.loop_start() # 开始循环处理 MQTT 消息
context = {'latest_data': latest_data}
return render(request, 'index.html', context)
以上代码可以通过在 Django 框架的视图函数home
中连接 MQTT 代理服务器,并接收来自主题topic/test
的传感器数据。然后使用 Django Web 框架提供的模型 API 将数据存储到 SQLite 数据库中,最后将临时表单传递到前端模板以显示从数据库中检索的传感器数据。
总结
在这篇文章里,我们了解了 MQTT 协议的基本原理,包括协议的基本架构,连接过程,消息发布与订阅。然后我们提供了两个示例,说明了如何使用 Python 和 MQTT 协议进行 IoT 应用程序的开发。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:计算机网络编程MQTT协议基础原理详解 - Python技术站