【发布时间】:2018-01-04 15:15:07
【问题描述】:
所以我有一个 Raspberry Pi #1,它将通过主题 sensors/Button 向 AWS 发布一条 MQTT 消息。这将在按下按钮时触发,如下所示。
# Import SDK packages
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
from time import sleep
from gpiozero import Button
from signal import pause
button = Button(13, pull_up=False)
def callMQTT():
print("button is pressed.Sending to MQTT")
mqtt_message = "{\"message\":\"button_pressed\"}"
print(mqtt_message)
my_rpi.publish("sensors/Button", mqtt_message, 1)
print("Message Published!")
sleep(5)
host="host.amazonaws.com"
rootCAPath = "rootca.pem"
certificatePath = "certificate.pem.crt"
privateKeyPath = "private.pem.key"
try:
my_rpi = AWSIoTMQTTClient("basicPubSub")
my_rpi.configureEndpoint(host,8883)
my_rpi.configureCredentials(rootCAPath, privateKeyPath, certificatePath)
my_rpi.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing
my_rpi.configureDrainingFrequency(2) # Draining: 2 Hz
# Connect and subscribe to AWS IoT
my_rpi.connect()
print("Connection Succesful")
except:
print("Unexpected error:", sys.exc_info()[0])
button.when_pressed = callMQTT
pause()
在 Raspberry Pi #2 上,它将尝试使用与 Raspbery Pi #1 相同的主机、相同的事物、相同的密钥和相同的证书从 AWS 订阅 MQTT。如果收到消息,它会发出蜂鸣声并点亮 LED,如下图所示。
# Import SDK packages
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient
from time import sleep
from gpiozero import Buzzer,LED
import random
import sys
from datetime import datetime
bz = Buzzer(22)
led = LED(18)
# Custom MQTT message callback
def customCallback(client, userdata, message):
print("Received a new message: ")
print(message.payload)
print("from topic: ")
print(message.topic)
print("--------------\n\n")
timestring = str(datetime.now())
print("Doorbell pressed")
bz.on()
led.blink()
sleep(1)
bz.off()
led.off()
host="host.amazonaws.com"
rootCAPath = "rootca.pem"
certificatePath = "certificate.pem.crt"
privateKeyPath = "private.pem.key"
try:
my_rpi = AWSIoTMQTTClient("basicPubSub")
my_rpi.configureEndpoint(host, 8883)
my_rpi.configureCredentials(rootCAPath, privateKeyPath, certificatePath)
my_rpi.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing
my_rpi.configureDrainingFrequency(2) # Draining: 2 Hz
my_rpi.configureConnectDisconnectTimeout(10) # 10 sec
my_rpi.configureMQTTOperationTimeout(5) # 5 sec
# Connect and subscribe to AWS IoT
my_rpi.connect()
except:
print("Unexpected error:", sys.exc_info()[0])
while True:
my_rpi.subscribe("sensors/Button", 1, customCallback)
sleep(2)
但是,这是不可能的。当两个程序同时运行时,Rasberry Pi #2 将始终超时。由于某种原因,它一次只允许 1 个连接。 当我运行 Raspberry Pi #1 代码时,我尝试直接通过 AWS 订阅主题。它在 AWS 上显示消息。此外,如果我尝试直接在 AWS 上发布消息并仅运行 Raspberry Pi #2 代码,它也可以正常工作,但在同时运行代码时就不行了。我在 Raspberry Pi #2 上遇到的错误是这样的:
找不到记录器的处理程序 "AWSIoTPythonSDK.core.protocol.mqttCore" Traceback(最近调用 最后):文件“Doorbell_Indoor.py”,第 72 行,在 my_rpi.subscribe("sensors/Button", 1, customCallback) 文件 "/usr/local/lib/python2.7/dist-packages/AWSIoTPythonSDK/MQTTLib.py", 第 491 行,订阅中 return self._mqttCore.subscribe(topic, QoS, callback) 文件“/usr/local/lib/python2.7/dist-packages/AWSIoTPythonSDK/core/protocol/mqttCore.py”, 第 416 行,订阅中 raise subscribeTimeoutException() AWSIoTPythonSDK.exception.AWSIoTExceptions.subscribeTimeoutException
有人知道如何解决这个问题吗?提前致谢!
【问题讨论】:
-
每个客户端必须有一个唯一的客户端ID,最好的猜测是传递给
AWSIoTMQTTClient()的字符串就是客户端ID,让这些不同,看看会发生什么
标签: python amazon-web-services raspberry-pi mqtt aws-iot