mosquitto介绍:
一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。一个典型的应用案例就是 Andy Stanford-ClarkMosquitto(MQTT协议创始人之一)在家中实现的远程监控和自动化。并在 OggCamp 的演讲上,对MQTT协议进行详细阐述。
打开树莓派的终端,输入
sudo apt-get install mosquitto mosquitto-clients
按下Y确认即可
使用两个终端分别使用以下的代码即可检验mosquitto是否安装成功
mosquitto_sub -t m -d
mosquitto_pub -t m -m "This is a message from pi."
订阅的终端会出现“This is my first message from pi”的字样
关于mosquitto的详细的使用方法:https://blog.csdn.net/xyblog/article/details/50113883
如果树莓派上有多个版本的python需要指定类型安装时:
python3
sudo python3 -m pip install paho-mqtt
python2
sudo python2 -m pip install paho-mqtt
思路整理于简书,作者:EMQ 详情请进:https://www.jianshu.com/p/b76dbc675141
使用 connect() / connect_async() 连接Broker
调用 loop() 保持与Broker网络连接
使用 loop_start() 调用一个loop()进程
使用 loop_forever() 保持 loop()调用
使用 subscribe() 订阅主题并接收消息
使用 publish() 发布消息
使用 disconnect() 与Broker断开连接
on_connect(client, userdata, flags, rc)
当Broker响应我们请求时调用,“flags” 是一个包含Broker响应参数的字典:flags[‘session present’] –此标志仅对于干净会话设置为0,如果设置session=0,用于客户端重新连接到之前 Broker是否仍然保存之前会话信息,如果设1,会话一直存在。“rc”值用于判断是否连接成功
on_disconnect(client, userdata, rc)
当客户端与Broker断开时调用
on_message(client, userdata, message)
在客户端订阅的主题上接收到消息时调用,“message”变量是一个MQTT消息描述所有消息特征
on_publish(client, userdata, mid)
当使用publish()发送的消息已经完成传输到代理时调用。对于QoS级别为1和2的消息,这意味着适当的握手已经完成。对于QoS 0,这仅仅意味着消息已经离开客户端。“mid”变量是从相应的publish()调用返回的中间变量。这个回调很重要,因为即使publish()调用返回成功,也并不总是意味着消息已经被发送
on_subscribe(client, userdata, mid, granted_qos)
当Broker响应订阅请求时调用,“mid”变量是从相应的subscribe()调用返回的中间变量,“granted_qos”变量是每次发送不同订阅请求Qos级别的列表
on_unsubscribe(client, userdata, mid)
当Broker响应取消订阅请求时调用,“mid“变量是从相应的unsubscribe()调用返回的中间变量
on_log(client, userdata, level, buf)
当客户端有日志信息时调用,定义允许调试,“level“变量是消息级别包含MQTT_LOG_INFO, MQTT_LOG_NOTICE, MQTT_LOG_WARNING, MQTT_LOG_ERR, MQTT_LOG_DEBUG,消息本身是buf。
PUB:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("127.0.0.1", 1883, 600)
client.publish('emqtt',payload='Hello,EMQ!',qos=0)
client.loop_start()
SUB:
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected with result code "+str(rc))
def on_message(client, userdata, msg):
print(msg.topic+" "+str(msg.payload))
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("127.0.0.1", 1883, 600)
client.subscribe('emqtt',qos=0)
client.loop_start()
思路整理于树莓派实验室 详情请进:http://shumeipai.nxez.com/2018/09/16/install-mosquitto-on-the-raspberry-pi-to-implement-mqtt.html
消息的内容为JSON数据包,数据包格式为{“index”:17,“value”:0},index代表树莓派GPIO的编号,value代表打开或关闭状态。
# -*- 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))
# 连接完成之后订阅xxxx主题
client.subscribe("xxxx")
# 消息推送回调函数
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("xxxxxxxx", 1883, 60) #此处的xxxxxx为ip地址
client.loop_forever()
except KeyboardInterrupt:
client.disconnect()
gpio_destroy()
此处的代码和思路整理于CSDN 作者:罗小龙 详情请进:https://blog.csdn.net/Tavox/article/details/74996150
import paho.mqtt.client as mqtt
import sys
import uuid
#import Collect
import time
broker = change0' #百度云天工物联网平台的域名地址
port = 1883
username = 'change1'# 实例用户名
password = 'change2'# 密钥
clientid = 'xxxx' + str(uuid.uuid4()) #为随机生成的id
topic = 'xxxx' #xxxx为树莓派发布的主题名字
def on_connect(client, userdata, rc):
print('Connected. Client id is: ' + clientid)
def on_message(client, userdata, msg):
msg = str(msg.payload, 'utf-8')
print('MQTT message received: ' + msg)
if msg == 'exit':
sys.exit()
client = mqtt.Client(clientid)
# client.will_set('temperature', 'last will', 0, False)
client.on_connect = on_connect
client.on_message = on_message
client.username_pw_set(username, password)
print('Connecting to broker: ' + broker)
client.connect(broker, port)
client.loop_start()
time.sleep(3)
# client.loop_forever()
client.publish(topic,payload=xxxx,qos=0) #xxxx为你想发布的数据
#while True: #没搞懂Collect是啥操作,具体看作者博客
# rTHdata = test1.Collect.collect()
# client.publish(topic, "temperture :" + str(rTHdata[0]) + " *C " + "humidity :" + str(rTHdata[1]) + " %")
# 设置发布间隔时间
# time.sleep(3)
如果身边没有树莓派进行测试,可以先使用window安装mosquitto服务器用来测试
安装和测试的方法来自CSDN 作者:PotoYoung
https://blog.csdn.net/qq_21842575/article/details/82760335
测试验证:
程序大致如上,增加了一个循环,每隔3s给百度云天工物联网MQTT服务器发送"hello_world a"
结果:
接收到hello_world 0
接收到hello_world 1
接收到hello_world 2
往期文章:
使用树莓派打造一个属于自己的智能家居(一)—DHT11温湿度传感器的使用:https://blog.csdn.net/qq_41744697/article/details/103907582
使用树莓派打造一个属于自己的智能家居(二)—MQTT协议的使用
https://blog.csdn.net/qq_41744697/article/details/103908028