import sys # NOQA: E402
|
import os
|
from flask import Flask
|
import pika
|
import uuid
|
import queue
|
from werkzeug.wrappers import request
|
from threading import Thread
|
from datetime import datetime
|
|
|
|
from .engine.DeviceManager import DeviceManager
|
from .engine import MessageThreads as ths
|
from .protos import aerial_pb2 as pb
|
|
|
|
class MyServer(Flask):
|
def __init__(self, host, user, password, queue, port, SAVEfolder):
|
Flask.__init__(self, __name__)
|
self.host = host
|
self.user = user
|
self.password = password
|
self.queue = queue
|
self.port = port
|
global save_folder
|
save_folder = SAVEfolder
|
|
|
self.route('/api', methods=['POST'])(self.api)
|
self.route('/', methods=['GET'])(self.hello)
|
self._def_routes()
|
# threads
|
|
# queue
|
self.command_request_queue = queue.Queue()
|
|
def _connect_to_MQ(self):
|
credentials = pika.PlainCredentials(self.MQuser, self.MQpassword)
|
self.parameters = pika.ConnectionParameters(
|
credentials=credentials, host=self.MQhost)
|
# 连接队列服务器
|
connection = pika.BlockingConnection(self.parameters)
|
print(f"connected to MQ server: {self.MQhost} with user {self.MQuser}")
|
connection.close()
|
|
|
|
def _message_receiver_Thread_launcher(self):
|
|
def callback(ch,method,properties,body):
|
timestamp = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
|
print(f"[x] {timestamp} | [{method.routing_key}]:{body}")
|
|
target_args = (self.parameters,
|
"message_topic",
|
"topic",
|
"message_queue",
|
["server.server.message", "server.server0.message"],
|
callback)
|
|
self.message_receiver_thread = Thread(target=ths.message_receiver,
|
args=target_args)
|
self.message_receiver_thread.setDaemon(True)
|
self.message_receiver_thread.start()
|
|
|
def _image_receiver_Thread_launcher(self):
|
|
def callback(ch,method,properties,body):
|
|
timestamp = datetime.now().strftime('%Y-%m-%d-%H-%M-%S')
|
print(f"[x] {timestamp} | [{method.routing_key}]:{body}")
|
|
target_args = (self.parameters,
|
"message_topic",
|
"topic",
|
"message_queue",
|
["server.server.message", "server.server0.message"],
|
callback)
|
|
self.message_receiver_thread = Thread(target=ths.message_receiver,
|
args=target_args)
|
self.message_receiver_thread.setDaemon(True)
|
self.message_receiver_thread.start()
|
|
|
|
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):
|
|
self.command_request_queue.put(ths.Message(None,None,req.command,req.target))
|
return
|
|
def _default(self, req: pb.RequestCommand, resp: pb.ResponseCommand):
|
print('onknown command')
|
|
def api(self):
|
|
req = pb.RequestCommand()
|
req.ParseFromString(request.data)
|
|
# a function: _on_sys_command, refer to self._on_sys_command
|
dispatcher = self.routes.get(req.sys_command, self._default)
|
|
resp = pb.ResponseCommand()
|
dispatcher(req, resp) # call the function
|
|
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):
|
self._connect_to_MQ()
|
self._start_device_state_up_msg_receiver_thread()
|
self._start_alarm_state_up_msg_receiver_thread()
|
self._start_command_response_receiver_thread()
|
self._start_command_request_sender_thread()
|
|
def run_all(self):
|
self.run_rabbitmq()
|
self.run(debug=False, host=self.WEBhost, port=self.WEBport)
|