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