wu_xinjun
2022-03-25 6e6504475a0ef865ed1d47f78c89f56762965b3c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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()