簡體   English   中英

[Python][Heroku]不能經常向樹莓派穩定發送信號

[英][Python][Heroku]Can't send signal often to Raspberry Pi stably

我的名字是Hekatonkeiru,我從日本給你寫信。

我在 Heroku 上部署了一個應用程序,該應用程序通過 CloudMQTT 控制 Raspberry Pi GPIO。
這是我的應用配置

Enviroment:Heroku
Front-end: HTML, JavaScript(jQuery)
Server-side: Python(Flask)

但是在以下情況下,它不能經常穩定地向樹莓派發送信號。

  • 連續發送信號時。
  • 當信號發送時沒有任何延遲。

在以下這些情況下沒有問題。

  • 在本地環境中運行應用程序。
  • 從應用程序中刪除登錄 function 時。

我認為這個問題發生在登錄 function 和 function 發送 MQTT 之間,你怎么看?
還是有其他原因?
無論如何,我能問一下如何解決這個案子嗎?

如果您還有其他問題,請告訴我。

問候,
赫卡通凱魯



這是我的應用程序目錄。

RPi_app
│  
├─app.py
├─variable.py
│
├─sendMQTT
│      ca-certificates.crt
│      GPIO_Control_SendMQTT_One.py
│      GPIO_Control_SendMQTT_Three.py
│      GPIO_Control_SendMQTT_Two.py
│
├─static
│      SendToRPi.js
│
└─templates
        index.html
        login.html



應用程序.py

# -*- coding: utf-8 -*-

import os
from flask_sqlalchemy import SQLAlchemy
from flask import Flask, render_template, request
from flask_login import UserMixin, LoginManager, login_user, login_required
from werkzeug.security import check_password_hash
import flask_wtf
import wtforms
from wtforms import validators
from itsdangerous.url_safe import URLSafeTimedSerializer
from sendMQTT import GPIO_Control_SendMQTT_One
from sendMQTT import GPIO_Control_SendMQTT_Two
from sendMQTT import GPIO_Control_SendMQTT_Three

import variable

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = variable.SQLALCHEMY_DATABASE_URI

app.config['SECRET_KEY'] = os.urandom(24)

db = SQLAlchemy(app)
app.secret_key = os.urandom(24)
SALT = os.urandom(24)
currentDirctory = os.getcwd()
login_manager = LoginManager()
login_manager.init_app(app)

class NewPwdForm(flask_wtf.FlaskForm):
    token = wtforms.HiddenField('token', [
        validators.InputRequired()])
    new_pwd1 = wtforms.PasswordField('PW', [
        validators.InputRequired(),
        validators.EqualTo('new_pwd2')])
    new_pwd2 = wtforms.PasswordField('PW', [
        validators.InputRequired()])

class AddressForm(flask_wtf.FlaskForm):
    mail = wtforms.StringField('mail', [
        validators.Email(message='WRONG FORMATT'),
        validators.InputRequired(message='PUT IN ADDEESS')])

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True) 
    username = db.Column(db.String(), nullable=False, unique=True)  
    password = db.Column(db.String()) 

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))


@app.route('/', methods=['GET', 'POST'])
def login():
    if request.method == "POST":
        username = request.form.get('username')  
        password = request.form.get('password')  
        user = User.query.filter_by(username=username).first()

        if user is None:
            return render_template('login.html', login_Message="※NO USER※")

        if check_password_hash(user.password, password):
            login_user(user)
            return render_template('index.html', username=str(user.username))
        else:
            return render_template('login.html', login_Message="※WRONG PW※")
    else:
        return render_template('login.html')


def create_token(user_id, secret_key, salt):
    serializer = URLSafeTimedSerializer(secret_key)
    return serializer.dumps(user_id, salt=salt)


def load_token(token, secret_key, salt, max_age=600):
    serializer = URLSafeTimedSerializer(secret_key)
    return serializer.loads(token, salt=salt, max_age=3600)


@app.route('/sendMovement', methods=['GET', 'POST'])
@login_required
def sendMovement():
    if request.method == "POST":
        PostMonement = str(request.form['Monement'])  

        if PostMonement == "move_one":
            GPIO_Control_SendMQTT_One.send()

        if PostMonement == "move_two":
            GPIO_Control_SendMQTT_Two.send()

        if PostMonement == "move_three":
            GPIO_Control_SendMQTT_Three.send()


    return render_template('index.html')

if __name__ == "__main__":
    app.run(host='0.0.0.0', threaded=True, debug=True)



SendToRPi.js

function one_click() {
    Movement("move_one");
    return;
}

function two_click() {
    Movement("move_two");
    return;
}


function three_click() {
    Movement("move_three");
    return;
}


function Movement(strMovement) {
    var fData = new FormData();
    fData.append('Monement', strMovement);
    ajaxSend(fData, '/sendMovement')
    return;
}

function ajaxSend(fData, urlFlask) {
    //ajax
    $.ajax({
        url: urlFlask,
        type: 'POST',
        async: false,
        data: fData,
        contentType: false,
        processData: false,
        success: function(data, dataType) {
            console.log('Success', data);
        },
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            console.log('Error : ' + errorThrown);
        }
    });
}



索引.html

<!DOCTYPE html>
<html>

<body>
    <button type="button" onclick="one_click();">ONE</button>
    <button type="button" onclick="two_click();">TWO</button>
    <button type="button" onclick="three_click();">THREE</button>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/qs/6.7.0/qs.min.js"></script>
    <script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
    <script src="/static/SendToRPi.js?p=(new Date()).getTime() "></script>
</body>

</html>

檢查 MQTT qos 並保留配置。 如果 qos = 0,則一條消息有可能覆蓋另一條消息(意味着消息將最多發送一次)檢查:[https://www.hivemq.com/blog/mqtt-essentials-part-6- mqtt-服務質量級別/][1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM