我正在尝试找到一种在服务器端使用 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_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 用于 Web 应用程序可能不是最佳解决方案?
我边学边学,如有任何建议,我将不胜感激。
最后我努力做到这一点....
从 rpi GPIO 获取输入的函数现在创建一个文件。
在我的主应用程序中,我创建了一个带有 if 语句的新 flask 路由。如果文件不存在函数 returns a 404。
在客户端的 js 中,我查询 url,如果它返回 200,这仅在文件存在时发生,它会进行重定向。
有效地使更改服务器端重定向客户端成为可能。
我将输入更改为 pwm so 并有效地创建了一个安全的弹子锁,当正确输入代码时,它会重定向显示在逃生室屏幕上的网络应用程序。
感谢在我原来的问题中花时间纠正我的拼写和语法的人。
现在如果我能弄清楚为什么我的 rpi 会重复执行我的代码嗯嗯
我正在做密室逃脱项目。实际上,我试图创建的行为如下:
Web 浏览器以通常的方式显示部分 Web 应用程序。从此时起,客户端上的 keyboard/mouse 将不再有进一步的输入。我已经使用 JS 解决了基于时间的更改,因此我可以加载 Web 应用程序,并且在一段时间后 JS 重定向到另一个应用程序路由。这是我开始挣扎的地方以及基于时间的重定向我想要服务器端的 GPIO 输入以使浏览器重定向到另一个应用程序路由。
我正在使用线程,因此当应用程序路由函数运行时,它会在等待 GPIO 输入的函数上启动线程 运行。 waitfortrigger
函数正常工作并运行,直到我尝试 return 重定向。那时我在 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 用于 Web 应用程序可能不是最佳解决方案? 我边学边学,如有任何建议,我将不胜感激。
最后我努力做到这一点.... 从 rpi GPIO 获取输入的函数现在创建一个文件。 在我的主应用程序中,我创建了一个带有 if 语句的新 flask 路由。如果文件不存在函数 returns a 404。 在客户端的 js 中,我查询 url,如果它返回 200,这仅在文件存在时发生,它会进行重定向。
有效地使更改服务器端重定向客户端成为可能。
我将输入更改为 pwm so 并有效地创建了一个安全的弹子锁,当正确输入代码时,它会重定向显示在逃生室屏幕上的网络应用程序。
感谢在我原来的问题中花时间纠正我的拼写和语法的人。
现在如果我能弄清楚为什么我的 rpi 会重复执行我的代码嗯嗯