主要记录初次接触树莓派和MQTT的一些操作。
以下操作都是在root账号下的命令记录,如何开启树莓派的root账号,参考这篇文章:树莓派启用root账号
1. 树莓派上安装Mosquitto
参考官方文档:Mosquitto Debian 仓库,可直接apt-get安装。
apt-get 安装过程中,提示依赖错误:
apt-get install mosquitto
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
有一些软件包无法被安装。如果您用的是 unstable 发行版,这也许是
因为系统无法达到您要求的状态造成的。该版本中可能会有一些您需要的软件
包尚未被创建或是它们已被从新到(Incoming)目录移出。
下列信息可能会对解决问题有所帮助:
下列软件包有未满足的依赖关系:
mosquitto : 依赖: libssl1.0.0 (>= 1.0.0) 但无法安装它
依赖: libwebsockets3 (>= 1.2) 但无法安装它
E: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系。
解决方案参考:https://github.com/eclipse/mosquitto/issues/529#issuecomment-331590876
wget http://security-cdn.debian.org/debian-security/pool/updates/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u11_armhf.deb
wget http://ftp.nz.debian.org/debian/pool/main/libw/libwebsockets/libwebsockets3_1.2.2-1_armhf.deb
dpkg -i libssl1.0.0_1.0.1t-1+deb8u11_armhf.deb
dpkg -i libwebsockets3_1.2.2-1_armhf.deb
apt-get install mosquitto mosquitto-clients
如果执行上面的命令失败,可以直接访问http://security-cdn.debian.org/debian-security/pool/updates/main/o/openssl/,查找最新的openssl
访问http://ftp.nz.debian.org/debian/pool/main/libw/libwebsockets/,查找最新的websockets
替换命令中的对应安装包,即可完成安装
2. PC端安装Mosquitto服务
访问官网:https://mosquitto.org/
下载页有windows安装包https://mosquitto.org/download/,写作本文时最新的是1.6.3版本
下载符合你的windows系统的对应安装文件,一路Next即可安装。
默认安装在
C:\Program Files\mosquitto
双击 mosquitto.exe可运行
3. 初次进行MQTT通信
-------------------------角色------------------------------IP地址-----------------端口-------------
windowsPC--------MQTT消息转发服务器-------192.168.43.131----1883------------
windowsPC--------MQTT消息发布者--------------192.168.43.131----1883-----------
树莓派---------------MQTT消息订阅者--------------192.168.43.100----1883-----------
3.1 windowsPC启动Mosquitto服务
cd C:\Program Files\mosquitto
C:\Program Files\mosquitto>mosquitto.exe -v
1561059204: mosquitto version 1.6.3 starting
1561059204: Using default config.
1561059204: Opening ipv6 listen socket on port 1883.
1561059204: Opening ipv4 listen socket on port 1883.
3.2 树莓派启动MosquittoSub,获取该消息
mosquitto_sub -v -t gpio -h 192.168.43.131
执行上面的命令启动后,mosquitto就可以输入获取消息的指令了。
gpio {"index":17, "value":0}
3.3 windowsPC启动MosquittoPub,发布对应消息,树莓派就会收到该消息
windows PC,命令行
cd C:\Program Files\mosquitto
C:\Program Files\mosquitto>mosquitto_pub -t gpio -h 192.168.43.131 -m "{\"pin\":17,\"value\":0}"
C:\Program Files\mosquitto>mosquitto_pub -t gpio -h 192.168.43.131 -m "{\"pin\":17,\"value\":1}"
C:\Program Files\mosquitto>mosquitto_pub -t gpio -h 192.168.43.131 -m "{\"pin\":17,\"value\":0}"
C:\Program Files\mosquitto>mosquitto_pub -t gpio -h 192.168.43.131 -m "{\"pin\":17,\"value\":1}"
C:\Program Files\mosquitto>mosquitto_pub -t gpio -h 192.168.43.131 -m "{\"pin\":17,\"value\":0}"
树莓派,显示收到
gpio {"index":17, "value":0}
gpio {"pin":17,"value":0}
gpio {"pin":17,"value":1}
gpio {"pin":17,"value":0}
gpio {"pin":17,"value":1}
gpio {"pin":17,"value":0}
所以,只要PC端的Pub一直推送消息给PC端的转发服务器,树莓派就能够不断收到相应的订阅消息。
4 第一次总结
4.1 上面在做什么
首先了解发布者和订阅者的含义,发布者是消息的发出者,或者是指令的发出者,订阅者是被动接受消息或者指令的。上文就是一个例子:PC端作为发布者发出指令,树莓派作为订阅者,当收到PC端的指令时,执行该指令的相关动作。
然后了解MQTT代理服务的含义,他就是一个平台的概念。好比QQ聊天,你和你的朋友的QQ并不会随时都登陆,但是腾讯的QQ服务器是一直在工作的。你QQ上线后,将朋友的QQ设置为特别关注对象,当他上线时就要提醒你。这就跟我们刚才的实验一样。PC端的消息转发服务器,就是腾讯的QQ服务器,树莓派就是你的QQ,已经上线了。PC端的发布者客户端,就是朋友的QQ,他随时可能上线,只要发消息给了PC端的消息转发服务器,你的树莓派订阅了,就可以收到该消息。
补充知识:
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,功能类似8051的P0—P3,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。https://baike.baidu.com/item/gpio/4723219?fr=aladdin
5.扩展,用python接收MQTT消息,控制GPIO
5.1 安装 python的 MQTT扩展库
pip install paho-mqtt
5.1 借助MQTT扩展库和树莓派的GPIO库,编写下面的python代码,保存到testgpio.py中
# -*- coding: utf-8 -*-
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
import json
# BCM GPIO编号
pins = [17,18,27,22,23,24,25,4]
def gpio_setup():
# 采用BCM编号
GPIO.setmode(GPIO.BCM)
# 设置所有GPIO为输出状态,且输出低电平
for pin in pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
def gpio_destroy():
for pin in pins:
GPIO.output(pin, GPIO.LOW)
GPIO.setup(pin, GPIO.IN)
# 连接成功回调函数
def on_connect(client, userdata, flags, rc):
print("Connected with result code " + str(rc))
# 连接完成之后订阅gpio主题
client.subscribe("gpio")
# 消息推送回调函数
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
# 获得负载中的pin 和 value
gpio = json.loads(str(msg.payload))
if gpio['pin'] in pins:
if gpio['value'] == 0:
GPIO.output(gpio['pin'], GPIO.LOW)
else:
GPIO.output(gpio['pin'], GPIO.HIGH)
if __name__ == '__main__':
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
gpio_setup()
try:
# 请根据实际情况改变MQTT代理服务器的IP地址
client.connect("192.168.1.131", 1883, 60)
client.loop_forever()
except KeyboardInterrupt:
client.disconnect()
gpio_destroy()
5.2 在PC端发出消息,控制树莓派GPIO 17的高电平低电平
5.2.1 树莓派启动我们的python代码
python testgpio.py
testgpio.py:13: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
GPIO.setup(pin, GPIO.OUT)
Connected with result code 0
5.2.2 PC端输入GPIO指令
C:\Program Files\mosquitto>mosquitto_pub -h 192.168.43.131 -t gpio -m "{\"pin\":17,\"value\":0}"
C:\Program Files\mosquitto>mosquitto_pub -t gpio -h 192.168.43.131 -m "{\"pin\":17,\"value\":1}"
5.2.3 树莓派上输出接收到对GPIO 17的指令
gpio {"pin":17,"value":0}
gpio {"pin":17,"value":1}
网友评论