计算机网络编程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#对Xamarin框架进行数据绑定

    请听我详细讲解” C#对Xamarin框架进行数据绑定”的完整攻略。 1. 什么是Xamarin框架 Xamarin是一款允许使用C#语言来进行开发跨平台移动应用程序的开发框架,可直接使用Xamarin工具包进行iOS,Android,和Windows Phone应用的开发。 2. 使用数据绑定 2.1 简介 数据绑定是Xamarin中一种独特的将数据从一个…

    C# 2023年6月3日
    00
  • ASP.NET MVC实现横向展示购物车

    以下是ASP.NET MVC实现横向展示购物车的完整攻略: 首先,我们需要创建一个MVC项目。在Visual Studio中,选择“新建项目”,然后选择“ASP.NET Web应用程序(.NET Framework)”。在下一个窗口中,选择“MVC”模板,然后点击“创建”。 接下来,我们需要创建一个购物车模型。在Models文件夹中,创建一个名为“Shopp…

    C# 2023年5月12日
    00
  • c#实现字符串反序输出字符串的实例

    下面是”C#实现字符串反序输出字符串的实例”的完整攻略。 1. 理解题意 题目要求我们实现字符串反序输出,例如将字符串”sda luoht ro eht fo noitseuq si gnidaer pots”变成”stop reading is quest ion of the heart a loud ads”。那么我们需要处理出字符串的字符顺序,再将其…

    C# 2023年6月7日
    00
  • C#使用Task实现执行并行任务的原理的示例详解

    下面就来详细讲解如何使用C#的Task库实现并行执行任务的原理及示例。 什么是Task Task是.NET Framework 4.5及以上版本中新增的一个库,它的主要作用是提供一种方便、高效的方式来管理并发和异步编程相关的任务。相比较于自行利用Thread和ThreadPool管理线程,使用Task可以更方便地控制异步任务,并且能够支持更多种的异步模型。 …

    C# 2023年5月15日
    00
  • C#实现无限级联下拉列表框

    下面是详细讲解“C#实现无限级联下拉列表框”的完整攻略: 1.准备工作 首先,我们需要在C#中创建一个Windows Forms应用程序。然后,在程序中创建一个ComboBox控件,作为第一级下拉列表框。同时,我们还需要准备一个数据表,用于存储下拉列表框的数据源。 2.绑定数据源 接下来,我们需要将数据表绑定到ComboBox控件中,这里可以使用DataSo…

    C# 2023年5月31日
    00
  • ASP.NET Core MVC 从入门到精通之数据库

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年5月5日
    00
  • C#中如何为枚举类型添加描述方法【小技巧】

    要为C#中的枚举类型添加描述方法,可以采用以下方法: 1.使用System.ComponentModel.DescriptionAttribute类 using System.ComponentModel; public enum Gender { [Description("男性")] Male, [Description("…

    C# 2023年6月6日
    00
  • C#使用Lambda表达式简化代码的示例详解

    这里是C#使用Lambda表达式简化代码的示例详解。 Lambda表达式简介 Lambda表达式是C# 3.0 中引入的一种新的语法特性,广泛用于简化代码,特别是在LINQ查询和事件处理中。Lambda表达式可以看作是一种匿名函数,它不需要方法名,可以在其他方法中定义,非常方便。Lambda表达式的语法形式为: (parameters) => expr…

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