Orginal proyecto de robot usando OAuth v2 para inicio de sesión o Autorizar con sólo plus.login y luego añadir servicios adicionales a la cuenta del usuario

Por Soloelectronicos @soloelectronico

En este escenario, usted puede que  tenga un sitio que trabaje con los flujos existentes OAuth v2 , de froma más probable  que un flujo del lado del servidor. Si usted está buscando  actualizar  usar el flujo del botón de inicio de sesión, los usuarios existentes tendrán que autorizar su aplicación. Esto es porque el el botón de inicio de sesión implícitamente está solicitando las posibilidades  de inicio de sesión. Echemos un vistazo a la experiencia de cómo funcionaría este escenario!

Una demostración del flujo de actualización

En primer lugar, un vistazo a esta página:

Server-side simple inicio de sesión Demo

Si la página no se carga, puedes logout aquí. Después de conectar su cuenta, encontrará una página de autorización como los siguientes:

Cuando llegue al sitio nuevo, firmado en a Google, estará autorizados y la página conocerá su id y puede procesar su perfil.

Ahora supongamos que queremos actualizar la cuenta del usuario para utilizar inicio de sesión para añadir a lo usuarios de Google +. Para ello, el usuario debe ingresar nuevamente, esta vez utilizando el botón de inicio de sesión como se muestra en la siguiente demostración:

One-time-código del lado del servidor inicio de sesión Demo

Veremos más información sobre por qué el usuario debe autorizar más tarde… pero el diálogo se verá como sigue:

Después de autorizar nuevamente, la cuenta del usuario se actualizará entonces para aprovechar las nuevas características de Google + Sign-in.

Ahora echemos un vistazo a los pasos utilizados para actualizar su base de datos back-end para reflejar la actualización.

Actualización de la información de usuario en el modelo de datos del sitio

En primer lugar, recordemos el ejemplo simple donde se solicitó el ámbito userinfo.email y el usuario fue autorizado mediante el flujo convencional de lado del servidor. En este punto, su sitio podría tener un modelo para el usuario similar al siguiente:

Supongamos que el usuario ha creado datos asociados con ese flujo, así que  podría representar datos adicionales específicos a su sitio. Se ha establecido su ID de cuenta, porque se devuelve con el alcance de plus.email las credenciales de la cuenta del usuario ya existe en esta base de datos en el sitio.

A continuación, después de que ha actualizado su sitio web para tener el nuevo botón de inicio de sesión y reautoriza el usuario, puede actualizar los datos existentes en su sitio para el usuario y puede agregar la información adicional que regresó de Google +. Desde una perspectiva de fondo, el modelo ahora podría ser algo así:

El token de actualización y el token de acceso, destacados en rojo, se actualizan después el código-intercambio ocurre en el flujo de una sola vez-código del servidor. Esto sucede porque las nuevas credenciales tienen acceso a los ámbitos adicionales. La tabla VisibleUser también se rellena con todos los usuarios visibles en el sitio para que el gráfico social puede ser aprovechado.

A continuación, echemos un vistazo a los programación pasos para actualizar su sitio.

Pasos para actualizar el sitio

Echemos un vistazo a lo que se hizo para lograr esta ruta de actualización. En primer lugar, los alcances del proyecto API deben actualizarse para incluir la API de Google +. Esto se hace en el alcance de Google + desde la consola API:

A continuación, necesita ser actualizado para incluir el nuevo botón de inicio de sesión como se describe en la Página Google + desarrolladores documentación, Google + signo-enel sitio. Resumido brevemente, el código de marcado debe añadirse al sitio:

    <button
        data-scope="https://www.googleapis.com/auth/plus.login"
        data-requestvisibleactions="http://schemas.google.com/AddActivity"
        data-clientId="YOUR_CLIENT_ID"
        data-accesstype="offline"
        data-callback="onSignInCallback"
        data-theme="dark"
        data-cookiepolicy="single_host_origin">
    </button>

