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()
|