import sys # NOQA: E402 import os from flask import Flask, request from .engine.DeviceManager import DeviceManager from .engine.MessageQueueThread import MessageQueueThread from .protos import aerial_pb2 as pb class MyServer(Flask): def __init__(self, host, user, password, queue, port): Flask.__init__(self, __name__) self.host = host self.user = user self.password = password self.queue = queue self.port = port self.route('/api', methods=['POST'])(self.api) self.route('/', methods=['GET'])(self.hello) self._def_routes() self._device_manager = DeviceManager(host, user, password) def _def_routes(self): self.routes = { pb.SysCommand.SYS_COMMAND: self._on_sys_command, } def _on_sys_command(self, req: pb.RequestCommand, resp: pb.ResponseCommand): if pb.SubCommand.POWER_ON_SUB_COMMAND == req.sub_command: print('power on message received') self._device_manager.get_device(req.device_id,save_folder) elif pb.SubCommand.POWER_OFF_SUB_COMMAND == req.sub_command: device = self._device_manager.get_device(req.device_id,save_folder) device['power_on'] = False print('power off message received') return def _default(self, req: pb.RequestCommand, resp: pb.ResponseCommand): print('onknown command') def api(self): req = pb.RequestCommand() req.ParseFromString(request.data) dispatcher = self.routes.get(req.sys_command, self._default) resp = pb.ResponseCommand() dispatcher(req, resp) resp.checksum = 12345 response = Flask.response_class( resp.SerializeToString(), mimetype='application/x-protobuf' ) return response, 200 def hello(self): return 'Hello, This is acquisition demo API!' def run_rabbitmq(self, host: str, user: str, password: str, queue: str) -> None: self._message_queue_thread = MessageQueueThread( host, user, password, queue, self._device_manager, save_folder) self._message_queue_thread.start() def run_all(self): self.run_rabbitmq(self.host, self.user, self.password, self.queue) self.run(debug=False, host="0.0.0.0", port=self.port) def send_controll_message(self, device_id, msg): device = self._device_manager.get_device(device_id,save_folder) if device is None: channel = device.controll_channel channel.basic_publish( exchange='', routing_key='', body=msg.SerializeToString()) def send_dust_cleaner_cmd(self, device_id, sub_cmd, period): msg = pb.ControllMessage() msg.sys_command = pb.ControlSysCommand.DUST_CLEANER_COMMAND msg.sub_command = sub_cmd data_msg = pb.DustCleanerMessage() data_msg.period = period data1_str = data_msg.SerializeToString() msg.data1.length = len(data1_str) msg.data1.data = data1_str if __name__ == "__main__": def help(): print("Usage: Server.py [MQhost] [MQuser] [MQpassword] [QUEUEname] [WEBport] [SAVEfolder]") print("EXAMPLE: Server.py localhost chai password123 aerial_rpc 5000 ./Images") exit(1) if len(sys.argv) != 7: help() try: MQhost = str(sys.argv[1]) MQuser = str(sys.argv[2]) MQpassword = str(sys.argv[3]) QUEUEname = str(sys.argv[4]) WEBport = int(sys.argv[5]) SAVEfolder = str(sys.argv[6]) global save_folder save_folder = SAVEfolder except Exception as e: print(e) help() server = MyServer(host="localhost", user='chai', password='password123', queue='aerial_rpc', port=5000) server.run_all()