Esempio n. 1
0
                else:
                    print("session not available")
                    self.set_status(401, "Wrong session ID")
                    self.finish()
            except (ValueError, KeyError) as error:
                print("session access request decode failed ", error)
                self.set_status(400, "unsupported input, JSON required")
                self.finish()
        else:
            self.set_status(400, "JSON input required")
            self.finish()


if __name__ == '__main__':
    # redis_main.flushall()
    redis_main.set("app_info", json.dumps({"status": 2}))  # set app not ready flag.

    drone_list = [{'api_key': '84d440b0ba95c19ccd8e56a2cf0e540694798850', 'vehicle_id': '6gi14TJq'},
                  {'api_key': '20fe4f04fe765cf265b81dbccd54a74303deba39', 'vehicle_id': '1atcQaG8', }]

    print("Init: Checking available drones")
    live_drones = confirm_drones(drone_list)

    redis_main.set("app_info", json.dumps({"status": 1}))  # Set 'app busy confirming drones' flag.
    print("Init: ", len(live_drones), " Drones ready, Connecting over WebSocket")

    ws_clients = []
    if len(live_drones) > 0:
        init_redis_structures(live_drones)
        for drone_info in live_drones:
            ws_clients.append(WebSocketClient(drone_info, None, sub_topics))
                else:
                    print "session not available"
                    self.set_status(401, "Wrong session ID")
                    self.finish()
            except (ValueError, KeyError) as error:
                print "session access request decode failed ", error
                self.set_status(400, "unsupported input, JSON required")
                self.finish()
        else:
            self.set_status(400, "JSON input required")
            self.finish()


if __name__ == '__main__':
    # redis_main.flushall()
    redis_main.set("app_info", json.dumps({"status":
                                           2}))  # set app not ready flag.

    # drone_list = [{'api_key': '84d440b0ba95c19ccd8e56a2cf0e540694798850', 'vehicle_id': '6gi14TJq'},
    #               {'api_key': '20fe4f04fe765cf265b81dbccd54a74303deba39', 'vehicle_id': '1atcQaG8', }]

    # print "Init: Checking available drones"
    # live_drones = confirm_drones(drone_list)

    # redis_main.set("app_info", json.dumps({"status": 1}))  # Set 'app busy confirming drones' flag.
    # print "Init: ", len(live_drones), " Drones ready, Connecting over WebSocket"

    # ws_clients = []
    # if len(live_drones) > 0:
    #     init_redis_structures(live_drones)
    #     for drone_info in live_drones:
    #         ws_clients.append(WebSocketClient(drone_info, None, sub_topics))
Esempio n. 3
0
class WebSocketClient(WebSocketClientBase):
    def __init__(self, drone_info, drone_vec, sub_topics, throttle_rate=6000):
        self.api_key = drone_info["api_key"]  # API key to talk with drone.
        self.vehicle_id = drone_info["vehicle_id"]  # vehicle ID of the drone.
        self.namespace = drone_info["namespace"]  # namespace of the drone
        self.topics_subscribed = []
        self.drone_vec = drone_vec  # drone status vector that will be updated.
        self.topics_to_subscribe = sub_topics
        self.msglib = MsgStructs(self.namespace, throttle_rate)
        self.redis = RedisClient()
        self.redis.connect('localhost')
        super(WebSocketClient, self).__init__()

    def _on_message(self, msg):
        try:
            res = json.loads(msg)
            ioloop.IOLoop.instance().add_callback(partial(self.parse_msg, res))
        except ValueError:
            print "json decoding failed"

    def _on_connection_success(self):
        print('Drone Connected! ', self.vehicle_id)
        deadline = time.time() + 1
        ioloop.IOLoop().instance().add_timeout(
            deadline, functools.partial(self.subscribe_to_topics))

    def _on_connection_close(self):
        print('Connection closed!')

    def _on_connection_error(self, exception):
        print('Connection error: %s', exception)

    def subscribe_to_topics(self):
        for topic in self.topics_to_subscribe:
            self.topics_subscribed.append(topic)
            ioloop.IOLoop.instance().add_callback(
                partial(self.send, json.dumps(self.msglib.sub_msg(topic))))
            # TODO remove debug statement
            # ioloop.IOLoop().instance().add_timeout(time.time()+10, functools.partial(self.stop_client))

    def stop_client(self):
        #  unsubscribe from the data.
        for topic in self.topics_subscribed:
            self.send(json.dumps(self.msglib.get_unsub_msg(topic)))
        # call close method
        self.close()

    def parse_msg(self, msg):
        if isinstance(msg, dict):
            if 'op' in msg.keys():
                if msg['op'] == 'publish':
                    # print msg
                    word6 = msg['topic'][-6:]
                    if word6 == "global":
                        lat = msg['msg']['latitude']
                        lon = msg['msg']['longitude']
                        alt = msg['msg']['altitude']
                        # print lat, lon, "global"
                        self.redis.set(
                            self.vehicle_id + '_gpos',
                            json.dumps({
                                "lat": lat,
                                "long": lon,
                                "alt": alt
                            }))
                    if word6 == "/local":
                        x = msg['msg']['twist']['linear']['x']
                        y = msg['msg']['twist']['linear']['y']
                        z = msg['msg']['twist']['linear']['z']
                        yaw = msg['msg']['twist']['angular']['z']
                        # print x,y,z, "local"
                        self.redis.set(
                            self.vehicle_id + '_lpos',
                            json.dumps({
                                "x": x,
                                "y": y,
                                "z": z,
                                "yaw": yaw
                            }))
                    if word6 == "attery":
                        percent = msg['msg']['percentage']
                        # print percent*100, " % battery"
                        self.redis.set(self.vehicle_id + '_batt',
                                       json.dumps({"percent": percent}))
                    if word6 == "_euler":
                        yaw = msg['msg']['twist']['linear']['z']
                        # print percent*100, " % battery"
                        self.redis.set(self.vehicle_id + '_imu',
                                       json.dumps({"yaw": yaw}))