2016-04-08 29 views
-1

私は実行する必要がある2つのループを持っています.1つは音声コマンドを聞き取り、もう1つはMQTTブローカーに接続しておき、MQTTトピックを聞いて/ポストし、音声コマンドが発行されたときにポストします。問題は、これを設定する最善の方法がわからないことです。 MQTTが音声コマンドを実行して関数を実行するのを待って、これらの両方を実行するようにこれらを設定するにはどうすればよいですか?クラス?マルチスレッド?どこから始めるべきかわからない2つのループを同時に呼び出すと2つのループが同時に実行されますか?

また、 - この音声認識(ポケットフィックス)は絶対に恐ろしいです。おそらく5%のオン/オフを拾い、毎回あらゆる種類のランダムな応答を与えます。ボーナスブローポイントは、正しい方向に私を向けることができれば、より良いモジュールを使用したり、より正確なコードポケットフィックスを使用して修正することができます(既に私はGoogle Cloud-Speech APIキーに申し込みましたが、まだ受け取っていません) 。

import pyaudio, os 
import mqttPublisher 
import speech_recognition as sr 

def mainfunction(source): 
    audio = r.listen(source) 
    user = r.recognize_sphinx(audio) 
    print(user) 
    if user == 'on': 
     mqttPublisher.led_on() 
    elif user == 'off': 
     mqttPublisher.led_off() 

if __name__ == '__main__': 
    r = sr.Recognizer() 
    with sr.Microphone() as source: 
     while 1: 
      mainfunction(source) 

mqttPublisher.py:

ここでコード

voice.pyだ

import paho.mqtt.client as mqtt 

def led_on(): 
    mqttc.publish("IoT/LED", payload="1") 
    print("LED is ON") 

def led_off(): 
    mqttc.publish("IoT/LED", payload="2") 
    print("LED is OFF") 

def get_status(): 
    mqttc.publish("IoT/LED", payload="3") 

def on_connect(client, userdata, flags, rc): 
    mqttc.publish("IoT/LED", "connected") 
    print("connected") 

def on_subscribe(client, userdata, mid, granted_qos): 
    mqttc.publish("IoT/LED", payload="3") 
    print("subscribed") 

def on_publish(client, userdata, mid): 
    print("message published") 

def on_message(client, userdata, message): 
    print("message printed to topic") 

def on_disconnect(client, userdata, rc): 
    print("Client Disconnected") 

mqttc = mqtt.Client() 
mqttc.on_connect = on_connect 
mqttc.on_subscribe = on_subscribe 
mqttc.on_message = on_message 
mqttc.on_publish = on_publish 
mqttc.on_disconnect = on_disconnect 

mqttc.connect("192.168.1.3", 1883) 
mqttc.subscribe("IoT/LED", 1) 

run = True 
while run: 
    mqttc.loop_start() 
+1

ループを別々のスレッドで実行する – hardillb

+0

Coroutinesが実装しようとしていることは私には聞こえます。 – AndyG

答えて

-1

がhardillbの提案あたり、私はスレッドを調査し、授業で問題を解決し、いくつかの質問を見つけました。私は私の解決策に来るために使用される答えはここにある:以下

Running infinite loops using threads in python

Thread issue while subscribing to MQTT in Python using Paho MQTT

期待通りに働いて完成したコードです。それは音声モジュールとMqttクライアントを起動し、yes/no(音声モジュールに認識させることができる唯一の一貫した単語です...)を待ち、適切なコマンドを受け取ったときに私のAruidno LEDをオン/オフします。興味のある人には、Arduinoコードも含めます。 IPアドレス192.168.1.2はMQTTのトピックを扱うMosquittoブローカーを実行している私のRaspberry Piを指しています。

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(); 
} 
1

paho.mqtt.client.loop_start()はあなたのためにそのネットワークループを処理するためのスレッドを開始します。ちょうどそれを一度呼び、あなたは大丈夫でしょう。

関連する問題