本博文介绍采用Thonny+MicroPython和umqtt.simple库MQTTClient类的对象方法编制树莓派Pico W无线开发板MQTT协议通信程序,将Pico W无线开发板、电脑或Android手机无线连接到远程MQTT服务器,给出采用电脑MQTTX应用程序及手机Android MQTT客户端App远程控制Pico W无线开发板板载LED灯和扩展LED灯亮灭的示例程序。
1.安装micropython-umqtt.simple库
假设树莓派Pico W无线开发板已事先安装好MicroPython固件并且设置好了Pico W无线开发板的Thonny IDE开发环境。Pico W无线开发板具体使用方法可参见本博主博文“树莓派Pico W无线WiFi开发板使用方法及MicroPython网络编程实践”。
这里以Windows为例,运行Thonny,依次点击[Tools]→[Manage Packages…]显示“Manage Package for Raspberry Pico”对话框,在编辑框输入“umqtt.simple”且点击[Search on PyPI] umqtt.simple库,如图1所示。
图1
选取[micropython-umqtt.simple],点击[Install]按钮安装micropython-umqtt.simple库,如图2所示。
图2
micropython-umqtt.simple成功安装后,umqtt.simple库将存放于树莓派Pico W无线开发板的lib文件夹中。
2. 树莓派Pico W无线开发板硬件接口扩展一只LED发光二极管
(1)所需硬件材料清单
•Pico W无线开发板×1;
•Micro-USB数据线×1;
•470Ω电阻×1;
•面包板×1;
•LDE二极管×1;
•杜邦线×2。
(2) Pico W无线开发板硬件接口扩展一只LED接口电路
Pico W无线开发板硬件接口GPIO信号引脚排列如图3所示。
图3
这里使用Pico W无线开发板的GPIO15引脚 (Pin20物理引脚) 扩展一只LED,即Pico W无线开发板Pin20物理引脚可与470Ω~1kΩ的电阻R和LED器件D串联后接地,其硬件接口电路原理图如图4所示。
图4
图4所对应的硬件接线外观图如图5所示。
图5
3. 树莓派Pico W无线开发板MQTT协议通信MicroPython程序示例
将Pico W作为客户端实现基于MQTT协议的通信,需用到umqtt.simple库中的MQTTClient类。树莓派Pico W无线开发板设备端通过WiFi连接到MQTT服务器的MQTT MicroPython程序清单如下:
# Filename: pico_w_mqtt.py
import network
from umqtt.simple import MQTTClient
import time
from machine import Pin
station = network.WLAN(network.STA_IF)
station.active(True)
station.connect("用户使用的WiFi名称","用户使用的WiFi密码")
time.sleep(8)
led_onBoard = machine.Pin("LED",machine.Pin.OUT)
led_onBoard.value(0)
led_external = Pin(15, Pin.OUT)
led_external.value(0)
BrokerAddr = 'test.mosquitto.org' # 指定的MQTT服务器: test.mosquitto.org
# 其他的MQTT服务器:broker.hivemq.com, mqtt.p2hp.com等
mqttPort = 1883 # 1883为指定的MQTT服务器端口号
ClientID = "Pico_W" # 设定PICO_W为Pico W开发板设备ID
Topic = "LED" # 设定MQTT主题为LED
def sub_callback(topic, msg):
topic = str(topic,'utf-8')
msg = str(msg,'utf-8')
command= msg.strip()
print((topic, command)) # 显示主题和命令消息
if command == "开灯": # "开灯"命令消息
led_onBoard.value(1)
led_external.value(1)
if command == "关灯": # "关灯"命令消息
led_onBoard.value(0)
led_external.value(0)
# 将Pico W开发板连接到指定的MQTT服务器
mqttClient = MQTTClient(ClientID, BrokerAddr, mqttPort, keepalive = 300)
mqttClient.set_callback(sub_callback)
mqttClient.connect()
mqttClient.publish("MQTT_Test", "Start", qos = 0)
mqttClient.subscribe(Topic, qos = 0) # Pico W开发板订阅主题
print("Ok")
while True:
mqttClient.wait_msg()
time.sleep(1)
以上pico_w_mqtt.py程序与MQTT协议通信相关的语句大多已添加注释,这里不再多做解释。将树莓派Pico W无线开发板连接到电脑,启动Thonny IDE (假设Pico W无线开发板的开发环境已事先设置成功),在Thonny编辑器窗口复制粘贴本程序。
4.测试树莓派Pico W无线开发板MQTT协议通信程序
(1)使用电脑客户端MQTTX应用程序远程控制Pico W无线开发板LED灯的亮灭
电脑客户端MQTTX应用程序可从 https://mqttx.app
网址下载,这里下载Windows版本MQTTX应用程序,下载后直接将其安装到电脑即可。
下面我们运行前面的Pico W无线开发板pico_w_mqtt.py程序,当Pico W无线开发板成功连接到WLAN和远程MQTT服务器后,Thonny的Shell窗口将显示”Ok”字符串信息,表明远程MQTT服务器连接成功,如图6所示。
图6
接下来,运行MQTTX程序,选取[MQTT Connections]设置电脑客户端MQTT登录信息,这里将MQTT服务器(Host)设置为test.mosquitto.org,端口号(Port)设置为1883,电脑客户端名称(Name)设置为Pico_W_MQTT_Test,客户端ID设置为Test_1,还可设置可选的用户名(Username)及密码(Password)。点击[Connect]按钮连接远程MQTT服务器。远程MQTT服务器连接成功后,在消息的主题(Topic)编辑框输入“LED”,在消息的正文(payload)编辑框输入“开灯”命令,如图7所示。
图7
在图中点击右下角的[发送]命令按钮后,Pico W无线开发板板载LED和扩展LED均被点亮,如图8所示。
图8
当在消息的正文(payload)编辑框输入“关灯”命令时,Pico W无线开发板板载LED和扩展LED全部熄灭。
(2)使用Android手机客户端MQTTX应用程序远程控制Pico W无线开发板LED灯的亮灭
找一款Android手机MQTT客户端App程序(如MQTT client、MQTT Terminal等Android App),本文下载的是MQTT client_v0.16_apk,将其安装到Android手机,运行手机MQTT客户端程序,见图9所示。
图9
下面设置手机设备端MQTT登录信息,这里将MQTT服务器和端口号设置为test.mosquitto.org:1883,设备ID设置为手机的设备ID,这里设置为My_Android,接下来设置用户名及密码,设置完成后,按[登录]按钮,如图10所示。
图10
根据前面介绍的在Pico W无线开发板上执行的pico_w_mqtt.py程序可知,我们使用的主题为”LED”,消息为”开灯”或”关灯” 命令字符串,这里将手机MQTT客户端程序要发布的主题设置为”LED”,如图11所示。
图11
在手机MQTT客户端程序中,按[消息]按钮并输入”开灯”消息命令后,,我们将看到Pico W无线开发板板载LED和扩展LED灯均被点亮。
下面对手机远程控制Pico W无线开发板板载LED和扩展LED亮灭的MQTT通信过程做简要说明。
手机和Pico W都连接到同一个远程MQTT服务器。当Pico W无线开发板中的pico_w_mqtt.py程序执行成功后,开发板订阅的主题为“LED”、消息为”开灯”或”关灯”命令; 当手机客户端发布主题也为”LED”并在手机设备输入”开灯” 命令消息时,手机向远程MQTT服务器发送”LED”主题和”开灯”命令消息,MQTT服务器将”LED”主题和”开灯”命令消息发送到所有连接到该MQTT服务器上的设备,远程的Pico W无线开发板只有接收到”LED”主题和”开灯” 消息后,将在1秒后点亮板载蓝色LED灯和扩展硬件的红色LED灯,当输入”关灯”消息命令后,板载蓝色LED小灯和扩展硬件的红色LED灯将熄灭。
程序调试无误后,我们还可把pico_w_mqtt.py程序文件烧写到Pico W无线开发板的Flash中,将Pico W无线开发板外接5V电源即可独立运行。
除了使用本文介绍的电脑MQTT客户端应用程序和Android手机MQTT客户端App与远程的Pico W无线开发板进行MQTT协议通信外,我们还可针对各种应用场景开发专用的电脑、Android手机等MQTT客户端应用程序。
参考文献:
袁志勇 编著. 《AI嵌入式系统技术与实践-基于树莓派RP2040和MicroPython》. 北京: 北京航空航天大学出版社, 2023年4月第1版。
发布日期:2023年05月01日