jueves, 2 de mayo de 2013

Comunicación bluetooth Arduino <=> PC Linux con un dongle usb

En este tuto se busca establecer una comunicación bidireccional entre un arduino y una pc usando bluetooth.



Se requiere:
* Dongle usb:

* Arduino + modulo bluetooth (Aqui uso el HC-05)



* Debe tener instalado bluez y moserial. Si usa fedora puede instalarlo con:
     yum install -y blue* moserial*

Vamos a hacer que el Arduino prenda y apague un led según se le indique.

La conexión debe queda así:

Led                ----> Pin 13 Arduino
Bluetootx Tx ----> Arduino Tx
Bluetootx Rx ----> Arduino Rx
Bluetootx Vcc----> Arduino 5v               


Paso 1. Cargar el sketch al arduino: 
Nota: Desconecta el Rx del bluetooth antes de cargar el sketch o te dará problemas en la carga


/** Por Hector Oliveros **/
char inByte;
int  LED = 13; // LED on pin 13

void setup() {
  // El baud rate debe ser el mismo que en el monitor serial y 
  // que el mobulo bluetooth. 
  // para cambiar el baud rate debe entrar en modo AT
  Serial.begin(9600);
}

void loop() {}

// Se activa cuando se detecta escritura en el puerto serial
void serialEvent() {  
  while (Serial.available()) {
    inByte = Serial.read();        
    // Si detecta el caracter '0' entonces apaga el led
    if( inByte == '0' ){
      digitalWrite(LED, LOW);  
      Serial.println("LOW");
    }
    
    // Si detecta el caracter '1' entonces enciende el led
    if( inByte == '1' ){
      digitalWrite(LED, HIGH); 
      Serial.println("HIGH");
    }  
  }
}


Puedes descargar el sketch desde aqui:
Luego de realizada la carga debes volver a conectar el Rx del bluetooth al arduino.

Paso 2: Configurar la PC.
Conecta el dongle usb al equipo.

- Para saber la mac del modulo bluetooth ejecuta:      hcitool scan
- Luego para asociarse al modulo sustituye y ejecuta: rfcomm connect 0 MAC_DEL_MODULO
  donde MAC_DEL_MODULO es la mac del modulo que obtuviste con hcitool.

- Le va a pedir el pin: En el hc-05 es 1234
- Si todo va bien debería mostrar lo siguiente:




Paso 3: Comunicarse con el Arduino:

- Abre moserial y ve a configuración de puerto

- Allí coloca esta configuración: Desmarca imprimir datos recibidos

- Luego se conecta:

- Y prueba intentando prender el led:


Listo 




Notas: Cuando quieras cargar un sketch al arduino desconecta el rx del módulo bluetooth, Puesto que te va a dar fallas.

Probado en Fedora x86_64 

Links de interés :
http://letsmakerobots.com/node/11178
http://www.flickr.com/photos/ricardo_ferreira/4225911933/

domingo, 7 de abril de 2013

Usar el mouse con C/C++ en linux

La forma más fácil para usar las funcionalidades del mouse es usando xdotool (necesita tenerlo instalado).

Ejemplo 1:
Mover el cursor a la coordenada 1,1
system("xdotool mousemove 1 1");



Ejemplo 2:
Este es otro ejemplo de una clase "Mouse" que hice para probar 



#include <inttypes.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
using namespace std;

#define SIZE_OF_SCRIPT_CLICK 20 // Size script that will run the click

class Mouse{
public:

 /** Mouse buttons **/
 enum MouseButton{
  Left=1,
  Middle=2,
  Right=3
 };

 /** Perform click's
  *
  * @param nClicks Number of clicks to perform
  * @param button Button of the click
  * @param delay Delay time in microseconds
  *
  */
 void click(int nClicks=1, MouseButton button=Left,int delay=0){
  static char script[SIZE_OF_SCRIPT_CLICK];
  memset(script,0,sizeof(char)*SIZE_OF_SCRIPT_CLICK);

  sprintf (script,"xdotool click %d",int(button));

  while (nClicks--){
   system(script);
   if (nClicks)
    usleep(delay);
  }
 }

 /** Type of mouse move **/
 enum TypeOfMove{
  Relative, // Move the cursor with respect to the current position
  Absolute  // Places the cursor at a given position
 };

 /** Change the cursor position
  *
  * @param x Abscissa
  * @param y Ordinate
  * @param typeOfMove Type of move
  */
 void move(int x,int y,TypeOfMove typeOfMove=Absolute){
  static char script[SIZE_OF_SCRIPT_CLICK];
  memset(script,0,sizeof(char)*SIZE_OF_SCRIPT_CLICK);
  sprintf (script,"xdotool mousemove%s %d %d",
    typeOfMove==Relative?"_relative":"",x,y);
  system(script);
 }
};


