1
2
3
4
5
6
7
8
9
10 import rospy
11 import rocon_gateway
12 import uuid
13 import gateway_msgs.msg as gateway_msgs
14 import gateway_msgs.srv as gateway_srvs
15 from urlparse import urlparse
16 import rocon_hub_client
17
18
19 import gateway
20 import hub_manager
21
22
23
24
25
26
28 '''
29 Currently this just provides getup and go for the gateway.
30 '''
31
32
33
34
36 self._param = rocon_gateway.setup_ros_parameters()
37 key = uuid.uuid4()
38 self._unique_name = self._param['name'] + key.hex
39 rospy.loginfo("Gateway : generated unique hash name [%s]" % self._unique_name)
40 self._hub_manager = hub_manager.HubManager(
41 hub_whitelist=self._param['hub_whitelist'],
42 hub_blacklist=self._param['hub_blacklist']
43 )
44 self._gateway = gateway.Gateway(self._hub_manager, self._param, self._unique_name, self._publish_gateway_info)
45 self._gateway_services = self._setup_ros_services()
46 self._gateway_publishers = self._setup_ros_publishers()
47 direct_hub_uri_list = [self._param['hub_uri']] if self._param['hub_uri'] != '' else []
48 self._hub_discovery_thread = rocon_hub_client.HubDiscovery(self._register_gateway, direct_hub_uri_list, self._param['disable_zeroconf'])
49
50
51 self.spin = self._gateway.spin
52
54 '''
55 Clears this gateway's information from the redis server.
56 '''
57 rospy.loginfo("Gateway : shutting down.")
58 try:
59 self._gateway.shutdown()
60 self._hub_manager.shutdown()
61 self._hub_discovery_thread.shutdown()
62 except Exception as e:
63 rospy.logerr("Gateway : unknown error on shutdown [%s][%s]" % (str(e), type(e)))
64 raise
65
66
67
68
69
71 '''
72 Called when either the hub discovery module finds a hub
73 or a request to connect via ros service is made.
74
75 It starts the actual redis connection with the hub and also
76 registers the appropriate information about the gateway on
77 the hub.
78
79 Note, the return type is only really used by the service callback
80 (ros_service_connect_hub).
81
82 @return error code and message
83 @rtype gateway_msgs.ErrorCodes, string
84
85 @sa hub_discovery.HubDiscovery
86 '''
87 hub, error_code, error_code_str = self._hub_manager.connect_to_hub(ip, port)
88 if hub:
89 hub.register_gateway(self._param['firewall'],
90 self._unique_name,
91 self._gateway.remote_gateway_request_callbacks,
92 self._gateway.disengage_hub,
93 self._gateway.ip
94 )
95 rospy.loginfo("Gateway : registering on the hub [%s]" % hub.name)
96 self._publish_gateway_info()
97 else:
98 rospy.logwarn("Gateway : not registering on the hub [%s]" % error_code_str)
99 return error_code, error_code_str
100
101
102
103
104
106 gateway_services = {}
107 gateway_services['connect_hub'] = rospy.Service('~connect_hub', gateway_srvs.ConnectHub, self.ros_service_connect_hub)
108 gateway_services['remote_gateway_info'] = rospy.Service('~remote_gateway_info', gateway_srvs.RemoteGatewayInfo,self.ros_service_remote_gateway_info)
109 gateway_services['advertise'] = rospy.Service('~advertise', gateway_srvs.Advertise, self._gateway.ros_service_advertise)
110 gateway_services['advertise_all'] = rospy.Service('~advertise_all', gateway_srvs.AdvertiseAll, self._gateway.ros_service_advertise_all)
111 gateway_services['flip'] = rospy.Service('~flip', gateway_srvs.Remote, self._gateway.ros_service_flip)
112 gateway_services['flip_all'] = rospy.Service('~flip_all', gateway_srvs.RemoteAll, self._gateway.ros_service_flip_all)
113 gateway_services['pull'] = rospy.Service('~pull', gateway_srvs.Remote, self._gateway.ros_service_pull)
114 gateway_services['pull_all'] = rospy.Service('~pull_all', gateway_srvs.RemoteAll, self._gateway.ros_service_pull_all)
115 return gateway_services
116
118 gateway_publishers = {}
119 gateway_publishers['gateway_info'] = rospy.Publisher('~gateway_info', gateway_msgs.GatewayInfo, latch=True)
120 return gateway_publishers
121
122
123
124
125
127 '''
128 Handle incoming requests to connect directly to a gateway hub.
129
130 Requests are of the form of a uri (hostname:port pair) pointing to
131 the gateway hub.
132 '''
133 response = gateway_srvs.ConnectHubResponse()
134 o = urlparse(request.uri)
135 response.result, response.error_message = self._register_gateway(o.hostname, o.port)
136
137 if response.result == gateway_msgs.ErrorCodes.SUCCESS:
138 rospy.loginfo("Gateway : made direct connection to hub [%s]" % request.uri)
139 return response
140
160
171