我正在尝试找到一种在服务器端使用 GPIO 输入将客户端重定向到另一个网页的方法 rpi, RPi.GPIO, python, flask,j s

I'm trying to find a way of using a GPIO input on the server side to redirect the client side to another web page rpi, RPi.GPIO, python, flask,j s

我正在做密室逃脱项目。实际上,我试图创建的行为如下:

Web 浏览器以通常的方式显示部分 Web 应用程序。从此时起,客户端上的 keyboard/mouse 将不再有进一步的输入。我已经使用 JS 解决了基于时间的更改,因此我可以加载 Web 应用程序,并且在一段时间后 JS 重定向到另一个应用程序路由。这是我开始挣扎的地方以及基于时间的重定向我想要服务器端的 GPIO 输入以使浏览器重定向到另一个应用程序路由。

我正在使用线程,因此当应用程序路由函数运行时,它会在等待 GPIO 输入的函数上启动线程 运行。 waitfortrigger 函数正常工作并运行,直到我尝试 return 重定向。那时我在 Flask 调试日志中收到一个未知的上下文错误。我可以使用 app.app_contextapp.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 用于 Web 应用程序可能不是最佳解决方案? 我边学边学,如有任何建议,我将不胜感激。

最后我努力做到这一点.... 从 rpi GPIO 获取输入的函数现在创建一个文件。 在我的主应用程序中,我创建了一个带有 if 语句的新 flask 路由。如果文件不存在函数 returns a 404。 在客户端的 js 中,我查询 url,如果它返回 200,这仅在文件存在时发生,它会进行重定向。

有效地使更改服务器端重定向客户端成为可能。

我将输入更改为 pwm so 并有效地创建了一个安全的弹子锁,当正确输入代码时,它会重定向显示在逃生室屏幕上的网络应用程序。

感谢在我原来的问题中花时间纠正我的拼写和语法的人。

现在如果我能弄清楚为什么我的 rpi 会重复执行我的代码嗯嗯