我正在创建一个简单的web服务器来控制一个小马达。当我通过命令行直接运行脚本时,一切都按预期运行。当我在服务文件中运行它时,当脚本响应POST命令时,马达没有运行。在根用户(sudo crontab-e)下通过cron@reboot启动时,会产生相同的结果,但没有电机控制
脚本:
#!/usr/bin/env python3
from http.server import BaseHTTPRequestHandler, HTTPServer
import urllib
import threading
import json
import cgi
import time
import RPi.GPIO as GPIO
GPIO.cleanup() #cleaning up in case GPIOS have been preactivated
# Use BCM GPIO references
# instead of physical pin numbers
GPIO.setmode(GPIO.BCM)
# be sure you are setting pins accordingly
# GPIO10,GPIO9,GPIO11,GPI25
control_pins = [10,9,11,25]
# Set all pins as output
for pin in control_pins:
GPIO.setup(pin,GPIO.OUT)
GPIO.output(pin, False)
#define halftep sequance
halfstep_seq = [
[1,0,0,0],
[1,1,0,0],
[0,1,0,0],
[0,1,1,0],
[0,0,1,0],
[0,0,1,1],
[0,0,0,1],
[1,0,0,1]
]
bRunLeft = False
bRunRight = False
#wait some time to start
time.sleep(0.5)
def clearpins():
for pin in control_pins:
GPIO.output(pin, 0)
def spin_servo(dir):
print('Starting spin {}'.format(dir))
if dir == 'left':
while bRunLeft:
for halfstep in range(8):
for pin in range(4):
GPIO.output(control_pins[pin], halfstep_seq[halfstep][pin])
time.sleep(0.001)
elif dir == 'right':
while bRunRight:
for halfstep in reversed(range(8)):
for pin in range(4):
GPIO.output(control_pins[pin], halfstep_seq[halfstep][pin])
time.sleep(0.001)
clearpins()
class WebServerHandle(BaseHTTPRequestHandler):
def _set_response(self):
self.send_response(200)
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Content-type', 'application/json')
self.end_headers()
def do_POST(self):
global bRunLeft
global bRunRight
res = {}
length = int(self.headers['Content-Length'])
ctype, pdict = cgi.parse_header(self.headers['content-type'])
# refuse to receive non-json content
if ctype != 'application/json':
self.send_response(400)
self.end_headers()
return
res['received'] = 'ok'
o = json.loads(self.rfile.read(length).decode('utf-8'))
# You now have a dictionary of the post data
if o['move'] == 'left':
bRunRight = False
if bRunLeft == False:
l = threading.Thread(target=spin_servo, args=('left',))
l.start()
bRunLeft = True
else:
bRunLeft = False
if o['move'] == 'right':
bRunLeft = False
if bRunRight == False:
r = threading.Thread(target=spin_servo, args=('right',))
r.start()
bRunRight = True
else:
bRunRight = False
self._set_response()
# self.wfile.write("POST request for {}".format(self.path).encode('utf-8'))
self.wfile.write(json.dumps(res).encode('utf-8'))
def do_OPTIONS(self):
self.send_response(200)
self.send_header('Allow', 'GET, OPTIONS')
self.send_header('Access-Control-Allow-Origin', '*')
self.send_header('Access-Control-Allow-Headers', 'X-Request, X-Requested-With, Content-type, content-type')
self.send_header('Content-Length', '0')
self.end_headers()
def main():
try:
server = HTTPServer(('', 8080), WebServerHandle)
print("Starting web server on the port 8080..")
server.serve_forever()
except KeyboardInterrupt:
print('^C entered. Shutting down the server..')
server.socket.close()
GPIO.cleanup()
if __name__ == '__main__':
main()
服务文件
[Unit]
Description=Simple servo web controller
After=network.target
[Service]
User=root
WorkingDirectory=/home/pi/streamer
ExecStart=/home/pi/streamer/servo_server.py
Restart=on-failure
[Install]
WantedBy=multi-user.target
目前没有回答
相关问题 更多 >
编程相关推荐