diff --git a/webrtc_ros/CMakeLists.txt b/webrtc_ros/CMakeLists.txt index a8cb826..794f81c 100644 --- a/webrtc_ros/CMakeLists.txt +++ b/webrtc_ros/CMakeLists.txt @@ -7,10 +7,27 @@ find_package(catkin REQUIRED COMPONENTS image_transport nodelet roscpp + std_msgs + message_generation ) find_package(webrtc REQUIRED) find_package(X11 REQUIRED) +add_message_files( + FILES + IceServer.msg +) + +add_service_files( + FILES + GetIceServers.srv +) + +generate_messages( + DEPENDENCIES + std_msgs +) + catkin_package( CATKIN_DEPENDS async_web_server_cpp @@ -18,9 +35,16 @@ catkin_package( image_transport nodelet roscpp + message_runtime + std_msgs DEPENDS webrtc ) +catkin_install_python( + PROGRAMS src/ice_server_service.py + DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} +) + ########### ## Build ## ########### diff --git a/webrtc_ros/launch/webrtc_ros.launch b/webrtc_ros/launch/webrtc_ros.launch new file mode 100644 index 0000000..c2083af --- /dev/null +++ b/webrtc_ros/launch/webrtc_ros.launch @@ -0,0 +1,34 @@ + + + + + + + + + + + ['stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302'] + + + + + + [] + + + + + + + + + + + + + + + + + diff --git a/webrtc_ros/msg/IceServer.msg b/webrtc_ros/msg/IceServer.msg new file mode 100644 index 0000000..0e6aa4d --- /dev/null +++ b/webrtc_ros/msg/IceServer.msg @@ -0,0 +1,3 @@ +string uri +string username +string password diff --git a/webrtc_ros/package.xml b/webrtc_ros/package.xml index 7b06ca5..cbab112 100644 --- a/webrtc_ros/package.xml +++ b/webrtc_ros/package.xml @@ -22,6 +22,14 @@ nodelet async_web_server_cpp + message_runtime + + message_generation + + std_msgs + std_msgs + std_msgs + diff --git a/webrtc_ros/src/ice_server_service.py b/webrtc_ros/src/ice_server_service.py new file mode 100755 index 0000000..1c64b68 --- /dev/null +++ b/webrtc_ros/src/ice_server_service.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python + +import json +import rospy +import requests +from webrtc_ros.msg import IceServer +from webrtc_ros.srv import GetIceServers, GetIceServersResponse + + +class IceServerManager(object): + """ Manages providing ice server information to the webrtc system """ + + def __init__(self): + rospy.init_node('ice_server_provider') + + self.stun_servers = rospy.get_param('stun_servers', [ + 'stun:stun1.l.google.com:19302', 'stun:stun2.l.google.com:19302']) + self.turn_server_uris = rospy.get_param('turn_server_uris', '') + self.turn_creds_uri = rospy.get_param('turn_server_creds_uri', '') + self.turn_creds_username = rospy.get_param( + 'turn_server_creds_username', '') + self.turn_creds_password = rospy.get_param( + 'turn_server_creds_password', '') + + self.get_ice_servers_service = rospy.Service( + 'get_ice_servers', GetIceServers, self.get_ice_servers) + + rospy.loginfo('Ice Server Provider Up') + rospy.spin() + + def get_turn_creds(self): + """Get the credentials from the turn server.""" + if self.turn_creds_uri: + resp = requests.post(self.turn_creds_uri, + {'username': self.turn_creds_username, + 'password': self.turn_creds_password}) + if(('username' in resp.data) and ('password' in resp.data)): + return resp.data + return False + + def get_ice_servers(self, _): + """Callback for service. Returns the ice servers""" + resp = GetIceServersResponse() + turn_creds = self.get_turn_creds() + if turn_creds: + for uri in self.turn_server_uris: + serv = IceServer() + serv.username = turn_creds['username'] + serv.password = turn_creds['password'] + resp.servers.append(serv) + for suri in self.stun_servers: + serv = IceServer() + serv.uri = suri + resp.servers.append(serv) + return resp + + +if __name__ == '__main__': + IceServerManager() diff --git a/webrtc_ros/src/webrtc_client.cpp b/webrtc_ros/src/webrtc_client.cpp index bd68101..5622776 100644 --- a/webrtc_ros/src/webrtc_client.cpp +++ b/webrtc_ros/src/webrtc_client.cpp @@ -8,6 +8,7 @@ #include #include #include +#include namespace webrtc_ros { @@ -112,11 +113,26 @@ bool WebrtcClient::initPeerConnection() } if (!peer_connection_) { - webrtc::PeerConnectionInterface::IceServers servers; + webrtc::PeerConnectionInterface::RTCConfiguration config; + if(ros::service::exists("get_ice_servers", false)){ + GetIceServers serv; + if(ros::service::call("get_ice_servers", serv)){ + for(int i=0; i(weak_this); peer_connection_ = peer_connection_factory_->CreatePeerConnection( - webrtc::PeerConnectionInterface::RTCConfiguration(), + config, nullptr, nullptr, webrtc_observer_proxy_.get() diff --git a/webrtc_ros/srv/GetIceServers.srv b/webrtc_ros/srv/GetIceServers.srv new file mode 100644 index 0000000..01549bb --- /dev/null +++ b/webrtc_ros/srv/GetIceServers.srv @@ -0,0 +1,4 @@ +## args +--- +## Resp +IceServer[] servers