.. .y una devolución de llamada de inicio de sesión tendrá que crearse puestos de datos al componente del lado del servidor:

    /**
     * Hides the sign-in button and connects the server-side app after
     * the user successfully signs in.
     *
     * @param {Object} authResult An Object which contains the access token and
     *   other authentication information.
     */
    onSignInCallback: function(authResult) {
      $('#authResult').html('Auth Result:<br/>');
      for (var field in authResult) {
        $('#authResult').append(' ' + field + ': ' + authResult[field] + '<br/>');
      }
      if (authResult['access_token']) {
        // The user is signed in
        this.authResult = authResult;
        // After we load the Google+ API, render the profile data from Google+.
        gapi.client.load('plus','v1',this.renderProfile);
      } else if (authResult['error']) {
        // There was an error, which means the user is not signed in.
        // As an example, you can troubleshoot by writing to the console:
        console.log('There was an error: ' + authResult['error']);
        $('#authResult').append('Logged out');
        $('#authOps').hide('slow');
        $('#gConnect').show();
      }
      console.log('authResult', authResult);
    }

Puede aprender más sobre el flujo de una sola vez-código comenzando con el Google + PHP Quickstart,

En los casos donde el sitio ya tiene un usuario, la cuenta puede consultarse por su ID de Google, que era más probable un índice utilizado anteriormente cuando las credenciales de usuario desde el ámbito de userinfo.email. Haciendo coincidir el ID a la que regresó desde el ámbito plus.login, se ha determinado que se han creado antes de la cuenta y las credenciales pueden ser actualizadas para las credenciales de autorización a los servidores de autenticación de Google. Una vez que haya identificado al usuario actualizar, la actualización persisten token y token de acceso necesitan reemplazarse con los nuevos.

Lo que sucede detrás de las escenas es que el flujo de OAuth en el sitio original está solicitando solamente el alcance de userinfo.email. En el sitio actualizado, el botón de inicio de sesión está solicitando implícitamente el alcance plus.login para que el usuario debe pedirá otra vez para los permisos. Cuando el usuario autoriza otra vez en el nuevo sitio, el identificador de la cuenta del usuario Google quedará igual, así que la cuenta otra vez fácilmente puede ser emparejada para reflejar los permisos actualizados.

Agregar adicionales a la cuenta de un usuario

En relación con el primer ejemplo este seria el tipico de cuando quiere un usuario  inscribirse para un servicio sin necesidad de conceder todos los permisos para su aplicación y luego necesitar agregar adicional, opcional, ámbitos a la cuenta asociada. Por ejemplo, digamos que tienes un servicio que utiliza Google + para ingresar y crear una cuenta pero luego más tarde que quiera añadir acceso a de un usuario Google Calendar Google DriveLo que puede hacer es crear una página de configuración fija dinámicamente los alcances en el botón de inicio de sesión y luego el botón para volver a autorizar al usuario como se indica antes.

ADVERTENCIA: Este es un truco que funciona por ahora, pero no es necesariamente una mejor práctica, Uselo bajo su propio riesgo!

Asustar a texto a un lado… vamos a ver cómo esto podría funcionar.

  1. El usuario se suscriba, usted solicita solamente los alcances requeridos para inscribirse / firma en el sitio como se ve en el one-time-código original de demo.
  2. Más tarde, trae al usuario a una página de configuración donde puede seleccionar diversos ámbitos y luego agregar dinámicamente estos ámbitos para una solicitud de autorización.

La demostración siguiente realiza algunos trucos para agregar mediante programación y cambiar los alcances que se solicitan y luego renderizar el botón de inicio de sesión mediante programación:

Demostración: Trucos y hacks para Google + signo de alcances de la autorización

El (definitivamente no producción, hay variables globales!) código para modificar dinámicamente los ámbitos es como sigue:

  var calendarScopeVar = '';
  var driveScopeVar= '';

  function toggleCalendar(){
    if (calendarScopeVar == ''){
      calendarScopeVar = ' https://www.googleapis.com/auth/calendar';
    }else{
      calendarScopeVar = '';
    }
    render();
  }

  function toggleDrive(){
    if (driveScopeVar == ''){
      driveScopeVar = ' https://www.googleapis.com/auth/drive';
    }else{
      driveScopeVar = '';
    }
    render();
  }
  </script>

