MQTT是IBM开发的一个即时通讯协议。MQTT是面向M2M和物联网的连接协议,采用轻量级发布和订阅消息传输机制。Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的短消息通信简单易用。
若初次接触MQTT协议,可先理解以下概念:
MQTT协议特点——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制。
MQTT协议角色——在RESTful架构的物联网系统,包含两个角色客户端和服务器端,而在MQTT协议中包括发布者,代理器(服务器)和订阅者。
MQTT协议消息——MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使用。
MQTT协议主题——MQTT中的主题可理解为相同类型或相似类型的消息集合。
本文说明如何在树莓派上安装Mosquitto。本文通过两个简单的例子说明树莓派中如何使用MQTT协议实现消息订阅,这些例子包括Mosquitto_sub指令实现消息订阅和paho-python扩展库实现GPIO端口的远程控制。本文中使用了两个工具——Mosquitto paho-python,其中Mosquitto是一款实现了 MQTT v3.1 协议的开源消息代理软件,提供轻量级的,支持发布/订阅的的消息推送模式,使设备对设备之间的消息通信简单易用;另外,paho-python是一个符合MQTT v3.1协议的客户端,paho-python可连接MQTT代理服务器、发布消息、订阅消息和获得推送消息。
1 在树莓派上安装Mosquitto
在树莓派上安装Mosquitto和其他平台类似,如果在树莓派平台直接编译时间可能会稍长些。Mosquitto源代包不大,所以编译时间尚可忍受。
1.1 安装
截止2014年9月,最新版本为mosquitto-1.3.4。在树莓派中新建一个目录,例如software。
1
2
3
4
5
6
7
8
9
10
|
# 下载源代码包 wget http: //mosquitto .org /files/source/mosquitto-1 .3.4. tar .gz # 解压 tar zxfv mosquitto-1.3.4. tar .gz # 进入目录 cd mosquitto-1.3.4 # 编译 make # 安装 sudo make install |
1.2 安装注意点
编译找不到openssl/ssl.h
解决方法:安装openssl
1
|
sudo apt-get install libssl-dev |
编译过程找不到ares.h
解决方法:修改config.mk中的WITH_SRV:=yes,改为WITH_SRV:=yes
使用过程中找不到libmosquitto.so.1
error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
解决方法:修改libmosquitto.so位置
1
2
3
4
|
# 创建链接 sudo ln -s /usr/local/lib/libmosquitto .so.1 /usr/lib/libmosquitto .so.1 # 更新动态链接库 sudo ldconfig |
make: g++:命令未找到
解决方法:安装g++编译器
1
|
sudo apt-get install g++ |
2 简单的例子
设计一个简单的测试案例,在PC机上运行MQTT代理服务器,而树莓派订阅主题为gpio的消息,PC机发布同主题消息,消息的内容为JSON数据包,数据包格式为{“index”:17,“value”:0},index代表树莓派GPIO的编号,value代表打开或关闭状态。
本例中PC机IP地址为 192.168.1.110,树莓派的IP地址为192.168.1.106
2.1 在PC机中开启MQTT服务
1
|
mosquitto - v |
2.2 在树莓派中订阅消息
1
|
mosquitto_sub - v -t gpio -h 192.168.1.110 |
-h
指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110
2.3 在PC机中发布消息
1
|
mosquitto_pub -t gpio -h 192.168.1.110 -m "{"pin":17,"value":0}" |
-h
指定MQTT代理服务器主机,指向PC机IP地址192.168.1.110
2.4 消息被推送到树莓派中
最后在树莓派中输出以下内容:
1
|
gpio { "index" :17, "value" :0} |
在PC机MQTT服务器控制台中输出
1410600001: mosquitto version 1.3.4 (build date 2014-09-13 15:55:06+0800) starting 1410600001: Using default config. 1410600001: Opening ipv4 listen socket on port 1883. 1410600001: Opening ipv6 listen socket on port 1883. 1410600062: New connection from 192.168.1.106 on port 1883. 1410600062: New client connected from 192.168.1.106 as mosqsub/3063-raspberryp (c1, k60). 1410600062: Sending CONNACK to mosqsub/3063-raspberryp (0) 1410600062: Received SUBSCRIBE from mosqsub/3063-raspberryp 1410600062: gpio (QoS 0) 1410600062: mosqsub/3063-raspberryp 0 gpio 1410600062: Sending SUBACK to mosqsub/3063-raspberryp 1410600122: Received PINGREQ from mosqsub/3063-raspberryp 1410600122: Sending PINGRESP to mosqsub/3063-raspberryp 1410600152: New connection from 192.168.1.110 on port 1883. 1410600152: New client connected from 192.168.1.110 as mosqpub/9793-EasyARM (c1, k60). 1410600152: Sending CONNACK to mosqpub/9793-EasyARM (0) 1410600152: Received PUBLISH from mosqpub/9793-EasyARM (d0, q0, r0, m0, 'gpio', ... (22 bytes)) 1410600152: Sending PUBLISH to mosqsub/3063-raspberryp (d0, q0, r0, m0, 'gpio', ... (22 bytes)) 1410600152: Received DISCONNECT from mosqpub/9793-EasyARM 1410600182: Received PINGREQ from mosqsub/3063-raspberryp 1410600182: Sending PINGRESP to mosqsub/3063-raspberryp
3 使用MQTT远程控制GPIO
下面借助python-gpio扩展库,通过消息推送的方式实现GPIO端口的远程控制。
3.1 安装paho-mqtt
使用pip工具安装paho-mqtt,输入以下指令即可:
1
|
sudo pip install paho-mqtt |
3.2 树莓派订阅代码 simple.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
# -*- 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.110" , 1883 , 60 ) client.loop_forever() except KeyboardInterrupt: client.disconnect() gpio_destroy() |
3.3 启动服务并发布消息
在PC机中启动MQTT代理服务
1
|
mosquitto - v |
在树莓派中运行脚本
1
|
sudo python simple.py |
在PC机中发布消息
1
2
3
4
|
# 打开GPIO17 mosquitto_pub -h 192.168.1.110 -t gpio -m "{"pin":17,"value":1}" # 关闭GPIO17 mosquitto_pub -h 192.168.1.110 -t gpio -m "{"pin":17,"value":0}" |
运行结果
树莓派GPIO17根据PC机推送的消息点亮或熄灭。
4 总结
本文说明了如何在树莓派中使用MQTT客户端,通过paho-mqtt实现GPIO的远程控制。本例在局域网中运行并能不能体现出MQTT协议在远程控制中的优越性。后期还将花更多的时间实践和分析MQTT协议。
转自:https://blog.csdn.net/xukai871105/article/details/39255089
相关资料:
1、https://blog.csdn.net/xukai871105/article/details/39252653
2、http://blog.csdn.net/shagoo/article/details/7910598
3、https://www.jianshu.com/p/f8d824afbe3d
原文地址:https://shumeipai.nxez.com/2018/09/16/install-mosquitto-on-the-raspberry-pi-to-implement-mqtt.html
本站原创文章,作者:小 编,如若转载,请注明出处:https://www.mzbky.com/1691.html