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