【问题标题】:Javascript and Python - Best communication methodJavascript 和 Python - 最佳沟通方式
【发布时间】:2018-05-12 01:50:27
【问题描述】:

我正在尝试制作一个 html/javascript 控制的树莓派机器人。

到目前为止,我已经安装了 LAMP 服务器,并且正在托管一个带有按钮的本地网页,这些按钮可以触发事件并通过 AJAX 向我的机器人发送命令。 AJAX 调用一个 php 脚本,该脚本调用一个 python 脚本(无 CGI)来控制机器人。

这个解决方案目前对我有用,我可以通过 html 控制我的树莓派硬件并简单地来回发送数据。

现在我想要做的是,在我的网页上,有一个开/关按钮,用于初始化和关闭机器人,以及其他事件(当前从 android 设备中的加速度计测量倾斜角度)控制机器人的速度。这就是我对事情如何运作的过程感到困惑的地方。

当我进行 AJAX 调用以启动机器人时,该 ajax 调用在 python 脚本结束(机器人关闭)之前不会关闭。因此,我运行了一个 python 脚本(start.py),其中包含我的机器人对象,其中存储了更改速度的方法。如果我在 JS 中有单独的事件来更改速度(发送对 changespeed.py 的调用),我如何更改存储在已经运行的不同 python 脚本(start.py)中的对象的属性(见图下面)?

到目前为止我想到的可能的解决方案:

1) 将对象存储在内存中的某处。也许作为一个 python 对象,或者将其属性存储在 SQL 数据库中。这样,changespeed.py(或直接Javascript)可以改变那个内存中的速度属性,并且start.py可以连续读取它们。

2) 与其通过 AJAX 将新的速度值发送到 python,不如让 python 尝试从 javascript 变量中检索值。换句话说,不是 javascript 向 python 提供数据,而是让 python 从 javascript 中获取数据(抓取?)。

3)放弃我目前让javascript和python通过AJAX和php进行通信的方法,并设置一个websocket来交换数据。我还不知道它是如何工作的,但它可能是我需要的解决方案。

4) 我也没有对中断进行任何编程,对此我了解不多。是否可以让我的主脚本运行并且当速度需要改变时,我可以随时发送中断?

如果我的问题有点含糊或冗长,我很抱歉。我现在脑子里有很多事情要做。如果不清楚,请告诉我。谢谢。

TLDR:让 javascript 执行 python 脚本然后异步向该脚本提供数据的最佳方法是什么

Map of operations

【问题讨论】:

  • 我所知道的最好的方法是让 JS 做它需要做的任何事情,然后通过 django 或类似的运行将 POST 发送回服务器。
  • “如何更改存储在已运行的不同 python 脚本 (start.py) 中的对象的属性”。在我的脑海中,也许内存中的程序可能有一个线程来监听到它的套接字连接。您的 ajax 请求调用 Web 服务器上的服务器端脚本,该脚本与正在运行的进程建立套接字连接并向其发送数据。正在运行的进程接受连接并对数据进行操作。不知道你是如何用 Python 做这些的,但这是一种理论上的方法。
  • 我目前正在研究使用 websockets。根据我的研究,这似乎是我想做的最好的方法。我成功地创建了一个从 python 到 JS 的 websocket,但是 Apache2 阻碍了我。我目前正在研究是否应该使用 3rd 方软件使 apache2 兼容、使用 nginx 或使用带有 socketio 的烧瓶框架

标签: javascript php python ajax lamp


【解决方案1】:

在我看来,您正在寻找内存中的数据存储,例如 Redis。使用 redis,您可以在内存中创建一个变量,任何支持 Redis 的编程语言都可以访问该变量(几乎所有支持 Redis)。

Redis 还具有 Pub/Sub 功能,允许您在将数据发布到特定通道时执行特定逻辑。例如,如果您的 javascript 程序更改了 redis 中的某些内容,您的 python 程序可以订阅该特定变量,并且知道当 javascript 程序更改该变量的值时执行它自己的逻辑。有关发布/订阅的更多信息,请查看this page

【讨论】:

  • 谢谢。这听起来像是我想用 MySQL 数据库做的事情。我会在接下来的一天左右调查它,我会告诉你进展如何。
【解决方案2】:

你可以使用 cgi - 通用网关接口,通过使用 cgi-cgi.FieldStorage() 你可以在 python 中获取数据。它支持巨大的数据传输和快速。它支持所有的浏览器

【讨论】:

    【解决方案3】:

    我已经使用 Flask-socketIO 在我的网页和我的机器人之间成功设置了一个 websocket。我现在可以使用我的安卓手机中的加速度计来控制我的机器人,但是机器人的响应太慢了。有时机器人最多需要 2 秒才能响应我手机发出的命令。我相信部分问题是我的机器人通过我家中的 wifi 扩展器连接到我的 WLAN。因此,与其将数据通过 wifi 扩展器传递到路由器,再通过扩展器传回,最后传递给机器人,我打算使用我的第二个 wifi 天线作为接入点,并直接连接到机器人。

    最终我计划进入 Android 应用程序开发(我想通过 USB 将我的第二部智能手机连接到机器人,并可以访问加速度计、磁力计、GPS 和相机)。一旦我这样做了,我会考虑通过蓝牙而不是 websocket 连接我的手机和机器人。

    我仍然不知道这是否是最好的方法,但这是我目前的解决方案。

    【讨论】:

      猜你喜欢
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 2011-06-04
      • 2010-10-15
      • 1970-01-01
      相关资源
      最近更新 更多