在 Python 中使用 MQTT的方法
Python是一种广泛使用的解释型、高级编程、通用型编程语言。Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进划分代码块,而非使用大括号或者关键词)。Python让开发者能够用更少的代码表达想法,不管是小型还是大型程序,该语言都试图让程序的结构清晰明了。
MQTT是一种基于发布/订阅模式的轻量级物联网消息传输协议,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。
本文主要介绍如何在Python项目中使用paho-mqtt客户端库,实现客户端与MQTT服务器的连接、订阅、取消订阅、收发消息等功能。
项目初始化
本项目使用Python3.6进行开发测试,读者可用如下命令确认Python的版本。
➜~python3--version Python3.6.7
选择MQTT客户端库
paho-mqtt是目前Python中使用较多的MQTT客户端库,它在Python2.7或3.x上为客户端类提供了对MQTTv3.1和v3.1.1的支持。它还提供了一些帮助程序功能,使将消息发布到MQTT服务器变得非常简单。
Pip安装PahoMQTT客户端
Pip是Python包管理工具,该工具提供了对Python包的查找、下载、安装、卸载的功能。
pip3install-ihttps://pypi.doubanio.com/simplepaho-mqtt
PythonMQTT使用
连接MQTT服务器
本文将使用EMQX提供的免费公共MQTT服务器,该服务基于EMQX的MQTT物联网云平台创建。服务器接入信息如下:
- Broker:broker.emqx.io
- TCPPort:1883
- WebsocketPort:8083
导入PahoMQTT客户端
frompaho.mqttimportclientasmqtt_client
设置MQTTBroker连接参数
设置MQTTBroker连接地址,端口以及topic,同时我们调用Pythonrandom.randint函数随机生成MQTT客户端id。
broker='broker.emqx.io' port=1883 topic="/python/mqtt" client_id=f'python-mqtt-{random.randint(0,1000)}'
编写MQTT连接函数
编写连接回调函数on_connect,该函数将在客户端连接后被调用,在该函数中可以依据rc来判断客户端是否连接成功。通常同时我们将创建一个MQTT客户端,该客户端将连接到broker.emqx.io。
defconnect_mqtt(): defon_connect(client,userdata,flags,rc): ifrc==0: print("ConnectedtoMQTTBroker!") else: print("Failedtoconnect,returncode%d\n",rc) #SetConnectingClientID client=mqtt_client.Client(client_id) client.on_connect=on_connect client.connect(broker,port) returnclient
发布消息
首先定义一个while循环语句,在循环中我们将设置每秒调用MQTT客户端publish函数向/python/mqtt主题发送消息。
defpublish(client): msg_count=0 whileTrue: time.sleep(1) msg=f"messages:{msg_count}" result=client.publish(topic,msg) #result:[0,1] status=result[0] ifstatus==0: print(f"Send`{msg}`totopic`{topic}`") else: print(f"Failedtosendmessagetotopic{topic}") msg_count+=1
订阅消息
编写消息回调函数on_message,该函数将在客户端从MQTTBroker收到消息后被调用,在该函数中我们将打印出订阅的topic名称以及接收到的消息内容。
defsubscribe(client:mqtt_client): defon_message(client,userdata,msg): print(f"Received`{msg.payload.decode()}`from`{msg.topic}`topic") client.subscribe(topic) client.on_message=on_message
完整代码
消息发布代码
#python3.6 importrandom importtime frompaho.mqttimportclientasmqtt_client broker='broker.emqx.io' port=1883 topic="/python/mqtt" #generateclientIDwithpubprefixrandomly client_id=f'python-mqtt-{random.randint(0,1000)}' defconnect_mqtt(): defon_connect(client,userdata,flags,rc): ifrc==0: print("ConnectedtoMQTTBroker!") else: print("Failedtoconnect,returncode%d\n",rc) client=mqtt_client.Client(client_id) client.on_connect=on_connect client.connect(broker,port) returnclient defpublish(client): msg_count=0 whileTrue: time.sleep(1) msg=f"messages:{msg_count}" result=client.publish(topic,msg) #result:[0,1] status=result[0] ifstatus==0: print(f"Send`{msg}`totopic`{topic}`") else: print(f"Failedtosendmessagetotopic{topic}") msg_count+=1 defrun(): client=connect_mqtt() client.loop_start() publish(client) if__name__=='__main__': run()
消息订阅代码
#python3.6 importrandom importtime frompaho.mqttimportclientasmqtt_client broker='broker.emqx.io' port=1883 topic="/python/mqtt" #generateclientIDwithpubprefixrandomly client_id=f'python-mqtt-{random.randint(0,1000)}' defconnect_mqtt(): defon_connect(client,userdata,flags,rc): ifrc==0: print("ConnectedtoMQTTBroker!") else: print("Failedtoconnect,returncode%d\n",rc) client=mqtt_client.Client(client_id) client.on_connect=on_connect client.connect(broker,port) returnclient defpublish(client): msg_count=0 whileTrue: time.sleep(1) msg=f"messages:{msg_count}" result=client.publish(topic,msg) #result:[0,1] status=result[0] ifstatus==0: print(f"Send`{msg}`totopic`{topic}`") else: print(f"Failedtosendmessagetotopic{topic}") msg_count+=1 defrun(): client=connect_mqtt() client.loop_start() publish(client) if__name__=='__main__': run() 消息订阅代码 #python3.6 importrandom frompaho.mqttimportclientasmqtt_client broker='broker.emqx.io' port=1883 topic="/python/mqtt" #generateclientIDwithpubprefixrandomly client_id=f'python-mqtt-{random.randint(0,100)}' defconnect_mqtt()->mqtt_client: defon_connect(client,userdata,flags,rc): ifrc==0: print("ConnectedtoMQTTBroker!") else: print("Failedtoconnect,returncode%d\n",rc) client=mqtt_client.Client(client_id) client.on_connect=on_connect client.connect(broker,port) returnclient defsubscribe(client:mqtt_client): defon_message(client,userdata,msg): print(f"Received`{msg.payload.decode()}`from`{msg.topic}`topic") client.subscribe(topic) client.on_message=on_message defrun(): client=connect_mqtt() subscribe(client) client.loop_forever() if__name__=='__main__': run()
测试
消息发布
运行MQTT消息发布代码,我们将看到客户端连接成功,并且成功将消息发布。
python3pub.py
消息订阅
运行MQTT消息订阅代码,我们将看到客户端连接成功,并且成功接收到发布的消息。
python3sub.py
总结
至此,我们完成了使用paho-mqtt客户端连接到公共MQTT服务器,并实现了测试客户端与MQTT服务器的连接、消息发布和订阅。
与C++或Java之类的高级语言不同,Python比较适合设备侧的业务逻辑实现,使用Python您可以减少代码上的逻辑复杂度,降低与设备的交互成本。我们相信在物联网领域Python将会有更广泛的应用。
接下来我们将会陆续发布更多关于物联网开发及Python的相关文章,敬请关注。
以上就是在Python中使用MQTT的方法的详细内容,更多关于Python中使用MQTT的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。