Фоновая задача для сервера веб-сокетов
Я хотел бы запустить сервер веб-сокетов, чтобы обеспечить интерфейс к плате Raspberry Pi. В частности, я хотел бы постоянно опрашивать датчик, обрабатывать ввод из веб-сокета со ссылкой на переменную и затем запускать двигатель, если это необходимо.
Я думал, что смогу иметь __init__
метод на подклассе WebSocketServerProtocol
которые сделали датчики опроса и работающие двигатели, и с onMessage()
метод для обработки ввода от клиента и возврата текущего состояния системы, однако я боюсь, что я не правильно понимаю WebSocketServerProtocol
а также WebSocketServerFactory
и я, кажется, не могу сохранить фоновую задачу в разных соединениях.
Какой лучший способ добиться того, чего я хочу? Возможно, autobahn излишний - на подключенном компьютере всегда будет только один клиент, поэтому параллелизм в этом смысле не проблема. Я просто хотел бы, чтобы двигатели и датчики опроса не блокировались для обеспечения бесперебойной работы.
1 ответ
Одна вещь, которую вы можете сделать, это запустить опрос датчиков и модули http/motor в разных потоках.
Я думаю, что вы можете легко решить свою проблему, не создавая ненужных дополнительных зависимостей для автобана.
Проверьте предоставленный Python SimpleHTTPServer
(Python 2.x) или http.server
(python 3.x) модули.
Вам просто нужно было бы создать подкласс SimpleHTTPRequestHandler
класс, чтобы обеспечить do_POST()
или же do_GET()
метод (ы), которые делают работу (они занимают место вашего onMessage()
звоните) как в следующем наброске:
import threading
from SimpleHTTPServer import SimpleHTTPRequestHandler
from BaseHTTPServer import BaseHTTPServer
def poll():
...
class MyHandler(SimpleHTTPRequestHandler):
protocol_version = "HTTP/1.0"
def do_POST(self):
if all_ok_with_the_request:
motor.run()
def do_GET(self):
self.wfile.write("status = {}".format(status))
def runServer(address, port):
httpd = BaseHTTPServer( (address, port), MyHandler )
httpd.serve_forever()
threading.Thread(target=poll).run()
threading.Thread(target=runServer).run()