Я пытаюсь найти способ использования ввода GPIO на стороне сервера для перенаправления клиентской стороны на другую веб-страницу rpi, RPi.GPIO, python, flask, js - PullRequest
1 голос
/ 02 октября 2019

Я работаю над проектом Escape room. По сути, я пытаюсь создать такое поведение:

Веб-браузер отображает часть веб-приложения обычным способом. С этого момента больше не будет ввода от клавиатуры / мыши на клиенте. Я решил использовать временные изменения с помощью JS, чтобы я мог загрузить веб-приложение и через некоторое время перенаправить JS на другой маршрут приложения. Здесь я начинаю бороться, а также перенаправления, основанные на времени. Я хочу, чтобы вход GPIO на стороне сервера заставлял браузер перенаправлять на другой маршрут приложения.

Я использую многопоточность, поэтому при запуске функции маршрута приложенияон запускает поток, выполняющий функцию, которая ожидает ввода GPIO. Функция waitfortrigger работает и работает как надо, пока я не попытаюсь вернуть перенаправление. В этот момент я получаю неизвестную контекстную ошибку в журнале отладки Flask. Я могу исправить ошибку, используя app.app_context и app.app_context.push. В этот момент функция waitfortrigger запускается без ошибок, но не вызывает перенаправления на стороне клиента. Я также пытался использовать copy_current_context decorator, но не совсем понял, как его использовать, но безуспешно. Вы можете заметить, что я использую URL для перенаправления, а не функцию url_for. Это потому, что без запроса на стороне клиента url_for не может создать URL, на который я пытаюсь перенаправить. Использование полного URL на самом деле не проблема для того, что я пытаюсь сделать.

Я думаю, что я прав, говоря, что причина не работает на стороне клиента, потому что запрос непришло со стороны клиента и находится в потоке, отличном от основного приложения, так что оно не понимает, что перенаправить.

Вот упрощенная версия кода, который я пытаюсь:

from flask import Flask, render_template, redirect, url_for, session, logging
import RPi.GPIO as GPIO
import threading

app = Flask(__name__)
input_pin = 18

def gpio_setup():
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(input_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def waitfortrigger():
    while GPIO.input(input_pin) == GPIO.HIGH:
        continue
    else:
        con.push()
        return redirect('http://192.168.0.17:5000/page2')

@app.route('/')
def home():
    trig_thread.start()
    global con
    con = app.app_context()
    return render_template('home.html')

@app.route('/page2')
def page2():
    GPIO.cleanup()
    return render_template('page2.html')

if __name__ == '__main__':
    gpio_setup()
    app.secret_key='test'
    trig_thread = threading.Thread(target=waitfortrigger)
    app.run(debug=True, host='0.0.0.0')

Что я думаю сейчас: возможно, есть способ, которым я могу использовать функцию waitfortrigger для обновления чего-либо на стороне сервера, когда он видит вход GPIO и, в свою очередь, отслеживает что-то с помощью JS, а затем перенаправляет в JS на клиентесторона?

Или, может быть, использование Flask для веб-приложения для этого не лучшее решение? Я учусь на ходу, поэтому буду признателен за любые предложения.

1 Ответ

0 голосов
/ 02 ноября 2019

В итоге я потренировался, чтобы сделать это .... Функция, которая принимает входные данные от rpi GPIO, теперь создает файл. В моем основном приложении я создал новый маршрут фляги с оператором if. Если файл не существует, функция возвращает 404. В js на стороне клиента я запрашиваю URL-адрес, если он возвращает 200, что происходит только тогда, когда файл существует, он выполняет перенаправление.

Эффективное выполнениеможно сделать изменения на стороне сервера, перенаправить на сторону клиента.

Я изменил ввод на pwm, поэтому эффективно создал безопасную блокировку тумблера, которая при правильном вводе кода перенаправляет веб-приложение, отображаемое на экране вквест комната.

Спасибо человеку, который нашел время, чтобы исправить мое правописание и грамматику в моем первоначальном вопросе.

Теперь, если я смогу просто понять, почему мой rpi выполняет двойной код, хммм

...