Casillas de verificación se agregan que alternar los alcances:

  <input type="checkbox" onClick="toggleCalendar()"></input>Toggle Calendar<br>
  <input type="checkbox" onClick="toggleDrive()"></input>Toggle Drive<br>
  <div id="outer">
  <div id="gConnect">
    <button id="customBtn"></button>
  </div>
  </div>

Cada vez que se cambian las casillas de verificación, volver a procesar el botón de inicio de sesión como se muestra en el siguiente código.

  function render() {
    $('#gConnect').empty();
    $('#gConnect').html('<button id="customBtn"></button>');
    var scope = 'https://www.googleapis.com/auth/plus.login';
    scope += ' https://www.googleapis.com/auth/userinfo.email';
    scope += calendarScopeVar;
    scope += driveScopeVar;

    gapi.signin.render('customBtn', {
      'callback': 'onSignInCallback',
      'clientid': '{{ CLIENT_ID }}',
      'cookiepolicy': 'single_host_origin',
      'requestvisibleactions': 'http://schemas.google.com/AddActivity',
      'scope':scope
    });
  }

Cuando el usuario hace clic en Inicio de sesión, se solicitan los alcances y el usuario será nuevamente autorizado. La siguiente imagen muestra el cuadro de diálogo que aparece cuando se selecciona todos los ámbitos opcionales.

Sobre la terminación de la solicitud de autorización, intercambiarán otra vez del lado del servidor para obtener y actualizar sus tokens de autorización código. Después de que el código de autorización se intercambia, las credenciales devueltas estará autorizadas a tienen los alcances adicionales para agenda o en coche. Al finalizar el flujo de autorización, debe reemplazar las credenciales existentes con los actualizados que tienen ahora los nuevos parámetros de autorización conjunto. Nota tenga cuidado de no eliminar los ámbitos que ya ha solicitado y necesidad – plus.login y userinfo.email en este ejemplo.

Recursos adicionales

Así que ahí tiene, modernización y sustitución de ámbitos usando Google + signo-en el botón. Esto probablemente ha conseguido pensando en cómo puede hacer esto en sus propios sitios y en sus propios experimentos

En algunos casos raros, tiene sentido para procesar los mensajes interactivos selectivamente, retrocediendo al botón compartir. Por ejemplo, debería hacer esto cuando cuando se le pedirá que firme pero todavía podrían compartir contenido sin ser firmado en Google + en su sitio. En la mayoría de los casos usted debe no estar haciendo esto porque automáticamente pedirá al usuario que entra a su sitio si no lo han hecho ya y el botón publicar interactivo es más interesante que el botón de compartir.

De todos modos, si quiere hacer esto (y otra vez, esto es en casos extremadamente raros) el siguiente código va a empezar.

En definitiva, la página representará un post interactivo de la siguiente manera cuando ha iniciado sesión el sitio:

Cuando no ha iniciado sesión, la página dará un cuadro de diálogo compartir:

El siguiente código HTML muestra el marcado donde tanto el post interactivo y botones de acción se procesan dentro de etiquetas div oculto:

