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