分享

python 中的MQTT模块 mqtt

 大傻子的文渊阁 2022-11-14
  • 简介:
    MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。
    mqtt是一个轻量级的通讯模块,通过发布与订阅的方式,实现了信息的传输,MQTT是机器对机器(M2M)/物联网(IoT)连接协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器到机器”(M2M)或物联网(IoT)世界的连接设备,以及带宽和电池功率非常高的移动应用的理想选择。例如,它已被用于通过卫星链路与代理通信的传感器、与医疗服务提供者的拨号连接,以及一系列家庭自动化和小型设备场景。它也是移动应用的理想选择,因为它体积小,功耗低,数据包最小,并且可以有效地将信息分配给一个或多个接收器。

  • 特点
    开放消息协议,简单易实现
    发布订阅模式,一对多消息发布
    基于TCP/IP网络连接,提供有序,无损,双向连接。
    1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。
    消息QoS支持,可靠传输保证

在python中使用到mqtt进行相关的操作可以用在平台操作,接收相关的mqtt指令和进行相关的处理。在实际的使用中可以通过安装paho-mqtt模块来实现mqtt的导入。
其中的主要操作是:连接mqtt服务器,订阅和发布
这里的前提是有一个mqtt服务器,能够供我们登陆,订阅和发布
mqtt服务器的问题太过复杂,这里不再说明,只是说以下的相关操作是建立在有一个mqtt服务器的基础上的。
mqtt登陆:也可以理解为开启一个mqtt客户端,需要有客户端id,域名,端口号,账号,密码
这些配置信息可以写在一个config.py程序里,以供引入。而且还要一个好处:在一个通过tkinter创建一个 界面时,通过按钮(button)触发mqtt的登录订阅发布,在登录时,需要在界面子程序定义在何时调用MQTT,但是在发布和订阅时又需要修改TOPIC和相关的data,这些参数是不同的,所以需要在界面程序中修改这些内容,如果要mqtt知道就需要在这里引入,这就出问题了,出现了循环引入,(mqtt.py引入views.py,views.py又要引入mqtt.py)所以,需要把mqtt需要的参数写在config.py中,这样就可以解决该问题了。
安装paho-mqtt

pip install paho-mqtt

关于MQTT的模块定义:

import paho.mqtt.client as mqtt
import json
import time
import threading
import config

def on_connect(client, userdata, flags, rc):
    print("Connected with result code "+str(rc))
    client.subscribe(config.TOPICSub)


def on_message(client, userdata, msg):
    strMsg = str(msg.payload.decode('utf-8'))
    # print("主题:"+msg.topic+" 消息:"+str(msg.payload.decode('utf-8')))
    print("主题:" + msg.topic + " 消息:" + strMsg)
    train(strMsg)
    return strMsg


def on_subscribe(client, userdata, mid, granted_qos):
    print("On Subscribed: qos = %d" % granted_qos)


def on_disconnect(client, userdata, rc):
    if rc != 0:
        print("Unexpected disconnection %s" % rc)

def train(Msg):
    print('收到mqtt消息',Msg)

data = config.TOPICSub

param = json.dumps(data)
client = mqtt.Client(config.CLIENTID0)

def mqttPublish(param):

    client.publish(config.TOPICPub,payload=param,qos=0)

def mqttSubcribe(Topic):
    #订阅  取消订阅一个再订阅一个
    client.unsubscribe(config.TOPICSub)
    config.TOPICSub = Topic
    time.sleep(0.1)
    client.subscribe(config.TOPICSub,qos=0)

def mqttCommunication():
    #client = mqtt.Client(config.CLIENTID0)
    client.username_pw_set(config.USERNAME0, config.PASSWD0)
    client.on_connect = on_connect
    client.on_message = on_message
    client.on_subscribe = on_subscribe
    client.on_disconnect = on_disconnect
    client.connect(config.HOST0, config.PORT0, 60)
    client.loop_start()

def main():

    mqttThread = threading.Thread(target=mqttCommunication)
    mqttThread.start()
    time.sleep(1)
    publishThread = threading.Thread(target=mqttPublish,args=(param,))
    publishThread.start()

if __name__ == '__main__':
    main()

config.py

HOST0 = "xxx.xxx.xxx.xxx"
PORT0 = 1883
CLIENTID0 = "ee071f3b-a01c-4237-8d1e-52fe0e5e32d9"
USERNAME0 = "tl/lcy/xxx"
PASSWD0 = "123456"
TOPICSub = "/tl/lcy/test/p1"
TOPICPub = "/tl/lcy/test/p2"
data = '12345'

公司的服务器,在这里就不暴露更多信息了,
在这里使用中使用了loop_start
在connect*()之前或之后调用loop_start()一次,会在后台运行一个线程来自动调用loop()。这释放了可能阻塞的其他工作的主线程。这个调用也处理重新连接到代理。
调用loop_stop()来停止后台线程。
对于loop_forever(),这样是有问题的,会一直阻塞在这里,再进行订阅和发布就出问题了,所以loop_forever还是慎用。
其他详细的描述也可以看该文章:
CSDN文章,介绍paho-mqtt的
简书博客中的文章,简介MQTT的

至于搭建一个MQTT 服务器(broker),可以通过EMQ的方式做,从哔哩哔哩看过一个从头搭建的,只不过只是入门级的,后续的插件使用,比如添加用户名密码的没有涉及,所以我觉得应该需要写一下那些部分。
http://docs./cn/broker/latest/advanced/plugins.html#插件列表
从该插件列表中可以查看到关于添加用户名和密码的添加方式,后续可以进行相关的操作

突然发现B站有好多关于编程的视频,是不是发现了新大陆。物联网MQTT的也有不少

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多