У меня есть Beaglebone Black, подключаемый к устройствам шины CAN: Аккумулятор.Как использовать несколько ioloop в торнадо и обмениваться данными между ioloop (s)?
Торнадо веб работает на Beaglebone Черный как графический интерфейс.
CAN цикл чтения шины продолжайте чтение данных из CAN шины, чтобы обновить состояние экземпляра батареи
Но как я могу сделать два IOLOOP работать вместе и совместно экземпляр батареи?
Торнадо Веб:
class Battery(object):
status = {}
class API_Handler(web.RequestHandler):
def get(self, dev, cmd):
if cmd == 'data':
self.write(self.application.battery0.status)
class Application(web.Application):
def __init__(self):
self.battery0 = Battery('bat0')
routing = [
(r'/api/battery/(data|)', API_Handler),
]
settings = {
'template_path': os.path.join(os.path.dirname(__file__), "templates"),
'static_path': os.path.join(os.path.dirname(__file__), "static"),
}
web.Application.__init__(self, routing, debug=True, **settings)
if __name__ == "__main__":
import tornado
app = Application()
app.listen(address='0.0.0.0', port=8888)
tornado.ioloop.IOLoop.instance().start()
CAN шина чтение цикл, код:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import errno
import functools
import tornado.ioloop
import socket
import struct
can_frame_fmt = "=IB3x8s"
can_frame_size = struct.calcsize(can_frame_fmt)
def build_can_frame(can_id, data):
can_dlc = len(data)
data = data.ljust(8, b'\x00')
return struct.pack(can_frame_fmt, can_id, can_dlc, data)
def dissect_can_frame(frame):
can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
return (can_id, can_dlc, data[:can_dlc])
def connection_ready(sock, fd, events):
while True:
try:
cf, addr = sock.recvfrom(can_frame_size)
except socket.error as e:
if e.args[0] not in (errno.EWOULDBLOCK, errno.EAGAIN):
raise
return
dissect_can_frame(cf)
if __name__ == '__main__':
sock = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
sock.bind(('can0',))
sock.setblocking(0)
io_loop = tornado.ioloop.IOLoop.current()
callback = functools.partial(connection_ready, sock)
io_loop.add_handler(sock.fileno(), callback, io_loop.READ)
io_loop.start()
Если вы используете Торнадо, который способен [WebSockets] (https://en.wikipedia.org/wiki/WebSocket), поэтому пользователь должен отправить команда для получения статуса? Вам просто нужно запустить поток, который будет считывать состояние батареи с указанной частотой и автоматически обновлять браузер через соединение с веб-разъемом. – yegorich
@yegorich Я знаю ваше беспокойство. но это всего лишь пример cmd. У меня также много других команд. Другая причина заключается в том, что данные внутри изменяются гораздо чаще, но графический интерфейс не требуется обновлять с той же частотой. Третья причина заключается в том, что это позволяет другому модулю использовать тот же API для запроса данных на своей собственной частоте. –