<html>
<head>
  <title>Google+ JavaScript Quickstart</title>
  <script type="text/javascript">
  (function() {
    var po = document.createElement('script');
    po.type = 'text/javascript'; po.async = true;
    po.src = 'https://plus.google.com/js/client:plusone.js';
    var s = document.getElementsByTagName('script')[0];
    s.parentNode.insertBefore(po, s);
  })();
  </script>
  <!-- JavaScript specific to this application that is not related to API
     calls -->
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js" ></script>
</head>
<body>
  <!-- Place the tag where you want the button to render -->
  <div id="ipost">
    <div
      class="g-interactivepost"
      data-contenturl="https://plus.google.com/pages/"
      data-contentdeeplinkid="/pages"
      data-clientid="YOUR_CLIENT_ID"
      data-cookiepolicy="single_host_origin"
      data-prefilltext="Engage your users today, create a Google+ page for your business."
      data-callback="onInteractiveCallback"
      data-calltoactionlabel="CREATE"
      data-calltoactionurl="http://plus.google.com/pages/create"
      data-calltoactiondeeplinkid="/pages/create">
    <button>Tell your friends</button>
    </div>
    <button id="disconnect">Disconnect</button>
  </div>
  <div id="share">
    <g:plus action="share"></g:plus>
    <span id="signinButton">
      <span
        class="g-signin"
        data-callback="signinCallback"
        data-clientid="YOUR_CLIENT_ID"
        data-cookiepolicy="single_host_origin"
        data-requestvisibleactions="http://schemas.google.com/AddActivity"
        data-scope="https://www.googleapis.com/auth/plus.login">
      <u>Click to upgrade</u>
      </span>
    </span>
  </div>
</body>

El javascript siguiente configura el botón desconectar y agrega Controladores para iniciar devolución de llamada para el botón publicar interactivo.

$(document).ready(function() {
  $('#disconnect').click(disconnect);
});

function onInteractiveCallback(authResult){
  if (authResult['error']) {
    // There was an error, which means the user is not signed in.
    // As an example, you can handle by writing to the console:
    console.log('There was an error: ' + authResult['error']);
    $('#authResult').append('Logged out');
    $('#authOps').hide('slow');
    $('#gConnect').show();
    $("#share").show();
  } else {
    $("#ipost").show();
    $("#share").hide();
  }
}

function disconnect(){
 // Revoke the access token.
 $.ajax({
   type: 'GET',
   url: 'https://accounts.google.com/o/oauth2/revoke?token=' +
       gapi.auth.getToken().access_token,
   async: false,
   contentType: 'application/json',
   dataType: 'jsonp',
   success: function(result) {
     console.log('revoke response: ' + result);
     $('#authOps').hide();
     $('#profile').empty();
     $('#visiblePeople').empty();
     $('#authResult').empty();
     $('#gConnect').show();
   },
   error: function(e) {
     console.log(e);
   }
 });
 $("#ipost").hide();
 $("#share").show();
}

Cuando la señal de llamada falla cuando se activa de modo inmediato indicando que el usuario no está firmado en, se procesa la div mostrando el botón compartir junto con el Google + signo código. Si el usuario firma, consiguen el botón interactivo puesto, si se desconectan, verán el botón compartir.

Proyecto de demostración, fuentes en GitHub aquí.

]]> http://gusclass.com/blog/2013/03/11/selectively-Rendering-Interactive-posts/feed/ 3 http://gusclass.com/blog/2012/12/27/Remote-Mounting-ssh-filesystems-from-Windows-8/http://gusclass.com/blog/2012/12/27/remote-mounting-ssh-filesystems-from-windows-8/#comments Jue, 27 de diciembre de 2012 17:45:54 + 0000 http://gusclass.com/blog/?p=879 Hay una serie de buenas razones para SSH montar sistemas de archivos de Windows, y hay una gran biblioteca y utilidad, Dokan SSH Filesystem, que hace que sea muy fácil de hacer.

En primer lugar, debe Descargar la biblioteca DokanEste es un instalador, debe habilitar el modo de compatbility a fin de ejecutar. Haga clic derecho sobre la aplicación y vaya a propiedades. Entonces usted necesitará configurar su configuración para ser como el siguiente:

Cuando se ejecuta el instalador, se instalará la biblioteca y estará listo para instalar la utilidad.

Ahora tiene que instalar la utilidad de Dokan SSHFSUna vez haya descargado la utilidad, ejecutarla como lo haría cualquier aplicación y luego le permitirá añadir un sistema de archivos remoto. La captura de pantalla siguiente muestra un ejemplo con mi servidor compartido de montaje:

