MQTT学习笔记——树莓派MQTT客户端 使用Mosquitto和paho-python
参考路径:https://blog.csdn.net/xukai871105/article/details/39255089
1 0 前言 2 本文说明如何在树莓派上安装Mosquitto。本文通过两个简单的例子说明树莓派中如何使用MQTT协议实现消息订阅,这些例子包括Mosquitto_sub指令实现消息订阅和paho-python扩展库实现GPIO端口的远程控制。本文中使用了两个工具——Mosquitto paho-python,其中Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的消息通信简单易用;另外,paho-python是一个符合MQTT v3.1协议的客户端,paho-python可连接MQTT代理服务器、发布消息、订阅消息和获得推送消息。 3 【相关博文】 4 【MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用】 5 【树莓派学习笔记——索引博文】 6 【树莓派学习笔记——GPIO功能学习】 7 【树莓派学习笔记——RPi.GPIO 流水灯】 8 9 1 在树莓派上安装Mosquitto 10 在树莓派上安装Mosquitto和其他平台类似,如果在树莓派平台直接编译时间可能会稍长些。Mosquitto源代包不大,所以编译时间尚可忍受。 11 1.1 安装 12 截止2014年9月,最新版本为mosquitto-1.3.4。在树莓派中新建一个目录,例如software。 13 # 下载源代码包 14 wget http://mosquitto.org/files/source/mosquitto-1.3.4.tar.gz 15 # 解压 16 tar zxfv mosquitto-1.3.4.tar.gz 17 # 进入目录 18 cd mosquitto-1.3.4 19 # 编译 20 make 21 # 安装 22 sudo make install 23 24 1.2 安装注意点 25 【1】编译找不到openssl/ssl.h 26 【解决方法】——安装openssl 27 sudo apt-get install libssl-dev 28 【2】编译过程找不到ares.h 29 【解决方法】——修改config.mk中的WITH_SRV:=yes,改为WITH_SRV:=yes 30 【3】使用过程中找不到libmosquitto.so.1 31 error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory 32 【解决方法】——修改libmosquitto.so位置 33 # 创建链接 34 sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1 35 # 更新动态链接库 36 sudo ldconfig 37 【4】make: g++:命令未找到 38 【解决方法】 39 安装g++编译器 40 sudo apt-get install g++ 41 42 2 简单的例子 43 设计一个简单的测试案例,在PC机上运行MQTT代理服务器,而树莓派订阅主题为gpio的消息,PC机发布同主题消息,消息的内容为JSON数据包,数据包格式为{“index”:17,“value”:0},index代表树莓派GPIO的编号,value代表打开或关闭状态。 44 45 图1 示例 46 本例中PC机IP地址为 192.168.1.110,树莓派的IP地址为192.168.1.106 47 2.1 在PC机中开启MQTT服务 48 mosquitto -v 49 50 2.2 在树莓派中订阅消息 51 mosquitto_sub -v -t gpio -h 192.168.1.110 52 【-h】指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110 53 54 2.3 在PC机中发布消息 55 mosquitto_pub -t gpio -h 192.168.1.110 -m "{\"pin\":17,\"value\":0}" 56 【-h】指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110 57 58 2.4 消息被推送到树莓派中 59 最后在树莓派中输出以下内容: 60 gpio {"index":17,"value":0} 61 在PC机MQTT服务器控制台中输出 62 1410600001: mosquitto version 1.3.4 (build date 2014-09-13 15:55:06+0800) starting 63 1410600001: Using default config. 64 1410600001: Opening ipv4 listen socket on port 1883. 65 1410600001: Opening ipv6 listen socket on port 1883. 66 1410600062: New connection from 192.168.1.106 on port 1883. 67 1410600062: New client connected from 192.168.1.106 as mosqsub/3063-raspberryp (c1, k60). 68 1410600062: Sending CONNACK to mosqsub/3063-raspberryp (0) 69 1410600062: Received SUBSCRIBE from mosqsub/3063-raspberryp 70 1410600062: gpio (QoS 0) 71 1410600062: mosqsub/3063-raspberryp 0 gpio 72 1410600062: Sending SUBACK to mosqsub/3063-raspberryp 73 1410600122: Received PINGREQ from mosqsub/3063-raspberryp 74 1410600122: Sending PINGRESP to mosqsub/3063-raspberryp 75 1410600152: New connection from 192.168.1.110 on port 1883. 76 1410600152: New client connected from 192.168.1.110 as mosqpub/9793-EasyARM (c1, k60). 77 1410600152: Sending CONNACK to mosqpub/9793-EasyARM (0) 78 1410600152: Received PUBLISH from mosqpub/9793-EasyARM (d0, q0, r0, m0, 'gpio', ... (22 bytes)) 79 1410600152: Sending PUBLISH to mosqsub/3063-raspberryp (d0, q0, r0, m0, 'gpio', ... (22 bytes)) 80 1410600152: Received DISCONNECT from mosqpub/9793-EasyARM 81 1410600182: Received PINGREQ from mosqsub/3063-raspberryp 82 1410600182: Sending PINGRESP to mosqsub/3063-raspberryp 83 84 3 使用MQTT远程控制GPIO 85 下面借助python-gpio扩展库,通过消息推送的方式实现GPIO端口的远程控制。 86 3.1 安装paho-mqtt 87 使用pip工具安装paho-mqtt,输入以下指令即可: 88 sudo pip install paho-mqtt 89 90 3.2 树莓派订阅代码——simple.py 91 # -*- coding: utf-8 -*- 92 import paho.mqtt.client as mqtt 93 import RPi.GPIO as GPIO 94 import json 95 96 # BCM GPIO编号 97 pins = [17,18,27,22,23,24,25,4] 98 def gpio_setup(): 99 # 采用BCM编号 100 GPIO.setmode(GPIO.BCM) 101 # 设置所有GPIO为输出状态,且输出低电平 102 for pin in pins: 103 GPIO.setup(pin, GPIO.OUT) 104 GPIO.output(pin, GPIO.LOW) 105 106 def gpio_destroy(): 107 for pin in pins: 108 GPIO.output(pin, GPIO.LOW) 109 GPIO.setup(pin, GPIO.IN) 110 111 # 连接成功回调函数 112 def on_connect(client, userdata, flags, rc): 113 print("Connected with result code " + str(rc)) 114 # 连接完成之后订阅gpio主题 115 client.subscribe("gpio") 116 117 # 消息推送回调函数 118 def on_message(client, userdata, msg): 119 print(msg.topic+" "+str(msg.payload)) 120 # 获得负载中的pin 和 value 121 gpio = json.loads(str(msg.payload)) 122 123 if gpio['pin'] in pins: 124 if gpio['value'] == 0: 125 GPIO.output(gpio['pin'], GPIO.LOW) 126 else: 127 GPIO.output(gpio['pin'], GPIO.HIGH) 128 129 if __name__ == '__main__': 130 client = mqtt.Client() 131 client.on_connect = on_connect 132 client.on_message = on_message 133 gpio_setup() 134 135 try: 136 # 请根据实际情况改变MQTT代理服务器的IP地址 137 client.connect("192.168.1.110", 1883, 60) 138 client.loop_forever() 139 except KeyboardInterrupt: 140 client.disconnect() 141 gpio_destroy() 142 143 3.3 启动服务并发布消息 144 【在PC机中启动MQTT代理服务】 145 mosquitto -v 146 【在树莓派中运行脚本】 147 sudo python simple.py 148 【在PC机中发布消息】 149 # 打开GPIO17 150 mosquitto_pub -h 192.168.1.110 -t gpio -m "{\"pin\":17,\"value\":1}" 151 # 关闭GPIO17 152 mosquitto_pub -h 192.168.1.110 -t gpio -m "{\"pin\":17,\"value\":0}" 153 【运行结果】 154 树莓派GPIO17根据PC机推送的消息点亮或熄灭。 155 156 4 总结 157 本文说明了如何在树莓派中使用MQTT客户端,通过paho-mqtt实现GPIO的远程控制。本例在局域网中运行并能不能体现出MQTT协议在远程控制中的优越性。后期还将花更多的时间实践和分析MQTT协议。 158 --------------------- 159 作者:xukai871105 160 来源:CSDN 161 原文:https://blog.csdn.net/xukai871105/article/details/39255089 162 版权声明:本文为博主原创文章,转载请附上博文链接!