计算机网络编程MQTT协议基础原理详解

计算机网络编程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 连接的过程分为四个阶段:建立连接、客户端身份验证、创建会话和清除会话。

  1. 建立连接

客户端使用 TCP 协议连接服务器,并发送一个 CONNECT 报文。

import paho.mqtt.client as mqtt

client = mqtt.Client()
client.connect("iot.eclipse.org", 1883, 60)
client.loop_forever()
  1. 客户端身份验证

服务器会对客户端的身份进行验证,如果验证失败,服务器会断开连接。

  1. 创建会话

如果客户端连接成功,服务器会创建一个与客户端相关的会话,该会话将在客户端与服务器之间传递消息。如果客户端提供了持久会话,服务器会保留早期的非清理消息以供未来使用。

  1. 清除会话

一旦会话结束,服务器会清除所有相关数据,并关闭客户端连接。

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技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • .Net 7函数Ctor与CCtor使用及区别详解

    以下是关于“.Net7函数Ctor与CCtor使用及区别详解”的完整攻略: 1. 问题描述 在.NET 7中,我们可以使用Ctor和CCtor函数来初始化对象。本攻略将介绍如何使用Ctor和CCtor函数,并解释它们之间的区别。 2. 解决方案 在.NET 7中,我们可以使用Ctor和CCtor函数来初始化对象。以下是两个示例,用于说明如何使用Ctor和CC…

    C# 2023年5月12日
    00
  • PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用

    下面我会给您详细讲解 “PHP 杂谈《重构-改善既有代码的设计》之五 简化函数调用”的完整攻略。 一、什么是“重构”、“简化函数调用”的概念? 重构是指对既有代码进行修改,以改善其结构,使得代码更易于理解、更容易扩展、更符合设计模式等目的。 而简化函数调用,则是指通过改进函数的接口和参数列表,使得函数调用更为简洁、清晰可读。 二、如何进行函数调用的简化? 在…

    C# 2023年6月6日
    00
  • C#自定义事件监听实现方法

    下面我将详细讲解“C#自定义事件监听实现方法”的完整攻略。 一、什么是自定义事件 在C#中,自定义事件是指开发者可以自主定义事件,而不是使用已经定义好的事件。使用自定义事件可以让代码更灵活,同时也可以让代码更易于维护。 二、自定义事件的实现方法 1. 声明事件委托 在声明自定义事件之前,需要先声明事件委托。事件委托是一种特殊的委托类型,用于封装一个或多个接受…

    C# 2023年6月1日
    00
  • vs2010怎么自定义的模板?

    下面是vs2010自定义模板的完整攻略: 1. 创建模板文件 VS2010中的模板都存放在指定的文件夹中,我们可以直接把自己编写的模板文件放在这个文件夹中。模板文件夹的位置是:C:\Users\用户名\Documents\Visual Studio 2010\Templates,进入文件夹后可以看到很多已有的模板。 我们可以在模板文件夹中创建一个新的文件夹,…

    C# 2023年6月6日
    00
  • c#反射调用方法示例

    以下是“C#反射调用方法示例”的完整攻略。 什么是反射 在 C# 中,反射是指通过元数据来检查和访问程序集、类型、字段、方法和属性等成员的一种机制。通过反射,我们可以在运行时获取一个对象的类型并操作它;也可以动态地创建类型、调用成员等。C# 反射机制中最常用的类和接口是 System.Reflection 和 System.Type。 反射调用方法示例 下面…

    C# 2023年5月31日
    00
  • C# DataTable数据遍历优化详解

    当处理大数据量的DataTable时,常常需要考虑优化数据遍历的性能,这里将介绍一些优化技巧来提高C#的DataTable遍历速度。 1. 使用索引来提高DataTable遍历性能 使用索引是数据检索的一种高效方式。在DataTable中使用PrimaryKey,可以基于每个列的唯一值来创建索引。通过使用PrimaryKey,可以遍历DataRow的速度被大…

    C# 2023年5月31日
    00
  • ASP.Net Core对USB摄像头进行截图

    以下是“ASP.NetCore对USB摄像头进行截图”的完整攻略: 什么是ASP.NetCore ASP.NetCore是一个跨平台的Web应用程序框架,它可以在Windows、Linux和macOS等操作系统上运行。ASP.NetCore是.NET Core的一部分,它提供了一现代化的Web开发模型,可以轻松地构建高性能、可展和安全的Web应用程序。 如何…

    C# 2023年5月12日
    00
  • C# 泛型的简单理解(安全、集合、方法、约束、继承)分享

    下面我来详细讲解一下 C# 泛型的相关知识。 什么是泛型 泛型是 C# 语言的一个重要特性,它能使你编写出更加灵活和可重用的代码。泛型和类、接口、委托和方法一样,是 C# 中的一种类型。它允许你定义一种类型,这种类型可以在使用时指定其具体的类型参数。这相当于抽象出了一种通用的类型,只有在具体使用时才会确定其具体类型。 泛型的优势 安全性:泛型能提供编译时类型…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部