使用树莓派打造一个属于自己的智能家居(三)------如何做到树莓派和百度云天工物联网之间的通信

1、首先我们需要先在树莓派中安装mosquitto客户端

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

2、安装paho.mqtt库

如果树莓派上有多个版本的python需要指定类型安装时:

python3

sudo python3 -m pip install paho-mqtt

python2

sudo python2 -m pip install paho-mqtt

2.1介绍关于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。

使用举例1(发消息):

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()

使用举例2(使用MQTT远程控制GPIO):

思路整理于树莓派实验室 详情请进: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()

3、代码编程实现树莓派连上百度云天工物联网

此处的代码和思路整理于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)

4、利用window端试验代码结果

如果身边没有树莓派进行测试,可以先使用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

发布了7 篇原创文章 · 获赞 2 · 访问量 547

猜你喜欢

转载自blog.csdn.net/qq_41744697/article/details/103914894