Naturalmente, debes ingresar tu nombre de usuario y contraseña si éste fuera su anfitrión. Ahora, cuando hace clic en conectar, se montará la unidad y puede mover archivos a y de él como lo haría cualquier unidad de disco.

]]> http://gusclass.com/blog/2012/12/27/Remote-Mounting-ssh-filesystems-from-Windows-8/feed/ 5 http://gusclass.com/blog/2012/08/15/Rendering-schema-org-Markup-for-Content-Behind-a-paywall/http://gusclass.com/blog/2012/08/15/rendering-schema-org-markup-for-content-behind-a-paywall/#comments miércoles, 15 de agosto de 2012 15:02:14 + 0000 http://gusclass.com/blog/?p=628

Uno de los retos con momentos de escritura a la página de un usuario Google + historia es que necesitas una dirección URL de destino para pasar a la API y que dirección URL de destino debe contener microdatos apropiado para Google + a utilizar para calcular el contenido que aparece en la historia. Por ejemplo, digamos que soy un editor que crea que requieren entrar a leer artículos y los artículos se mantienen deliberadamente detrás de una página de inicio de sesión. Cuando un usuario Lee un artículo, todavía quiero escribir momentos de su historia pero no tengo una página legible por Google ver. ¿Qué debo hacer?

Una solución: páginas de inicio de sesión personalizado con microdatos Sinopsis

En esta estrategia, se crea una página de inicio de sesión personalizado ya sea con una sinopsis breve del artículo descrito en microdatos contenida en las etiquetas de marcado o meta contenidos. Se describirán dos maneras de representar los datos para ilustrar tanto un enfoque perezoso y un enfoque más sólido. La ventaja de este enfoque es que los clientes que llegan a su sitio será capaces de ver un teaser para el contenido que ofrece a premium suscrito clientes y usted puede ser capaz de atraerlos a inscribirse para su servicio, registrarse y así sucesivamente.

Qué no hacer: un enfoque marcado esquema programático escuchar perezoso

En nuestro primer acercamiento, un enfoque perezoso, nos va ser dinámicamente prestando el contenido basado en parámetros de entrada. En este enfoque, simplemente pasar parámetros a tu página de inicio de sesión y estos parámetros representará el schema.org marcado de la página, momentos escritas a la historia que contienen estos parámetros y harían que los datos adecuados a la historia. Se advierte previamente que principalmente esto se demuestra como un contraejemplo porque es insegura e ilustra qué no hacer. Sería fácil para un usuario malintencionado para hacerla aparecer como si estás dando referencias a virtualmente cualquier contenido que engañan tu página de renderizado.

Un recordatorio sobre el ejemplo siguiente, no lo haga, es un buen prototipo para una solución más integral a emergiendo escuchar contenido en una página de inicio de sesión, pero es insegura. Dicho esto, he creado (y organizado) un script Perl CGI que se extinguirían dinámicamente Schema.org marcado para el tipo de artículo. La esencia puede ser determinada desde el siguiente fragmento:

#!/usr/bin/perl
use CGI;

my $q = CGI->new;

my $img = $q->param("i");
my $title = $q->param("t");
my $description = $q->param("d");

print qq|
<!DOCTYPE html>
...
...
...

Dentro del citado bloque, rendirán un HTML simple para el contenido del esquema que se pasa como parámetros a la URL.

<div itemscope="http://schema.org/Article" class="hero-unit">
  <h1 itemprop="title">$title</h1>
  <p itemprop="description">$description</p>
  <img itemprop="image" src="$img">
  ...
</div>

En este punto, el contenido extinguirían dinámicamente schema.org marcado basado en los parámetros pasados al script. Un indicador de inicio de sesión y registrarse se procesa en la página porque el usuario no está firmado. Puede ver este ejemplo en la práctica en esta página dando una vista previa a un artículo sobre las bicicletas fixiePara el ojo, también observará algún código Bootstrap de Twitter que solía bastante arriba de la página. Puede utilizar las herramientas de Google Webmaster para ver cómo el esquema es ser analizado por los motores de búsquedaEste enfoque tiene un número de seguridad, contenido y concisión temas que voy a probar y dirección en un enfoque mejorado.

