树莓派的MQTT配置

参考文章 MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用

主要记录初次接触树莓派和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

树莓派GPIO定义

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}

你可能感兴趣的:(树莓派的MQTT配置)