每hardillb的建議下,我研究線程,發現一些問題,帶班解決問題。我常來我的解決方案的答案在這裏:
Running infinite loops using threads in python
Thread issue while subscribing to MQTT in Python using Paho MQTT
下面是完整的代碼是否按照預期工作。它啓動語音模塊和Mqtt客戶端,等待是/否(這是我可以讓語音模塊識別的唯一一致的詞語),並在接收到適當命令時打開/關閉Aruidno LED。對於那些有興趣的人,我也會包含Arduino代碼。 IP地址192.168.1.2指向我的Raspberry Pi,它正在運行一個Mosquitto代理來處理MQTT主題。
voice.py:
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
mqttPublisher.py:
import paho.mqtt.client as mqtt
from threading import Thread
class MqttHandler(Thread):
client = mqtt.Client()
def __init__(self):
Thread.__init__(self)
self.daemon = True
self.start()
self.client.on_connect = self.on_connect
self.client.on_subscribe = self.on_subscribe
self.client.on_message = self.on_message
self.client.on_publish = self.on_publish
self.client.on_disconnect = self.on_disconnect
self.client.led_on = self.led_on
self.client.led_off = self.led_off
self.client.get_status = self.get_status
self.client.connect("192.168.1.2", 1883)
self.client.subscribe("IoT/LED", 1)
def run(self):
while True:
self.client.loop()
def led_on(self):
self.client.publish("IoT/LED", payload="1")
print("LED is ON")
def led_off(self):
self.client.publish("IoT/LED", payload="2")
print("LED is OFF")
def get_status(self):
self.client.publish("IoT/LED", payload="3")
def on_connect(self, client, userdata, flags, rc):
self.client.publish("IoT/LED", "connected")
print("connected")
def on_subscribe(self, client, userdata, mid, granted_qos):
self.client.publish("IoT/LED", payload="3")
print("subscribed")
def on_publish(self, client, userdata, mid):
print("message published")
def on_message(self, client, userdata, message):
print("message printed to topic")
def on_disconnect(self, client, userdata, rc):
print("Client Disconnected")
的Arduino代碼:
#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();
}
在單獨的線程上運行循環 – hardillb
對我來說,協程就是你想要實現的。 – AndyG