int main() {
 Mouse m;
 usleep(500000);
 m.click(1,Mouse::Right);
 usleep(500000);
 m.move(0,200,Mouse::Relative);
 m.click(1,Mouse::Left);
 m.move(0,200,Mouse::Absolute);
 m.click(1,Mouse::Left);
 return 0;
}


viernes, 29 de marzo de 2013

Sacar clave de un router teniendo acceso físico (reaver)

Si tienes acceso físico a un router pero no sabes la clave y tampoco quieres resetearlo entonces puedes usar reaver para descubrirla.
En la parte de atras del router (o en su caja) por lo general hay una etiqueta que indica el PIN del WPS. Este número es el que vamos a usar para conseguir la clave.





Esta prueba fue hecha usando backtrack. Pero puedes usar cualquier distro.

1- Primero debes poner tu tarjeta en modo monitor

airmon-ng start wlan0

2- Busca el bssid y el canal del router victima:
airodump-ng mon0


3- Por ultimo ejecuta reaver, el pin es el que viste en el reverso del router

reaver -i mon0 -b BSSID -c CANAL -p PIN –vv

Ejemplo (BSSID=F8:E1:21:35:26:0C ; CANAL=4 ; PIN=17057414):

reaver -i mon0 -b F8:E1:21:35:26:0C -c 4 -p 17057414 –vv


--------------------------------------------------------------------------------------

Estas son capturas de las dos únicas pruebas que he realizado (ambas exitosas):



Se puede notar que sacaron la clave en solo 3 segundos!

Prueba Alfa AWUS036NHR + splitter

Esta es una prueba de un Alfa AWUS036NHR (2W). Veremos la variación de la señal con la antena de serie vs la señal de dos antenas colocadas con un splitter.


Caso 1: Alfa + Antena por defecto:



Caso 2: Alfa + Splitter ( Antena por defecto + Antenna TP-Link 8db)




Podemos ver que el aumento fue significativo pero nada del otro mundo. 

martes, 12 de febrero de 2013

Ordenar un vector con std::sort() en c++


Este es un ejemplo rapido:


#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <stdio.h>
using std::vector;

struct Ovni{
 Ovni(int ci){
  this->ci=ci;
 }
 int ci;
};

// Función que indicará si un ovni es menor que otro (modificar a su gusto)
bool menorque(const Ovni& o1,const Ovni& o2){
 return o1.ci<o2.ci;
}
int main (int argc, char *argv[]){
 vector<Ovni> vectorDeOvnis;
 vectorDeOvnis.push_back(Ovni(1));
 vectorDeOvnis.push_back(Ovni(3));
 vectorDeOvnis.push_back(Ovni(2));
 vectorDeOvnis.push_back(Ovni(0));

 printf("Antes\n");

 for (uint i = 0; i < vectorDeOvnis.size(); ++i) {
  printf("[ %d ]",vectorDeOvnis[i].ci);
 }
 // Ordena según la regla "menorque"
 std::sort(vectorDeOvnis.begin(),vectorDeOvnis.end(), &menorque);

 printf("\nDespues\n");
 for (uint i = 0; i < vectorDeOvnis.size(); ++i) {
  printf("[ %d ]",vectorDeOvnis[i].ci);
 }
}

Instalar pencil animation en Fedora / Suse x86_64

Intenté compilar el source de pencil y yum me indicaba que fataba "libming.so.1". Tras mucho buscar he conseguido una solución bastante lammer pero que más da :·/

Te puedes descargar el RPM de esta pag:

ftp://ftp.pbone.net/mirror/ftp5.gwdg.de/pub/opensuse/repositories/home:/davjam79/openSUSE_Tumbleweed/x86_64/pencil-0.4.4b-22.3.x86_64.rpm


Luego instalan normalmente: yum install ./pencil-0.4.4b-22.3.x86_64.rpm


y listo


Aquí una captura de pantalla del programa corriendo en mi Fedora 18 x86_64 bajo KDE




jueves, 31 de enero de 2013

Probando el TL-R470T+ con balanceo de carga

Esta es la configuración que le he dado:


Haciendo la prueba con balanceo de carga 1/1 con dos conexiones (aba cantv)  de 1,5 mb/s me dio este resultado:

Se puede apreciar que la velocidad de descarga llega hasta 370 kbps.

Pasos para lograr esto:

1-) Configurar las wan's

2-) Este router usa balanceo de carga basado en ancho de banda ("Bandwidth Based Balance Routing" ). Es decir, la cantidad de carga que circule por las wans dependerá de el ancho de banda que usted le asigne en la configuración. La siguiente configuración es de dos wans: una de 1900 kbps y otra de 2400


3-) Configurar las wans que participaran en el balanceo de carga.