Попытка отправить одно сообщение через MQTT и спать в течение 5 секунд - PullRequest
0 голосов
/ 01 мая 2020

Я сейчас пытаюсь отправить сообщение по протоколу MQTT, который работает. Я использую Raspberry Pi и датчик вибрации в качестве средства для запуска отправки сообщения. В начале я бы прикоснулся к датчику, и он сразу бы отправил множество сообщений, чего я не хочу. поэтому я попытался заснуть в течение 5 секунд после обнаружения вибрации. Но теперь он обнаруживает одну вибрацию, а затем не обнаруживает другую, но не останавливает работу файла. Единственный способ, которым я могу заставить его снова обнаружить вибрацию, - это снова запустить файл. Вот два способа, которые я попробовал:

import time
from grove.gpio import GPIO

import paho.mqtt.client as mqttClient


class GrovePiezoVibrationSensor(GPIO):
    def __init__(self, pin):
        super(GrovePiezoVibrationSensor, self).__init__(pin, GPIO.IN)
        self._on_detect = None

    @property
    def on_detect(self):
        return self._on_detect

    @on_detect.setter
    def on_detect(self, callback):
        if not callable(callback):
            return

        if self.on_event is None:
            self.on_event = self._handle_event

        self._on_detect = callback

    def _handle_event(self, pin, value):
        if value:
            if callable(self._on_detect):
                self._on_detect()
                time.sleep(5000)


Grove = GrovePiezoVibrationSensor
def on_connect(client, userdata, flags, rc):

    if rc == 0:

        print("Connected to broker")

        global Connected                #Use global variable
        Connected = True                #Signal connection

    else:

        print("Connection failed")

Connected = False   #global variable for the state of the connection

broker_address= "hairdresser.cloudmqtt.com"
port = 15767
user = "kprpjfue"
password = "1fIq2_CIwHZj"
client = mqttClient.Client("Python")               #create new instance
client.username_pw_set(user, password=password)    #set username and password
client.on_connect= on_connect
client.loop_start()

client.connect(broker_address, port=port)



def main():
    from grove.helper import SlotHelper
    sh = SlotHelper(SlotHelper.GPIO)
    pin = sh.argv2pin()

    pir = GrovePiezoVibrationSensor(pin)

    def callback():
        print('Detected.')
        value = 'detected'
        client.publish("sensor/Temp", value)

    pir.on_detect = callback
    while True:
        time.sleep(5000)

if __name__ == '__main__':
    main()


while Connected != True:    #Wait for connection
    time.sleep(0.1)

import time
from grove.gpio import GPIO

import paho.mqtt.client as mqttClient


class GrovePiezoVibrationSensor(GPIO):
    def __init__(self, pin):
        super(GrovePiezoVibrationSensor, self).__init__(pin, GPIO.IN)
        self._on_detect = None

    @property
    def on_detect(self):
        return self._on_detect

    @on_detect.setter
    def on_detect(self, callback):
        if not callable(callback):
            return

        if self.on_event is None:
            self.on_event = self._handle_event

        self._on_detect = callback

    def _handle_event(self, pin, value):
        if value:
            if callable(self._on_detect):
                self._on_detect()
                time.sleep(5000)


Grove = GrovePiezoVibrationSensor
def on_connect(client, userdata, flags, rc):

    if rc == 0:

        print("Connected to broker")

        global Connected                #Use global variable
        Connected = True                #Signal connection

    else:

        print("Connection failed")

Connected = False   #global variable for the state of the connection

broker_address= "hairdresser.cloudmqtt.com"
port = 15767
user = "kprpjfue"
password = "1fIq2_CIwHZj"
client = mqttClient.Client("Python")               #create new instance
client.username_pw_set(user, password=password)    #set username and password
client.on_connect= on_connect

client.connect(broker_address, port=port)



def main():
    from grove.helper import SlotHelper
    sh = SlotHelper(SlotHelper.GPIO)
    pin = sh.argv2pin()

    pir = GrovePiezoVibrationSensor(pin)

    def callback():
        print('Detected.')
        value = 'detected'
        client.publish("sensor/Temp", value)

    pir.on_detect = callback
    while True:
        time.sleep(5000)
        client.loop()

if __name__ == '__main__':
    main()


while Connected != True:    #Wait for connection
    time.sleep(0.1)

Как вы можете видеть в методе if, вызываемом в методе дескриптора, который я сказал, я говорю time.sleep (5000). Я помещаю это в неправильное место?

1 Ответ

0 голосов
/ 01 мая 2020

Вы не запустили клиентскую сеть MQTT l oop, поэтому она не сможет получать сообщения или отправлять сообщения с большим MTU.

Вы также будете отключены после периода поддержания активности.

Добавьте client.loop_start() перед вызовом client.connect()

или вставьте client.loop() после time.sleep(5000) в l oop в основном, и будет лучше сделать это 1000 к клиент l oop запускается не реже одного раза в секунду.

Добавление спящих в обратных вызовах обычно плохая идея, поскольку это не останавливает запуск событий, а просто задерживает их, потому что они просто будут поставлены в очередь пока время ожидания не истечет.

Вы должны установить флаг для первого события сразу после отправки сообщения MQTT, срок действия которого можно затем истечь, используя while True l oop в main. Если новое событие приходит, пока флаг все еще установлен, вы просто не отправляете другое сообщение MQTT.

...