Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenas he conseguido manejar un robot lego mediante bluetooth con el siguiente programa: NXT-Remote
Me seria de gran ayuda saber el codigo fuente de este programa para saber que instrucciones tiene para hacer la coneccion bluetooth.
Nunca he oido la palabra socket referido a un protocolo distinto al TCP/IP... y los de la wiki parece que tampoco... 🙂
http://es.wikipedia.org/wiki/Socket " onclick="window.open(this.href);return false;
Eso es porque te estás refiriendo exclusivamente a un tipo de socket, concretamente te estas refiriendo a los "sockets de red" ( http://en.wikipedia.org/wiki/Network_socket " onclick="window.open(this.href);return false;), que son los típicos que se usan para aplicaciones de red. Los sockets son algo mucho más genérico y que no tienen porque involucrar a ningún tipo de protocolo de red, sino que simplemente supone un flujo de de bytes, de hecho los procesos en sistemas tipo UNIX se comunican mediante sockets unix (que tampoco tienen nada que ver con TCP/IP, http://en.wikipedia.org/wiki/Unix_domain_socket " onclick="window.open(this.href);return false;).
Para el caso de los sockets de red cuando se hace la llamada a la función socket() se le pasa como primer argumento el tipo de socket, por ejemplo AF_INET/PF_INET para el caso del que tu hablas ( http://www.manpagez.com/man/2/socket/ " onclick="window.open(this.href);return false;).
En el caso de bluetooth, todo sería igual, pero en este caso se configura como un socket bluetooth pasándo como primer parámetro AF_BLUETOOTH ( http://people.csail.mit.edu/albert/bluez-intro/x502.html " onclick="window.open(this.href);return false;)
Para concluir, dejo aquí un ejemplo de función para conectarse al NXT (sacado del código de NXTRC: http://www.scienzaludica.it/index.php?page=88 " onclick="window.open(this.href);return false; )
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <ctype.h>
#include <sys/socket.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <bluetooth/bluetooth.h>
#include <bluetooth/rfcomm.h>
#include <bluetooth/hci.h>
#include <bluetooth/hci_lib.h>
#include "NXTRC_func.h"
int retries=3;
//////////////////////////////////////////
// Connect to BT dev with BTaddr= <dest>
// if failed retry <retries> times
// if failed again quits
// if successfull return socket in <s>
// if (verb) Beeps and prints "CONNECTED"
int nxt_connect(char *dest,int verb)
{
int s;
int status;
struct sockaddr_rc addr={0};
s= socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
addr.rc_family = AF_BLUETOOTH;
addr.rc_channel = (uint8_t) 1;
str2ba( dest, &addr.rc_bdaddr);
status = connect(s, (struct sockaddr *)&addr, sizeof(addr));
while(status < 0)
{ perror("=! Connection Failed: n");
if(retries == -1)
nxt_quit(s,0);
sleep(3);
printf("=! Retrying... (%d)n", retries--);
s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM);
status = connect(s, (struct sockaddr *)&addr,sizeof(addr));
}
if(verb)
{ printf("=: Connectedn");
beep(s);
}
return(s);
}
P.D. Me consta que algunos de la "wiki" ya estaban al tanto de todo esto: http://en.wikipedia.org/wiki/Berkeley_sockets " onclick="window.open(this.href);return false; 😉
Yo he programado con sockets tanto en PC como en PDA y siempre eran referentes a TCP/IP sin nada que ver con comunicaciones serie ni bluetooth ni nada parecido.
Ya andaba yo algo preocupado por estar excesivamente desfasado pero despues de leer dos frases en la pagina de Berkeley_sockets que envias me he quedado mas tranquilo.
"The Berkeley socket API forms the de facto standard abstraction for network sockets"
"...allows communications between hosts or between processes on one computer, using the concept of an Internet socket."
No es que TCP/IP sea un tipo de socket como dices sino que el TCP/IP (llamale internet socket o network socket) es la razón de ser del socket cuya funcionalidad y concepto original se mantiene con el añadido de nuevos protocolos.
A ver, en una cosa si tienes razón, y es que originalmente los sockets eran referidos a conexiones de red, pero hoy día los sockets son un paradigma de programación mucho más genérico. Creo que aquí es la primera vez que se define un socket para la red DARPA: http://tools.ietf.org/html/rfc129 " onclick="window.open(this.href);return false; como ves es en 1971 y hasta 1974 no escriben nada sobre TCP ( http://www.ietf.org/rfc/rfc0675.txt " onclick="window.open(this.href);return false;). Cito de este RFC:
2.2 Sockets and Addressing
We have borrowed the term SOCKET from the ARPANET terminology
[CACR70, MCKE73]. In general, a socket is the concatenation of a
NETWORK identifier, TCP identifier, and PORT identifier.
Por tanto, es obvio que el término socket es más antiguo que toda la tecnología TCP. El protocolo TCP/IP vendrá después, en 1989 ( http://tools.ietf.org/html/rfc1122 " onclick="window.open(this.href);return false;) pero ya en 1983 (con la publicación de 4.2BSD) existía la API de Berkely sockets, por lo que esta es más antigua que el propio TCP/IP.
Posiblemente haya algunos RFCs anteriores a los que he puesto, pero estos son los que he encontrado. La verdad es que yo aprendí con los Berkely sockets y los he tenido al como un canal de comunicaciones genérico y desconocía de dónde procedía su primer uso o su especificación. Como siempre que me pongo a buscar RFCs, es casi imposible tirar del hilo hasta dar con la madre del cordero x'DDD
En definitiva y a lo que venía este post, puedes conectarte al NXT con un programa que abra sockets al dispositivo.
Un saludo!
Si, ya lo he pillado... ambos tenemos nuestra parte de razón asi que ni pa tí ni pa mi...
Pensando en el que ha abierto el hilo y antes de que caiga en una profunda depresión por la complejidad aparente del tema dejemos claro que usar el puerto serie virtual sobre bluetooth es la opción mas practica para conectar con el NXT.... y de eso se encarga el propio software del bluetooth, en mi caso el BT venia con el software BlueSoleil que lo configura en un pestañeo.
furri.

