【问题标题】:HTML variables to Python fileHTML 变量到 Python 文件
【发布时间】:2015-02-12 21:37:47
【问题描述】:

我正在使用 Raspberry Pi 构建遥控汽车,它通过 ssh 键盘输入完美地运行 Python 脚本。我希望它能够脱离手机的陀螺仪。我创建了一个 Apache Web 服务器并使用以下源代码:http://www.html5rocks.com/en/tutorials/device/orientation/deviceorientationsample.html 尝试获取陀螺仪信息。我正确接收网页上的输入,并且它正在正确显示/移动图像。我现在需要将 3 个变量导出到我在同一个 Raspberry Pi 上运行的 python 脚本。我不知道从哪里开始使用什么来跨两个平台导出这些变量。此外,变量需要能够每 10 毫秒更新一次。我不知道这是否是最好的设置方式,或者使用 Node.js 之类的东西是否会更容易?任何帮助将不胜感激!

【问题讨论】:

  • 有趣的设置。只是为了确保我了解架构......目前,网络浏览器正在手机上运行并访问 RPi 的网络服务器以获取 HTML,现在您需要一种方法让浏览器将陀螺仪信息发送到您的 RPi?
  • 手机正在运行网络浏览器,但网络服务器实际上托管在树莓派上,与我尝试将信息发送到的 python 文件位于同一目录中。我需要一个从网络服务器到 python 文件的桥梁。

标签: python html webserver raspberry-pi raspbian


【解决方案1】:

有很多方法可以解决这个问题,尽管许多方法的延迟可能比您想要的要长(10 毫秒应该是一个合理的目标,尽管我对手机端的了解不够多,无法知道它是否以该速率生成数据) 但挑战将是从电话中获取数据,大概是通过与 RPi 的无线链接,然后及时处理。具有较低延迟的高级方法(我不打算在这里尝试编写)将使用带有 web 套接字的 node.js 之类的东西来监听来自网页的更新(然后需要修改网页代码以使用 websockets)并且还做任何你的 python 脚本正在做的事情。一个更快、更脏但纯粹的 python 解决方案(加上一点 javascript)看起来像:

  1. 配置 apache 以使用 cgi
  2. 将以下代码放到您的 cgi-bin 目录中
import socket
import cgi

form = cgi.FieldStorage
x = form["x"]
y = form["y"]
z = form["z"]
s = socket.socket()
s.connect(("localhost",5000))
s.send(",".join([x,y,z]))
print "Content-Type: text/text"     
print                               
print "Debug: sent",x,y,z
  1. 在您的 javascript 代码中,使用 jquery 以每 10 毫秒向 http:///cgi-bin/dumpdata.cgi?x=&y=&z= (或您想要传递的任何值)发出请求。
    编辑以添加 ajax 示例: 假设您使用了链接到的示例代码,请在标签内的某处添加 <script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>(或下载 jquery 并在您的网络服务器上运行,如果您要通过 wifi 运行所有内容,这可能会更好)

    在您的 &lt;body&gt; 中,可选择创建一个 div id="debug">Waiting for response</div>

    然后在 deviceOrientationHandler 函数中,您应该能够执行类似的操作

  url = "/cgi-bin/dumpdata.cgi?x="+tiltLR+"&y="+tiltFB+"&z="+dir;
$.ajax({url: url, success: function(result){
        //result will hold the results passed back by the CGI
        $("#debug").html(result);
    }});
  1. 在您的 python 脚本(我假设它有一个事件循环)中,让它执行如下操作:
   import socket
   s = socket.socket()
   s.bind(("",5000))
   s.listen(5)
   while True:
      cli,addr = s.accept()
      x,y,z = cli.recv(1000).split(",")
      print "DEBUG",x,y,z
      cli.close()
      # do the rest of your loop

【讨论】:

  • 感谢您的回复!我将 apache 配置为使用 cgi,然后将 #2 代码放入名为 dumpdata.cgi 的文件中。之后我尝试编写 javascript 但我不知道如何获取 jquery 设置?你认为你可以为我指明正确的方向吗?
  • 查看内联编辑;请注意,这是一种用胶带和打包线完全粘合在一起的解决方案,这样您就可以快速完成工作;一旦你有基本的设置工作,我强烈建议你研究 websockets 等
  • 还请注意,如前所述,我不知道更新的数据速率;您可能会发现 deviceOrientationHandler 以高于 100 Hz 的速率被调用(如果您希望每 10 毫秒更新一次,这可能是您想要的),在这种情况下,您可能需要添加一些额外的逻辑。还意识到使用 TCP 有点不必要......将 TCP 换成 UDP 套接字也是一个很好的中间步骤。
  • 我查看了 websocket 连接,发现自己在我的头上(我知道的最先进的编程语言是 python)我在想,我试图运行的整个程序是构建一个 GUI ,但是如果我使用 HTML 作为 gui,你认为这样的方法是否可行,然后让某些 python 脚本向前和向后转动轮子等等。raspberrywebserver.com/gpio/piface/… 另外我想知道是否有直接的方式与来自 html 的 gpio 引脚?
  • 马特:我们现在已经接近或处于主持人应该介入并说去聊天的地步。我建议将 html 中的 gpio 作为一个单独的问题提出。 (AFAIK 不,尤其是当服务器在一个平台上而浏览器在另一个平台上时,但您当然可以使用 ajax 到 cgi-bin 机制进行原型设计)
猜你喜欢
  • 2021-04-14
  • 2019-01-18
  • 2021-08-16
  • 2014-02-03
  • 2020-12-16
  • 1970-01-01
  • 2013-12-12
  • 2013-12-11
  • 1970-01-01
相关资源
最近更新 更多