python使用MQTT协议发送、订阅消息

一时失言乱红尘 2022-09-11 01:25 610阅读 0赞

python使用MQTT协议发布、订阅消息

1、MQTT简介

MQTT是一个基于客户端-服务器消息发布/订阅传输协议

一种数据传输协议,不怎么耗资源,适合物联网远程传数据。MQTT工作在 TCP/IP 协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 (服务器)。

比如一个传感器要发数据给电脑,那么需要开一个mqtt服务器(Broker),然后传感器作为客户端(client)通过mqtt服务器发布(publish)某个主题(topic)的消息(message),电脑也作为客户端,连接(connect)到mqtt服务器,且订阅(subscribe)该主题,就能收到消息。

在这里插入图片描述

2、下载MQTT服务器

官网下载

windows下安装:

  1. 下载 emqx-windows-4.3.8.zip ,解压
  2. 命令行下进入解压路径,启动 emqx

    常用命令:

    1. 进入bin目录,启动服务器
    2. emqx.cmd start
    3. 进入bin目录,关闭服务器
    4. emqx.cmd stop

linux下Ubuntu安装:

  1. 下载 emqx-ubuntu18.04-4.3.8-amd64.zip

    wget https://www.emqx.com/zh/downloads/broker/4.3.8/emqx-ubuntu18.04-4.3.8-amd64.zip

  2. 安装

    unzip emqx-ubuntu18.04-4.3.8-amd64.zip

  3. 运行

    ./bin/emqx start

常用命令:

  1. 启动命令:./bin/emqttd start
  2. 关闭命令:./bin/emqttd stop
  3. 控制台调试模式启动,检查 EMQ 是否可正常启动
  4. ./bin/emqttd console

后台管理

浏览器打开http://127.0.0.1:18083

  1. 账号 admin
  2. 密码 public

3、python使用例子

发布消息

pub.py

  1. import random
  2. import time
  3. from paho.mqtt import client as mqtt_client
  4. topic = 'python_mqtt' # 发布的主题,订阅时需要使用这个主题才能订阅此消息
  5. # 随机生成一个客户端id
  6. client_id = 'python-mqtt-{}'.format(random.randint(0, 1000))
  7. def connect_mqtt():
  8. #连接mqtt服务器
  9. def on_connect(client, userdata, flags, rc):
  10. if rc == 0:
  11. print("Connected to MQTT Broker!")
  12. else:
  13. print("Failed to connect, return code %d\n", rc)
  14. client = mqtt_client.Client(client_id)
  15. client.on_connect = on_connect
  16. # broker = 'broker.emqx.io'
  17. # port = 1883
  18. # client.connect(broker, port)
  19. client.connect(host='127.0.0.1', port=1883)
  20. return client
  21. def publish(client):
  22. # 发布消息
  23. msg_count = 0
  24. while True:
  25. time.sleep(1)
  26. msg = '这是客户端发送的第{}条消息'.format(msg_count)
  27. result = client.publish(topic, msg)
  28. status = result[0]
  29. if status == 0:
  30. print('第{}条消息发送成功'.format(msg_count))
  31. else:
  32. print('第{}条消息发送失败'.format(msg_count))
  33. msg_count += 1
  34. def run():
  35. client = connect_mqtt()
  36. client.loop_start()
  37. publish(client)
  38. if __name__ == '__main__':
  39. run()

订阅消息

sub.py

  1. import random
  2. from paho.mqtt import client as mqtt_client
  3. topic = "python_mqtt"
  4. client_id = 'python-mqtt-{}'.format(random.randint(0, 100))
  5. def connect_mqtt() -> mqtt_client:
  6. # 连接MQTT服务器
  7. def on_connect(client, userdata, flags, rc):
  8. if rc == 0:
  9. print("Connected to MQTT Broker!")
  10. else:
  11. print("Failed to connect, return code %d\n", rc)
  12. client = mqtt_client.Client(client_id)
  13. client.on_connect = on_connect
  14. # broker = 'broker.emqx.io'
  15. # port = 1883
  16. # client.connect(broker, port)
  17. client.connect(host='127.0.0.1', port=1883)
  18. return client
  19. def subscribe(client: mqtt_client):
  20. def on_message(client, userdata, msg):
  21. data = msg.payload.decode()
  22. print('订阅【{}】的消息为:{}'.format(msg.topic, data))
  23. client.subscribe(topic)
  24. client.on_message = on_message
  25. def run():
  26. client = connect_mqtt()
  27. subscribe(client)
  28. client.loop_forever()
  29. if __name__ == '__main__':
  30. run()

可以启动多个订阅客户端,都能接收到同样的发布消息

在这里插入图片描述

后记

【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。

也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!

公众号

公众号

关注我,我们一起成长~~

发表评论

表情:
评论列表 (有 0 条评论,610人围观)

还没有评论,来说两句吧...

相关阅读