Un mejor enfoque: representación explícitamente contenido basado en el contenido de su artículo

Si va a proporcionar contenido premium detrás de un muro de pago o inscripción, probablemente ya tienes una base de datos que contiene los atributos de su contenido. Si los datos ya están, ¿por qué no reutilizarlo para la vista previa? Como ejemplo,  una base de datos con las siguientes filas para demostrar esto:

ID Título Descripción imageURL cuerpo

1 Mira una fixie Claramente no eres lo suficientemente frío como para leer este artículo a menos que usted se inscribe http://wheresgus.com/fixie.jpg Contenido artículo glorioso que he creado cuidadosamente

Como pueds ver, hay una identificación del artículo, título, descripción, imageURL y cuerpo. Un ejemplo más complejo podría incluir otras características interesantes como el autor y así sucesivamente. Lo que haremos a continuación es usar este contenido [de la base de datos] para ambos render el contenido de la vista previa, así como el artículo. A partir del código Perl, vamos a ver cómo se conectaría el DB, una base de datos MySQL en mi caso, a las variables en lugar de utilizar parámetros CGI. Esto es exactamente lo mismo que el ejemplo anterior con una sola excepción, se rellenan las variables utilizando los campos de db y el contenido es compartido entre el artículo y la vista previa / muro de pago:

my $db   = "dbname";
my $host = "host";
my $port = 3306;
my $username = "username";
my $pass = "pass";

print $dbpath;

my $dbpath = "DBI:mysql:" . $db . ":host=" . $host;#. ":" . $port;

my $artID = $q->param("id");
my $skipPaywall = $q->param("skippaywall");

my $dbh = DBI->connect($dbpath, $username, $pass
             ) || die "Could not connect to database: $DBI::errstr";

my $sth = $dbh->prepare("select title, description, imgURL, content from article where id=?");

$sth->execute($artID);
my @result = $sth->fetchrow_array();

my $title       = $result[0];
my $description = $result[1];
my $img         = $result[2];
my $content     = $result[3];

$dbh->disconnect();

print $q->header;
print $q->start_html("");

Ahora se rellenan las variables de la base de datos en contraposición a la URL. Puedes ver la página teaser en acción, también, usted puede pasar una bandera de depuración para representar el contenido real de la prueba.

Un par de cosas importante en esta mejora en el primer ejemplo:

  • El esquema que se genera para el artículo es consistente con el artículo y también se procesa en el artículo. Esto funciona en el espíritu de contenido Schema.org, todas las entidades están representadas como mejor pueden estar en todas las instancias de ese contenido.
  • Se fija el esquema que se representa a ese contenido específico. Como tal, no pueden ser manipulados parámetros cuando se pasa a la secuencia de comandos para generar microdatos arbitraria.
  • Todavía puedes escribir momentos a la historia de un usuario que puede ser leído por la API de la historia y que también puede con seguridad ser compartida por el usuario si deciden sin arriesgar los clientes burlar su muro de pago.

Las mejores prácticas y consideraciones

Aunque este enfoque ejemplo funciona, todavía el autor ve una serie de posibles problemas con él. Cuando se toma un enfoque así, asegúrese de que piensa en varias cosas que pudieran hacer los usuarios malintencionados. Por ejemplo, qué pasa si un usuario malintencionado:

  • Descubre cómo estás escribiendo estos momentos y autores una página de destino que no es apropiada para su sitio web (SPAM, contenido maduro, etc.)
  • Parodias de formas para generar momentos que no están destinados a ser prestados por su servicio
  • Falsifica el camino a su momento para una cuenta que no es su propio (por ejemplo genera un momento para su amigo de cuenta y escribe en su historia)
  • Formula las condiciones para representar el momento y luego incumple información privada (parcialmente) desde su sitio
  • Manipula los parámetros para generar momentos que no pretenden ser creado con su servicio (por ejemplo check-in para los lugares que no han sido)

