private void Run() { _ws = new WebSocket(_host + ":" + _port); _ws.OnMessage += (sender, e) => this.OnMessage(e.Data); _ws.OnError += _ws_OnError; _ws.OnOpen += _ws_OnOpen; _ws.Connect(); while (!connected) { Thread.Sleep(10); } foreach (var sub in _subscribers) { _ws.Send(ROSBridgeMsg.Subscribe(sub.Key.topic, sub.Key.type)); Debug.Log("Sending: " + ROSBridgeMsg.Subscribe(sub.Key.topic, sub.Key.type)); } foreach (var p in _publishers) { _ws.Send(ROSBridgeMsg.AdvertiseTopic(p.topic, p.type)); Debug.Log("Sending " + ROSBridgeMsg.AdvertiseTopic(p.topic, p.type)); } foreach (var srv in _serviceServers) { _ws.Send(ROSBridgeMsg.AdvertiseService(srv.Key.topic, srv.Key.type)); Debug.Log("Sending: " + ROSBridgeMsg.AdvertiseService(srv.Key.topic, srv.Key.type)); } while (_connected) { Thread.Sleep(10); } }
/// <summary> /// Add a Service server to this connection. There can be many servers, but each service should only have one. /// </summary> /// <typeparam name="Tsrv">ServiceProvider type</typeparam> /// <typeparam name="Treq">Message type containing parameters for this service</typeparam> /// <typeparam name="Tres">Message type containing response data returned by this service</typeparam> /// <param name="srv">The service to advertise</param> /// <param name="callback">Method to invoke when the service is called</param> public ROSBridgeServiceProvider <Treq> Advertise <Tsrv, Treq, Tres>(string service, ROSServiceCallback <Treq, Tres> callback) where Tsrv : ROSBridgeServiceProvider <Treq> where Treq : ServiceArgs where Tres : ServiceResponse, new() { ServiceCallback CB = (ServiceArgs args, out ServiceResponse response) => { Treq request = (Treq)args; Tres res = new Tres(); bool success = callback(request, out res); response = res; return(success); }; Tsrv srv = (Tsrv)Activator.CreateInstance(typeof(Tsrv), new object[] { service }); _serviceServers.Add(srv, CB); _svcQueue.Add(srv.topic, new RenderQueue <ServiceTask>(0)); if (connected) { _ws.Send(ROSBridgeMsg.AdvertiseService(srv.topic, srv.type)); } return(srv); }