Python是一种广泛使用的解释型、高级编程、通用编程语言。Python的设计理念强调代码的可读性和简洁的语法(尤其是使用空格来缩进代码块,而不是花括号或关键字)。Python允许开发人员用更少的代码表达他们的想法,并且该语言试图使程序的结构清晰明了,无论是小程序还是大程序。1MQTT是一种基于发布/订阅模型的轻量级物联网消息传输协议。它可以用很少的代码和带宽为联网设备提供实时可靠的消息服务。广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。本文主要介绍如何在Python项目中使用paho-mqtt客户端库,实现客户端与MQTT服务端的连接、订阅、取消订阅、收发消息等功能。项目初始化本项目使用Python3.6进行开发和测试。读者可以使用以下命令来确认Python的版本。?~python3--versionPython3.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-mqttPythonMQTT用于连接MQTT服务器本文将使用EMQX提供的免费公共MQTT服务器,该服务器基于EMQX的MQTT物联网云平台创建.服务器访问信息如下:Broker:broker.emqx.ioTCPPort:1883WebsocketPort:8083ImportPahoMQTTclientfrompaho.mqttimportclientasmqtt_client设置MQTTBroker连接参数设置MQTTBroker连接地址、端口和主题,我们调用Pythonrandom.randint函数随机生成一个MQTT客户端id。broker='broker.emqx.io'port=1883topic="/python/mqtt"client_id=f'python-mqtt-{random.randint(0,1000)}'写MQTT连接函数写连接回调函数on_connect,这个函数它将在客户端连接后被调用。在这个函数中可以根据rc判断客户端是否连接成功。通常我们会同时创建一个连接到broker.emqx.io的MQTT客户端。defconnect_mqtt():defon_connect(client,userdata,flags,rc):ifrc==0:print("ConnectedtoMQTTBroker!")else:print("Failedtoconnect,returncode%d\n",rc)#设置连接客户端IDclient=mqtt_client.Client(client_id)client.on_connect=on_connectclient.connect(broker,port)returnclientpublishesamessage首先定义一个while循环语句,在循环中我们将MQTT客户端设置为每秒调用客户端的发布函数向/python/mqtt主题发送消息。defpublish(client):msg_count=0whileTrue:time.sleep(1)msg??=f"消息:{msg_count}"result=client.publish(topic,msg)#result:[0,1]status=result[0]ifstatus==0:print(f"发送`{msg}`到主题`{topic}`")else:print(f"Failedtosendmessagetotopic{topic}")msg??_count+=1subscribemessage编写消息回调函数on_message,客户端收到来自MQTTBroker的消息后调用。在这个函数中,我们会打印出订阅的主题名称和接收到的消息内容。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.6importrandomimporttimefrompaho.mqttimportclientasmqtt_clientbroker='broker.emqx.io'port=1883topic="/python/mqtt"#随机生成带有pub前缀的客户端IDclient_id=f'python-mqtt-{random.randint(0,1000)}'defconnect_mqtt():defon_connect(client,userdata,flags,rc):ifrc==0:print("连接到MQTT代理!")else:print("连接失败,返回码%d\n",rc)client=mqtt_client.Client(client_id)client.on_connect=on_connectclient.connect(broker,port)returnclientdefpublish(client):msg_count=0whileTrue:time.sleep(1)msg??=f"messages:{msg_count}"result=client.publish(topic,msg)#结果:[0,1]status=result[0]ifstatus==0:print(f"Send`{msg}`totopic`{topic}`")else:print(f"Failedtosendmessagetotopic{topic}")msg??_count+=1defrun():client=connect_mqtt()client.loop_start()publish(client)if__name__=='__main__':run()消息订阅代码#python3.6importrandomfrompaho.mqttimportclientasmqtt_clientbroker='broker.emqx.io'port=1883topic="/python/mqtt"#随机生成带有pub前缀的客户端IDclient_id=f'python-mqtt-{random.randint(0,100)}'defconnect_mqtt()->mqtt_client:defon_connect(client,userdata,flags,rc):ifrc==0:print("ConnectedtoMQTTBroker!")else:print("连接失败,返回码%d\n",rc)客户端=mqtt_client.Client(client_id)client.on_connect=on_connectclient.connect(broker,port)returnclientdefsubscribe(client:mqtt_client):defon_message(client,userdata,msg):print(f"从`{msg.topic}`主题接收到`{msg.payload.decode()}`")client.subscribe(topic)client.on_message=on_messagedefrun():client=connect_mqtt()subscribe(client)client.loop_forever()if__name__=='__main__':run()测试消息发布运行MQTT消息发布代码,我们会看到客户端连接成功并成功发布消息python3pub.pymessage订阅运行MQTT消息订阅代码,我们会看到客户端连接成功,成功接收到发布的消息。python3sub.py至此,我们就完成了使用paho-mqtt客户端连接公共MQTT服务器,实现了测试客户端与MQTT服务器的连接、消息发布和订阅。与C++或Java等高级语言不同,Python更适合在设备端实现业务逻辑。通过使用Python,可以降低代码的逻辑复杂度,降低与设备交互的成本。我们相信Python会在物联网领域得到更广泛的应用。接下来我们会发布更多关于物联网开发和Python的文章,敬请期待。版权声明:本文为EMQ原创,转载请注明出处。