Todos estos riesgos pueden reducirse mediante diseño cuidadoso y atento examen alrededor como personas potencialmente podrían estar accediendo y momentos de escritura basado en su contenido.

Una nota final, habilitar schema.org marcado en su página tiene otro beneficio más allá que la escriba momentos específicos para el contenido: los motores de búsqueda que se arrastran su sitio será capaces de analizar el marcado esquema para crear experiencias ricas en resultados de búsqueda. Cuando se considera cómo acercarse a una vista previa de apoyo, recuerda también las otras maneras que este contenido será utilizado y prestado.

]]> http://gusclass.com/blog/2012/08/15/Rendering-schema-org-Markup-for-Content-Behind-a-paywall/feed/ 0 http://gusclass.com/blog/2012/08/10/Building-and-running-the-Oscar-Code/http://gusclass.com/blog/2012/08/10/building-and-running-the-oscar-code/#comments viernes, 10 de agosto de 2012 14:03:12 + 0000 http://gusclass.com/blog/?p=599 

Éste será probablemente el artículo concluyente para el proyecto de OSCAR. Algunos desarrolladores han tenido preguntas acerca de construir, instalar y ejecutar la aplicación y las instrucciones generales siguientes deben ponerte en marcha.En definitiva, será obtener el código, poner en marcha el proyecto, construir utilizando visual studio, desplegar el código en un PC que será sentarse en el robot y luego a configurar y ejecutar el servidor y el lugar de reunión.

Uso

Para construir el proyecto:

Para ejecutar el proyecto:

  • (Opcional) Instalar la aplicación hangout especifica la ubicación del archivo XML Hangout Gadget de su servidor web o utilizando la ruta XML de ejemplo
  • Poner la salida binaria de la construcción del proyecto en una PC en la parte superior una Roomba
  • Conectar el robot al PC usando un cable USB o serie
  • Iniciar el servidor ejecutando el binario que construyó. El servidor será puesta en marcha y conectar con el robot que ha conectado.
  • (Opcional) uso un servicio como localtunnel para que el servidor disponible públicamente
  • Iniciar un hangout y añadir la aplicación hangout
  • Coloque la ruta (URL) del servidor de Robot en el lugar de la aplicación
  • Ahora usted debe ser capaz de controlar el robot desde el lugar de reunión

Algunos extra consejos y resolución de problemas

El proyecto de construcción sin utilizar Visual Studio

El autor ha creado un  vídeo sobre cómo compilar y ejecutar proyectos usando el SDK de Windows:

¿Puerto COM mal?

Cuando el servidor arranca, intenta utilizar el puerto de iRobot predeterminado si el cable está conectado al puerto USB (COM3). Si está utilizando un puerto diferente, la aplicación debe fallar con gracia y le pedirá otro puerto. Cuando esto sucede, puso en su puerto, mayúsculas y minúsculas, por ejemplo COM1, como entrada, y debe ser bueno para ir.

¿Configuración de Localtunnel?

Para ejecutar correctamente localtunnel en Windows, usted debe Primero instalar CYGWINUsando las versiones no-cygwin de Ruby con localtunnel no funciona. No me fijé mucho en esto pero creo que tampoco están utilizando UNIX estilo caminos o sólo utilizan tubos de UNIX. En la práctica, encontré que localtunnel estaba cerrando mi corriente después de aproximadamente 5 minutos, no estoy seguro si esto fue planeado, pero es algo a tener en cuenta.

Métodos abreviados de teclado

Controles WASD y cambiar la URL

Para los siguientes atajos de teclado de JavaScript, usted debe estar usando un Mac, no tengo idea por qué tomé esta decisión, pero tenía sentido en ese momento. Mantenga pulsada la mierda + Alt / opción + Control llaves (no la clave de Apple) y luego presione o WASD para videojuegos como controles o U para cambiar la URL.

Esto es útil para si el túnel se cae o su servidor cambia IPs mientras está funcionando el lugar de reunión.