- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是Python的新手,并且每次收到MQTT消息/主题时,我都试图运行一个控件以使RGB LED发光。因此,我创建了一个对象threadObj
来运行线程并循环播放脉冲动画。
我面临的问题是我不知道如何将对象实例传递给on_message
mqtt回调。我一直在寻找部分函数应用程序,但是现在我不确定是正确的方法。
这是主要脚本:
from P9813 import P9813
from safeGPIO import safeGPIO as GPIO
import json
from math import ceil
import os
import threading
import queue
import sys
import subprocess
import threading
import time
from functools import partial
from ledPulse import ledPulse
import paho.mqtt.client as mqtt
def on_connect(client, userdata, flags, rc):
print("Connected to {0} with result code {1}".format(HOST, rc))
# Subscribe to any hotword topic --- old code: # client.subscribe("hermes/hotword/default/detected")
client.subscribe("hermes/hotword/#")
# Subscribe to any topic starting with 'hermes/intent/'
client.subscribe('hermes/intent/#')
def on_message(client, userdata, msg):
print("- Message received on topic {0}: {1}".format(msg.topic, msg.payload))
print('* ledPulse instance count {0} nameid {1}'.format(ledPulse.instance_count, threadObj))
if msg.topic == 'hermes/hotword/default/detected':
print("Wakeword detected! Wakeword light!")
#Wakeword light
print('ledPulseThread.Status -> ON and status {0}'.format(threadObj.status))
threadObj.Status = "ON" # T.StreamV could be modified to run at creation and wait for this to change to "ON"
threadObj.msgTopic = msg.topic
threadObj.ledDriver = ledDriver
threadObj.ledColor = LEDS_CYAN
#threadObj.daemon = True
threadObj.ledPulseThread.start() # this calls the T.StreamV function in a separate thread
if msg.topic == 'hermes/intent/mywai:ShowMarketplace':
# intent ShowMarketplace light
print("Intent detected! ShowMarketplace light!")
ledDriver[0] = LEDS_GREEN
ledDriver.write()
if msg.topic == 'hermes/hotword/toggleOn':
# light for hotword toggled-on
threadObj.ledColor = LEDS_WARM_WHITE
threadObj.Status = "OFF"
print('status ', threadObj.Status)
print('T.Status -> "OFF"')
print("Intent detected! Hotword ended!")
ledDriver[0] = LEDS_WARM_WHITE
ledDriver.write()
#threadObj.ledPulseThread.terminate() # this calls the T.StreamV function in a separate thread
#########################################################################
# MAIN
#########################################################################
if __name__ == '__main__':
#main()
HOST = 'localhost'
PORT = 1883
gpio = GPIO()
gpio.cleanup()
# Construct the object
ledDriver = P9813(32, 33)
# Create led (R,G,B) list
leds = [[0, 0, 0]]
# Define color constants
# [R,G,B]
LED_STRENGTH = 100
LEDS_OFF = [0, 0, 0]
LEDS_RED = [LED_STRENGTH, 0, 0]
LEDS_GREEN = [0, LED_STRENGTH, 0]
LEDS_BLUE = [0, 0, LED_STRENGTH]
LEDS_YELLOW = [LED_STRENGTH, LED_STRENGTH, 0]
LEDS_MAGENTA = [LED_STRENGTH, 0, LED_STRENGTH]
LEDS_CYAN = [0, LED_STRENGTH, LED_STRENGTH]
LEDS_WHITE = [LED_STRENGTH, LED_STRENGTH, LED_STRENGTH]
LEDS_WARM_WHITE = [210, 155, 35]
# Default light is warm white
#ledDriver[0] = LEDS_WARM_WHITE
#ledDriver.write()
# t1 = threading.Thread(target=loop_test, args=(deca,))
# t1.start()
threadObj = ledPulse(ledDriver) # our thread is actually created here, but is hasn't started yet
client = mqtt.Client()
client.on_connect = on_connect
#client.on_message = on_message
client.on_message = partial(on_message, threadObj) #https://stackoverflow.com/questions/15331726/how-does-the-functools-partial-work-in-python
client.connect(HOST, PORT, 60)
client.loop_forever()
# Ask the user repeatedly for LED brightness setting
try:
while (True):
str = raw_input("Input R, G, B [Enter] or Ctrl-C to quit. R, G, B range from 0 - 255: ")
leds[0] = list(map(int, str.split(",")))
print(leds[0])
ledDriver[0] = leds[0]
ledDriver.write()
except KeyboardInterrupt:
print("\r")
except:
print(str)
# Turn off LEDs before we quit
leds[0] = [0, 0, 0]
ledDriver[0] = leds[0]
ledDriver.write()
import threading
import time
class ledPulse(object):
instance_count = 0 #count how many istance of the class are created
def __init__(self, ledDriver):
self.status = "OFF"
self.ledPulseThread = threading.Thread(target=self.ledPulseThread) # create a thread for our streamV function
self.ledColor = [30, 40, 50]
self.ledDriver = ledDriver
self.msgTopic = ""
self.counter = 0
ledPulse.instance_count += 1
def ledPulseThread(self):
print("starting thread")
while self.status == "ON":
print("nonstop | status = ", self.Status)
self.ledDriver[0] = [0, 0, 0]
self.ledDriver.write()
time.sleep(0.2)
print("{0} sec | color {2} | driver {3} | instance {4} | deca {1}".format(self.counter, self.msgTopic, self.ledColor, self.ledDriver.write(), ledPulse.instance_count ))
self.ledDriver[0] = self.ledColor
self.ledDriver.write()
time.sleep(0.2)
self.counter = self.counter + 1
print("stopping thread")
self.counter = 0
#raise SystemExit
最佳答案
将对象实例作为值放置在字典中(或任何可变对象,如list,如果要更改回调中的值并查看反射(reflect)在主代码中的更改),则在实例化时将对象实例作为用户数据的一部分传递MQTT客户端。例如:
client_userdata = {'myobject':threadObj}
client = mqtt.Client(userdata=client_userdata)
userdata['myobject'] <- this is your threadObj
关于python - 将参数传递给paho mqtt回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52796149/
我想知道如果我只连接到 MQTT 服务器(不发送或接收任何消息),一个月内(大约)会消耗多少数据。 我需要计算它来衡量我应该为物联网应用程序中使用的 sim 卡充值什么数据计划。 谢谢 最佳答案 编辑
对于单个消息,在 mqtt 中向主题(代理或接收器)发送(发布)数据是否有任何限制? 提前致谢.. 最佳答案 IBM 写了一个 article关于 MQTT。 A payload up to 256
我一直在阅读有关 MQTT 的资料,我知道它使用 TCP 进行网络传输。因此,如果我有一个将发送订阅请求的移动应用程序,我假设这将是一个全双工连接,以便客户端可以收到传入推送数据的通知。 那么如何提高
最近看了一篇物联网文章 http://www.eclipse.org/community/eclipse_newsletter/2014/february/article2.php 在这里他说,通过
我有一个项目涉及与众多客户进行后端通信。我正在寻找要使用的最佳协议(protocol)。 MQTT 适合我的项目吗? 最佳答案 Mqtt 最适合涉及大量用户的项目。目标是提供一个围绕发布/订阅模型优化
是否允许在 MQTT 主题中使用多个 #? 例如: sensors/data/#/something/else/# 最佳答案 没有 MQTT 规范(v3 和 v5)规定主题只能在主题中使用一次“#”,
如果 MQTT 已经是一个轻量级协议(protocol),而且它使用的功率和带宽很少,那么为什么我们有 MQTT-SN?什么时候适合使用 MQTT,什么时候适合使用 MQTT-SN? 最佳答案 与 M
我正在使用 Paho 和 Mosqitto 进行 MQTT 通信。我们必须支持两种序列化模型——xml 和 json。所以我正在寻找如何识别 MQTT 中的内容类型或有效负载类型。 MQTT 中是否有
我想知道消息发送顺序是否被保留。也就是说,当发布者发送消息序列时,是否保证每个订阅者收到与发布者发送的序列相同的序列?对于干净和持久的 session ? 最佳答案 MQTT 3.1.1 中消息排序功
我正在使用 Paho 和 Mosqitto 进行 MQTT 通信。我们必须支持两种序列化模型——xml 和 json。所以我正在寻找如何识别 MQTT 中的内容类型或有效负载类型。 MQTT 中是否有
我已经在我的本地机器上安装了 MQTT 的 mosquitto 客户端。 我有以下配置: listener 1883 protocol mqtt listener 9001 protocol webs
MQTT 客户端每分钟轮询服务器多少次?是不是大数据流量?我知道数据包的大小可以很小,但是客户端 ping 代理多少次才能使自己在代理中“在线”。 如果我不清楚,请评论这个问题,我会尝试更好地解释我的
我们在不同的场所安装了许多本地网关。这些网关将托管一个 MQTT 代理,用于连接所有本地服务。然后需要本地 MQTT 代理将此数据发送到两个远程 MQTT 代理(每个托管于不同的一方)。我已阅读有关
无论我做什么,我都无法在我的 angular 应用程序中通过 websocket 连接到 mqtt 代理(在 chrome 和 firefox 中尝试)。 为简单起见,我使用 HiveMQ broke
我有一个 MQTT 客户端想要订阅以下主题 node1/数据/更新 节点1/数据/增量 节点1/数据 当然我有多个节点,所以我必须使用通配符,如下所述:https://www.hivemq.com/b
我正在使用 mosquitto (http://mosquitto.org/) 作为 MQTT 代理,并正在寻找有关负载平衡订阅者的建议(针对同一主题)。这是如何实现的?我读到的关于协议(protoc
如题,我可以区分新的和保留的MQTT消息吗?以及如何知道客户端何时发布消息?所有这些没有在主题或消息中指定时间戳字符串。 最佳答案 客户端使用保留标志向代理指示代理应将消息保留为要发布到的主题的“最后
有什么方法可以从另一个客户端找到所有连接的客户端详细信息(IP 和名称)?我知道有一个主题“$SYS/broker/clients/active”给出了当前连接的客户端的数量,但是如果我想了解更多关于
当处于 QOS 1 和 2 时,它会重播所有过去的消息。标准实现中是否有一种方法可以在再次生效时接收整个过去的队列(作为数组)? (当然仅限订阅的) 最佳答案 当客户端以 QOS 1 或 2 订阅主题
我想连接一个客户端,该客户端将监视代理的所有主题,以便在我不知道主题名称是什么时响应事件。 最佳答案 订阅 # 可以让您订阅除以 $ 开头的主题之外的所有内容(无论如何,这些主题通常都是控制主题)。
我是一名优秀的程序员,十分优秀!