<p>根据hardillb的建议,我研究了线程并发现了一些问题,可以用类来解决这个问题。我以前的答案是:</p>
<p><a href="https://stackoverflow.com/questions/23100704/running-infinite-loops-using-threads-in-python">Running infinite loops using threads in python</a></p>
<p><a href="https://stackoverflow.com/questions/30836886/thread-issue-while-subscribing-to-mqtt-in-python-using-paho-mqtt">Thread issue while subscribing to MQTT in Python using Paho MQTT</a></p>
<p>下面是按预期工作的完整代码。它启动语音模块和Mqtt客户机,等待yes/no(这是我能让语音模块识别的唯一一致的单词…)并在收到相应命令时打开/关闭我的Aruidno指示灯。对于那些感兴趣的人,我也将包括Arduino代码。IP地址192.168.1.2指向我的Raspberry Pi,它正在运行一个Mosquitto代理来处理MQTT主题。在</p>
<p>在语音.py公司名称:</p>
<pre><code>import pyaudio, os
from mqttPublisher import MqttHandler
import speech_recognition as sr
from threading import Thread
class Amy(Thread):
def mainfunction(self, source):
audio = self.r.listen(source)
user = self.r.recognize_sphinx(audio)
print(user)
if user == 'yes':
mqtt.led_on()
elif user == 'no':
mqtt.led_off()
elif user == 'get':
mqtt.get_status()
def __init__(self):
Thread.__init__(self)
self.daemon = True
self.start()
def run(self):
self.r = sr.Recognizer()
with sr.Microphone() as source:
while True:
self.mainfunction(source)
amy = Amy()
mqtt = MqttHandler()
amy
mqtt
while True:
pass
</code></pre>
<p>在mqttPublisher.py公司名称:</p>
^{pr2}$
<p>Arduino代码:</p>
<pre><code>#include <PubSubClient.h>
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = {0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xEF };
byte ip[] = { 192, 168, 1, 6 };
byte localserver[] = { 192, 168, 1, 2 };
const char clientID[8] = "Arduino";
const char topicName[8] = "IoT/LED";
const char on[3] = "On";
const char off[4] = "Off";
const int led = 9;
int status;
EthernetClient ethClient;
PubSubClient client(localserver, 1883, callback, ethClient);
void callback(char* topic, byte* payload, unsigned int length) {
int load = atoi ((const char*) payload);
if (load != 0) {
Serial.print("\n");
Serial.print("Payload= ");
Serial.println(load);
switch(load) {
case 1:
digitalWrite(led, HIGH);
client.publish(topicName, on);
Serial.print("Light turned on");
break;
case 2:
digitalWrite(led, LOW);
client.publish(topicName, off);
Serial.print("Light turned off");
break;
case 3:
status = digitalRead(led);
if (status == 0) {
client.publish(topicName, off);
Serial.print("Light status: ");
Serial.println(off);
break;
}
else if (status == 1) {
client.publish(topicName, on);
Serial.print("Light status: ");
Serial.println(on);
break;
}
default:
break;
}
}
}
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
Ethernet.begin(mac, ip);
if (!client.connected()) {
Serial. print("Trying to connect...");
client.connect(clientID);
}
if (client.connected()) {
Serial.print("Connected");
client.subscribe(topicName);
}
}
void loop() {
client.loop();
}
</code></pre>