从JavaScript函数运行Python脚本

从JavaScript函数运行Python脚本,javascript,python,raspberry-pi,gpio,Javascript,Python,Raspberry Pi,Gpio,我们需要运行一个Python代码,该代码将从JavaScript中控制Raspberry Pi 3的GPIO。(JavaScript正在侦听数据库上的更改,当进行更改时,函数将被触发,它应该运行Python代码 (此代码不起作用,如将弹出警报消息,但python代码未运行,否则应点亮LED。我做错了什么? index.html文件 led.py文件 您的代码无法工作,因为您无法直接从浏览器访问和运行服务器上的脚本,您只能使用ajax将数据传递给服务器,因此ajax中的url应该是服务器url,您

我们需要运行一个Python代码,该代码将从JavaScript中控制Raspberry Pi 3的GPIO。(JavaScript正在侦听数据库上的更改,当进行更改时,函数将被触发,它应该运行Python代码

(此代码不起作用,如将弹出警报消息,但python代码未运行,否则应点亮LED。我做错了什么?

index.html文件

led.py文件


您的代码无法工作,因为您无法直接从浏览器访问和运行服务器上的脚本,您只能使用
ajax
将数据传递给服务器,因此ajax中的
url
应该是服务器url,您必须发送
数据

在您的服务器(即Raspberry Pi)上,您需要一个http(web)服务器。该服务器将处理来自javascript的post请求,并相应地控制GPIO。与前面提到的其他服务器一样,您可以使用web开发框架创建一个web服务器来处理请求,或者,我经常使用python标准库的一部分来为像这样的简单应用程序创建自己的GET和POST请求处理程序

下面是一种使用
http.server
where
do_GET
方法创建网页并在将浏览器指向服务器/RPi IP/URL时运行javascript的方法,“do_POST”方法处理ajax发送的POST数据以控制GPIO

web_gpio.py(Python 3语法)

启动浏览器并将浏览器指向服务器/RPi ip(在我的示例中,它是
192.168.0.115:8000
),或者从另一个终端会话运行
curl
命令来模拟GET请求

curl http://192.168.0.115:8000

希望本例能让您了解如何使用简单的web服务器控制服务器上的某些内容。

为什么要用PHP标记此内容?如果可以通过PHP实现这一点?@Magnus Eriksson如果您用心去做,一切都是可能的1.帮助您什么?您仍然没有说出您真正想要做的事情。2.两个选项都有(重写代码或设置服务器)对SO来说太广泛了。3.SO不能代替研究。SO不是免费的编码服务。好的。所以。出于一百万安全原因,浏览器不允许您在计算机上运行任意脚本,当然,您也不能将AJAX请求发布到浏览器外的真实文件。但是,您可以在本地运行web服务器(这是在听127.0.0.1:SOMEPORT),向该Web服务器发出AJAX请求,该Web服务器可以调用Python调用。有人推荐Flask,这是一个非常棒的Python超级简单Web服务器,我推荐它。
import RPi.GPIO as GPIO
import timemGPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(18, GPIO.OUT)
print "LED on"
GPIO.output(18, GPIO.HIGH)
time.sleep(10)
print "LED off"
GPIO.output(18,GPIO.LOW)
import time
import RPi.GPIO as GPIO
from http.server import BaseHTTPRequestHandler, HTTPServer


host_name = '192.168.0.115'    # Change this to your Raspberry Pi IP address
host_port = 8000


class MyHandler(BaseHTTPRequestHandler):
    """ 
    A special implementation of BaseHTTPRequestHander for reading data 
    from and control GPIO of a Raspberry Pi
    """

    def do_HEAD(self):
        self.send_response(200)
        self.send_header('Content-type', 'text/html')
        self.end_headers()

    def _redirect(self, path):
        self.send_response(303)
        self.send_header('Content-type', 'text/html')
        self.send_header('Location', path)
        self.end_headers()

    def do_GET(self):
        html = '''
        <html>
        <body>
        <p>this webpage turn on and then turn off LED after 2 seconds</p>
        <script src="http://code.jquery.com/jquery-1.12.4.min.js"></script>
        <script>
          function setLED()
            {{
              $.ajax({
              type: "POST",
              url: "http://%s:%s",
              data :"on",
              success: function(response) {
                alert("LED triggered")
              }
            });
          }}
          setLED();
        </script>
        </body>
        </html>
        '''
        self.do_HEAD()
        html=html % (self.server.server_name, self.server.server_port)
        self.wfile.write(html.encode("utf-8"))

    def do_POST(self):
        # Get the post data
        content_length = int(self.headers['Content-Length'])
        post_data = self.rfile.read(content_length).decode("utf-8")
        if post_data == "on":
            GPIO.setmode(GPIO.BCM)
            GPIO.setwarnings(False)
            GPIO.setup(18, GPIO.OUT)
            GPIO.output(18, GPIO.HIGH)
            time.sleep(2)
            GPIO.output(18, GPIO.LOW)
        self._redirect('/')


if __name__ == '__main__':

    http_server = HTTPServer((host_name, host_port), MyHandler)
    print("Running server on %s:%s" % (host_name, host_port))
    http_server.serve_forever()
python3 web_gpio.py
curl http://192.168.0.115:8000