Comunicación entre módulos CC2530 con Contiki

Considero que este problema fue demasiado estúpido como para invertirle tanto tiempo, pero decido compartirlo, como siempre, para evitar que alguien más pierda el tiempo como yo.

Ahora, vamos por partes, para ver la raíz del problema.

Primero. Contiki es un sistema operativo hecho para dispositivos de capacidades limitadas, la cuál tiene como fin reutilizar un código para dispositivos del Internet de las Cosas, casualmente con lo que estoy trabajando en mi trabajo de tesis. En el caso nuestro, trabajamos con un microcontrolador de Texas Instruments, el afamado CC25030, con el siempre útil procesador 8051 de Intel, y con capacidades inalámbricas añadidas. Es una buena elección para proyectos de índole inalámbrica por su bajo coste. Pero, como se ha de imaginar el lector, es un fastidio programarlo, incluso con Contiki, que suena una solución sencilla para este tipo de cuestiones.

Segundo. Hay muchos problemas con el kit de desarrollo CC2530DK y Contiki. No se imaginan cuantos. Se necesitan hacer varios detalles para hacer que funcione de forma adecuada. Pero ya hemos finalizado este tedioso proceso, muchas cosas se comienzan a facilitar. Un ejemplo básico con el que me encontré fue batallar con protocolos de Contiki y la dirección IPv6 que toma al momento de inicializar. En principio, estos no se pueden comunicar.

La solución: cambiar la IPv6 para que el ejemplo udp-ipv6 funcione como queremos. Así es. Tan fácil como asignar nuestra propia dirección. Para facilitarles esta cuestión pondré la parte del código que he modificado para que funcione.

#if SERVER_RPL_ROOT
void
create_dag()
{
rpl_dag_t *dag;

uip_ip6addr(&ipaddr, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0215, 0x2000, 0x0002, 0x2145);
//uip_ds6_set_addr_iid(&ipaddr, &uip_lladdr);
uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF);

print_local_addresses();

dag = rpl_set_root(RPL_DEFAULT_INSTANCE,
&uip_ds6_get_global(ADDR_PREFERRED)->ipaddr);
if(dag != NULL) {
//uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0);
uip_ip6addr(&ipaddr, 0xaaaa, 0x0000, 0x0000, 0x0000, 0x0215, 0x2000, 0x0002, 0x2145);
rpl_set_prefix(dag, &ipaddr, 64);
PRINTF(“Created a new RPL dag with ID: “);
PRINT6ADDR(&dag->dag_id);
PRINTF(“\n”);
}
}

En mi caso he tomado la dirección que pone el cliente en la terminal y se la he asignado al servidor. Ahora, la información llega al servidor de forma adecuada. Y podremos disfrutar de nuestro ejemplo funcionando.

A partir de aquí solo queda modificarlo para que nuestras necesidades se vean cumplidas.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s