Javascript 和 Python - 最佳沟通方式
Javascript and Python - Best communication method
我正在尝试制作一个 html/javascript 受控的 raspberry pi 机器人。
到目前为止,我已经安装了一个 LAMP 服务器,我正在托管一个本地网页,其中包含触发事件并通过 AJAX 向我的机器人发送命令的按钮。 AJAX 调用 php 脚本,后者调用 python 脚本(无 CGI)来控制机器人。
这个解决方案目前对我有效,我可以从 html 控制我的 raspberry pi 硬件并简单地来回发送数据。
现在我想做的是,在我的网页上有一个 on/off 按钮,用于初始化和关闭机器人,以及其他事件(目前正在测量来自加速度计的倾斜角android device) 来控制机器人的速度。这就是我对事情如何运作的过程感到困惑的地方。
当我调用 AJAX 启动机器人时,ajax 调用直到 python 脚本结束(机器人关闭)后才会关闭。所以我有一个 python 脚本 运行 (start.py),其中包含我的机器人对象,其中存储了改变速度的方法。如果我在 JS 中有单独的事件来改变速度(向 changespeed.py 发送调用),我如何更改存储在不同 python 脚本(start.py 中的对象的属性) 已经是 运行(见下图)?
到目前为止我想到的可能的解决方案:
1) 将对象存储在内存中的某处。也许作为 python 对象,或将其属性存储在 SQL 数据库中。这样,changespeed.py(或直接Javascript)可以改变那个内存中的速度属性,start.py可以连续读取它们。
2) 让 python 尝试从 javascript 变量中检索值,而不是通过 AJAX 将新的速度值发送到 python。换句话说,不是 javascript 将数据提供给 python,而是让 python 从 javascript 获取数据(抓取?)。
3) 放弃我目前的让javascript和python通过AJAX和php通信的方法,并设置一个websocket来交换数据。我还不知道它是如何工作的,但这可能是我需要的解决方案。
4) 我也没有做过中断编程,对此了解不多。可不可以让我的主脚本运行需要变速的时候,随时发送中断?
如果我的问题有点含糊或冗长,我很抱歉。我现在脑子里想了很多。如果不清楚,请告诉我。谢谢。
TLDR:让 javascript 执行 python 脚本然后异步向该脚本提供数据的最佳方法是什么
Map of operations
我觉得您正在寻找一个内存数据存储,例如 Redis。使用 Redis,您可以在内存中创建一个变量,任何支持 Redis 的编程语言都可以访问该变量(几乎所有语言都支持)。
Redis 还具有 Pub/Sub 功能,允许您在将数据发布到特定通道时执行特定逻辑。例如,如果您的 javascript 程序更改了 redis 中的某些内容,您的 python 程序可以订阅该特定变量,并且知道在 javascript 程序更改值时执行它自己的逻辑那个变量。有关 pub/sub 的更多信息,请查看 this page
您可以使用 cgi — 通用网关接口,通过使用 cgi-cgi.FieldStorage() 您可以获取 python 中的数据。它支持大量数据传输和 fast.it支持所有浏览器
我已经使用 Flask-socketIO 在我的网页和我的机器人之间成功设置了一个 websocket。我现在可以使用 android phone 中的加速度计来控制我的机器人,但是机器人的响应太慢了。有时机器人最多需要 2 秒才能响应我的 phone 的命令。我认为部分问题是我的机器人通过我家里的 wifi 扩展器连接到我的 WLAN。因此,与其将数据通过 wifi 扩展器传递到路由器,再通过扩展器返回,最后传递给机器人,我打算使用我的第二根 wifi 天线作为接入点,并直接连接到机器人。
最终我打算进入 android 应用程序开发(我想通过 USB 将我的第二个智能 phone 连接到机器人并可以访问加速度计、磁力计、GPS 和相机) .完成后,我将考虑通过蓝牙而不是 websocket 连接我的 phone 和机器人。
我仍然不知道这是否是最好的方法,但这是我目前的解决方案。
我正在尝试制作一个 html/javascript 受控的 raspberry pi 机器人。
到目前为止,我已经安装了一个 LAMP 服务器,我正在托管一个本地网页,其中包含触发事件并通过 AJAX 向我的机器人发送命令的按钮。 AJAX 调用 php 脚本,后者调用 python 脚本(无 CGI)来控制机器人。
这个解决方案目前对我有效,我可以从 html 控制我的 raspberry pi 硬件并简单地来回发送数据。
现在我想做的是,在我的网页上有一个 on/off 按钮,用于初始化和关闭机器人,以及其他事件(目前正在测量来自加速度计的倾斜角android device) 来控制机器人的速度。这就是我对事情如何运作的过程感到困惑的地方。
当我调用 AJAX 启动机器人时,ajax 调用直到 python 脚本结束(机器人关闭)后才会关闭。所以我有一个 python 脚本 运行 (start.py),其中包含我的机器人对象,其中存储了改变速度的方法。如果我在 JS 中有单独的事件来改变速度(向 changespeed.py 发送调用),我如何更改存储在不同 python 脚本(start.py 中的对象的属性) 已经是 运行(见下图)?
到目前为止我想到的可能的解决方案:
1) 将对象存储在内存中的某处。也许作为 python 对象,或将其属性存储在 SQL 数据库中。这样,changespeed.py(或直接Javascript)可以改变那个内存中的速度属性,start.py可以连续读取它们。
2) 让 python 尝试从 javascript 变量中检索值,而不是通过 AJAX 将新的速度值发送到 python。换句话说,不是 javascript 将数据提供给 python,而是让 python 从 javascript 获取数据(抓取?)。
3) 放弃我目前的让javascript和python通过AJAX和php通信的方法,并设置一个websocket来交换数据。我还不知道它是如何工作的,但这可能是我需要的解决方案。
4) 我也没有做过中断编程,对此了解不多。可不可以让我的主脚本运行需要变速的时候,随时发送中断?
如果我的问题有点含糊或冗长,我很抱歉。我现在脑子里想了很多。如果不清楚,请告诉我。谢谢。
TLDR:让 javascript 执行 python 脚本然后异步向该脚本提供数据的最佳方法是什么
Map of operations
我觉得您正在寻找一个内存数据存储,例如 Redis。使用 Redis,您可以在内存中创建一个变量,任何支持 Redis 的编程语言都可以访问该变量(几乎所有语言都支持)。
Redis 还具有 Pub/Sub 功能,允许您在将数据发布到特定通道时执行特定逻辑。例如,如果您的 javascript 程序更改了 redis 中的某些内容,您的 python 程序可以订阅该特定变量,并且知道在 javascript 程序更改值时执行它自己的逻辑那个变量。有关 pub/sub 的更多信息,请查看 this page
您可以使用 cgi — 通用网关接口,通过使用 cgi-cgi.FieldStorage() 您可以获取 python 中的数据。它支持大量数据传输和 fast.it支持所有浏览器
我已经使用 Flask-socketIO 在我的网页和我的机器人之间成功设置了一个 websocket。我现在可以使用 android phone 中的加速度计来控制我的机器人,但是机器人的响应太慢了。有时机器人最多需要 2 秒才能响应我的 phone 的命令。我认为部分问题是我的机器人通过我家里的 wifi 扩展器连接到我的 WLAN。因此,与其将数据通过 wifi 扩展器传递到路由器,再通过扩展器返回,最后传递给机器人,我打算使用我的第二根 wifi 天线作为接入点,并直接连接到机器人。
最终我打算进入 android 应用程序开发(我想通过 USB 将我的第二个智能 phone 连接到机器人并可以访问加速度计、磁力计、GPS 和相机) .完成后,我将考虑通过蓝牙而不是 websocket 连接我的 phone 和机器人。
我仍然不知道这是否是最好的方法,但这是我目前的解决方案。