Expresate

Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:

Avisos
Vaciar todo

Programa fuente de NXT-remote para lego mindstorm(bluetooth)

9 Respuestas
3 Usuarios
0 Reactions
2,602 Visitas
ekae2
Respuestas: 3
Topic starter
(@ekae2)
New Member
Registrado: hace 16 años

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.


Responder
8 respuestas
fj_sanchez
Respuestas: 1083
(@fj_sanchez)
Ardero
Registrado: hace 20 años

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; 😉


Responder
furri
Respuestas: 2708
(@furri)
Ardero
Registrado: hace 20 años

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.


Responder
fj_sanchez
Respuestas: 1083
(@fj_sanchez)
Ardero
Registrado: hace 20 años

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!


Responder
furri
Respuestas: 2708
(@furri)
Ardero
Registrado: hace 20 años

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.


Responder
Página 2 / 2
Compartir: