2016-11-10 3 views
0

フラスコにmqttを実装する方法について質問したいと思います。私はいくつかのコードを書いた。特定のページに行くと、メッセージを受け取ってデータベースに格納し、その特定のページのテーブルにメッセージを出力する。フラスコにMQTTを実装する

以下は私のコードのスニペットです。

'views.py'

from flask import render_template, request, url_for, redirect, flash 
from flask_wtf import Form 
from flask_login import login_user, logout_user, login_required 
import paho.mqtt.client as mqtt 
from app import app, db 
from models import User, Data 

...other @app.route... 

@app.route('/table') 
@login_required 
def table_data(): 
    def on_connect(client, userdata, flags, rc): 
     flash("connected") 

     client.subscribe("abc123") 

    def on_message(client, userdata, msg, message): 
     message = Data(temperature=msg.temperature, ph=msg.pH, time=msg.time) 

     db.session.add(message) 
     db.session.commit() 

client = mqtt.Client(client_id = "my_visualise", clean_session = True) 
client.username_pw_set("mosquitto", "mosquitto") 
client.on_connect = on_connect 
client.on_message = on_message 

return render_template('table_data.html') 

'models.py'

from app import app, db 

...User table... 

# Data table 
class Data(db.Model): 
    __tablename__= 'data_reading' 
    id = db.Column(db.Integer, primary_key=True) 
    temperature = db.Column(db.Integer, index=True) 
    pH = db.Column(db.Integer, index=True) 
    time = db.Column(db.DateTime, index=True) 

    def __init__(self, temperature, pH, time): 
     self.temperature = temperature 
     self.pH = pH 
     self.time = time 


db.create_all() 

'table_data.html'

... 
<div class="jumbotron"> 
    <div class="container-fluid"> 
     <h2>Data</h2> 
     <p>This table includes the data for temperature, pH value and time</p> 
     <div class="table-responsive"> 
      <table class="table", border=2> 
         {% for value in message.iteritems() %} 
        <thead> 
         <tr> 
          <th>id</th> 
          <th>Temperature</th> 
          <th>pH Value</th> 
          <th>Timestamp</th> 
         </tr> 
        </thead> 
        <tbody> 
         <tr> 
          <td> {{value}} </td> 
         </tr> 
        </tbody> 
        {% endfor %} 
       </table> 
      </div> 
     </div> 

私は自分のコンピュータ上でローカルにコードを実行します。最初はエラーは表示されませんが、一度 '/ table'ページに移動すると、次のエラーが表示されます。

「エラー」私はこれは私が私が十分に理解することができます任意の例やチュートリアルを見つけることができませんでしたので、私は「views.py」でスクリプトを書いた方法に問題でなければならないと信じて

UndefinedError: 'message' is undefined 

フラスコにmqttを実装する。そこで私は自分でそれを実装しようと決めました。

私はこれについてあなたの意見を聞きたいと思います。

ありがとうございます。

+0

モデルが壊れている場合、クライアントがページのレンダリングに長い時間だけ接続されていると、メッセージが受信されない可能性があります。 – hardillb

+0

例外を発生させる行はどれですか? – dirn

+0

@dim私は 'views.py'の 'message = ...'という行がエラーを引き起こしたと信じています – Ling

答えて

0

実例を示すには十分なフラスコがわかりませんが、すべてのmqttコードを連続して実行できる別のスレッドに移動する必要があります。その後、onMessage関数は依然として到着するメッセージをデータベースに格納することができます。

次に、結果をデータベースから直接レンダリングできます。

+0

あなたの提案に感謝します。すべてのmqttコードを別のスレッドに移動することについて言及しましたが、新しいファイルを作成するか、mqttコードを 'models.py'に書き込むことを意味しましたか? – Ling

+0

私はフラスケを知らないと言っていたので、どのように動作するのか分かりませんが、mqttセクションはhttp/webの処理とは別にする必要があります。 – hardillb

関連する問題