计算机网络编程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日

相关文章

  • 基于C#模拟实现回合制游戏

    基于C#模拟实现回合制游戏攻略 作为一种常见的游戏类型,回合制游戏需要玩家按照游戏设定的顺序依次操作,通常涉及到角色、武器、技能等多种元素的设计。在C#编程中,我们也可以利用面向对象思想,模拟实现一个简单的回合制游戏。 1. 定义角色类 首先我们需要定义一个角色类,包含角色的属性、技能等信息。例如: class Character{ string name;…

    C# 2023年5月15日
    00
  • C#比较二个数组并找出相同或不同元素的方法

    针对“C#比较二个数组并找出相同或不同元素的方法”的完整攻略,以下是具体步骤: 步骤一:创建两个数组 首先,我们需要创建两个数组,来保存要进行比较的数据。可以使用 int[] 或者 string[] 等类型,以下是示例代码: int[] arr1 = new int[] {1, 2, 3, 4, 5}; int[] arr2 = new int[] {3, …

    C# 2023年6月7日
    00
  • 关于C#连接FTP时路径问题的解决方法

    下面是关于C#连接FTP时路径问题的解决方法的完整攻略。 1. 确定FTP服务器根目录 在连接FTP时,首先需要确定FTP服务器的根目录。通常来说,FTP服务器的根目录可能与本地文件系统的根目录不同,因此需要确保路径的正确性。 假设FTP服务器的根目录为/,则需要使用类似于以下的代码来连接FTP服务器: FtpWebRequest request = (Ft…

    C# 2023年5月15日
    00
  • C# 实现FTP上传资料的示例

    C# 实现FTP上传资料的示例 在 C# 中,我们可以使用 FtpWebRequest 类实现文件的上传和下载操作。下面我将详细讲解如何使用 FtpWebRequest 类实现 FTP 上传资料的示例。 步骤 以下是 C# 实现 FTP 上传资料的步骤: 创建 FtpWebRequest 对象,设置 FTP 服务器的地址、用户名、密码和操作类型(上传或下载等…

    C# 2023年6月1日
    00
  • 电脑英文缩写大全

    为了让大家更好地了解“电脑英文缩写大全”的完整攻略,我将分为以下几个部分进行讲解: 1. 收集电脑英文缩写 首先,我们需要收集电脑英文缩写。可以从各种渠道去收集,比如: 在网上搜索相关的英文缩写资料; 浏览电脑文章、手册、技术文档等,注意其中使用的缩写; 参考行业内广泛流传的缩写资料,如IEEE 802.11、ISO 9660等。 收集到英文缩写之后,需要对…

    C# 2023年6月8日
    00
  • 国产化中的 .NET Core 操作达梦数据库DM8的两种方式(操作详解)

    国产化中的 .NET Core 操作达梦数据库DM8的两种方式(操作详解) 简介 随着国产化和自主可控的意识逐渐加强,越来越多的企业开始采用国产化的数据库软件,如达梦数据库DM8。本文将详细讲解在使用.NET Core操作达梦数据库DM8时的两种方式,以帮助读者更好地理解和使用这种组合的方式。 方式一:使用官方提供的DM8驱动连接数据库 步骤: 安装DM8的…

    C# 2023年6月3日
    00
  • C#中DataBindings用法实例分析

    下面是C#中DataBindings用法实例分析的完整攻略。 什么是DataBindings? DataBindings是C#中一个非常重要的概念,它允许我们将数据直接绑定到控件上,以实现数据与UI界面之间的交互。使用DataBindings可以大大简化我们编写程序的工作量,提高开发效率。 使用DataBindings的步骤 使用DataBindings主要…

    C# 2023年5月31日
    00
  • WPF 调用 ECAN 发送数据会阻塞的解决过程

    接了个活, 写个 WPF 上位机用 PCAN 或 ECAN 和单片机通讯, 读取传感器数据. 程序逻辑是 : 选择连接类型 PCAN / ECAN, 选择波特率, 选择通道号, 输入查询间隔, 连接设备. 然后开启一个后台线程循环发送读取指令逐个读取传感器数据. 使用 PCAN 时, 连接和收发数据都正常, 但改为 ECAN 连接后, 有很大几率卡在 SDK…

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