【MQTT轻量级物联网消息传输协议】学习笔记

MQTT是一种轻量级物联网消息协议,用于高效地发布和订阅消息。本文介绍了MQTT的基本概念,如订阅、会话、主题名和主题筛选器,并提供了使用Python的paho.mqtt库实现的发布者和消费者示例代码,展示了如何连接到MQTT服务器并进行消息交换。
摘要由CSDN通过智能技术生成
MQTT简介

MQTT 是一种基于发布/订阅模式的轻量级物联网消息传输协议,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务。

MQTT协议中有三种身份:发布者(Publish)、代理(Broker)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。

MQTT中的几个重要名词:

  • 一、订阅(Subscription)
    订阅包含主题筛选器(Topic Filter)和最大服务质量(QoS)。订阅会与一个会话(Session)关联。一个会话可以包含多个订阅。每一个会话中的每个订阅都有一个不同的主题筛选器。
  • 二、会话(Session)
    每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。
  • 三、主题名(Topic Name)
    连接到一个应用程序消息的标签,该标签与服务器的订阅相匹配。服务器会将消息发送给订阅所匹配标签的每个客户端。
  • 四、主题筛选器(Topic Filter)
    一个对主题名通配符筛选器,在订阅表达式中使用,表示订阅所匹配到的多个主题。
  • 五、负载(Payload)
    消息订阅者所具体接收的内容。

可以如此简单理解:所有的用户都能连接服务器,服务器就像一个巨大的公共硬盘,可以存放大量数据。用户A作为发布者时,产生数据的数据会被发布到服务器上,A只管发布,而不在乎谁去接收。假如此时用户B订阅了对应主题的消息,只要B保持在线,就能立即从服务器上收取到该数据,B只管接收,而不在乎数据是谁产生。

mqtt与四层模型

TCP/IP参考模型可以分为四层:应用层、传输层、网络层、链路层。TCP和UDP位于传输层,应用层常见的协议有HTTP、FTP、SSH等。MQTT协议运行于TCP之上,属于应用层协议,因此只要是支持TCP/IP协议栈的地方,都可以使用MQTT。

mqtt_producer.py
# -*- coding: utf-8 -*-
import time
from paho.mqtt import client as mqtt_client

# 使用免费的在线 MQTT 5 服务器
# https://www.emqx.com/zh/mqtt/public-mqtt5-broker
broker = 'broker.emqx.io'  # 连接地址
port = 1883  # 端口
topic = "/python/mqtt"  # 主题
client_id = f'python-mqtt-producer'  # 用户ID


def connect_mqtt():
    def on_connect(client, userdata, flags, rc):  # 回调函数
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def publish(client):
    msg_count = 0
    while True:
        time.sleep(1)
        msg = f"Message num: {msg_count}"
        result = client.publish(topic, msg)  # result返回值为0或1;0为成功,1为失败
        status = result[0]
        if status == 0:
            print(msg)
        else:
            print(f"ERROR")
        msg_count += 1


def run():
    client = connect_mqtt()
    client.loop_start()
    publish(client)


if __name__ == '__main__':
    run()

mqtt_consumer.py
# -*- coding: utf-8 -*-
from paho.mqtt import client as mqtt_client

# 使用免费的在线 MQTT 5 服务器
# https://www.emqx.com/zh/mqtt/public-mqtt5-broker
broker = 'broker.emqx.io'  # 连接地址
port = 1883  # 端口
topic = "/python/mqtt"  # 主题
client_id = f'python-mqtt-consumer'  # 用户ID


def connect_mqtt() -> mqtt_client:
    def on_connect(client, userdata, flags, rc):  # 回调函数
        if rc == 0:
            print("Connected to MQTT Broker!")
        else:
            print("Failed to connect, return code %d\n", rc)

    client = mqtt_client.Client(client_id)
    client.on_connect = on_connect
    client.connect(broker, port)
    return client


def subscribe(client: mqtt_client):
    def on_message(client, userdata, msg):
        print(f"Message body: {msg.payload.decode()}, Topic: {msg.topic}")

    client.subscribe(topic)
    client.on_message = on_message


def run():
    client = connect_mqtt()
    subscribe(client)
    client.loop_forever()


if __name__ == '__main__':
    run()

执行结果

mqtt_producer.py

Connected to MQTT Broker!
Message num: 0
Message num: 1
Message num: 2

mqtt_consumer.py

Connected to MQTT Broker!
Message body: test 3, Topic: /python/mqtt
Message body: Message num: 0, Topic: /python/mqtt
Message body: Message num: 1, Topic: /python/mqtt
Message body: Message num: 2, Topic: /python/mqtt
原文地址
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值