hello world †test01.cの中身 †#include "contiki.h" #include <stdio.h> PROCESS(hello_world_process, "Hello world process"); AUTOSTART_PROCESSES(&hello_world_process); PROCESS_THREAD(hello_world_process, ev, data) { PROCESS_BEGIN(); printf("Hello, world\n"); PROCESS_END(); } 実行方法 †$ sudo make test01 TARGET=sky Motes=/dev/ttyUSB0 $ sudo make test01.upload TARGET=sky Motes=/dev/ttyUSB0 $ sudo make login TARGET=sky Motes=/dev/ttyUSB0 リセットボタンを押す。 Lチカ †test02.c †#include "contiki.h" #include "dev/leds.h" #include <stdio.h> PROCESS(test02_process, "test02 process"); AUTOSTART_PROCESSES(&test02_process); PROCESS_THREAD(test02_process, ev, data) { static struct etimer et; PROCESS_BEGIN(); while(1){ etimer_set(&et, CLOCK_SECOND); PROCESS_WAIT_UNTIL(etimer_expired(&et)); leds_on(LEDS_BLUE); etimer_set(&et, CLOCK_SECOND); PROCESS_WAIT_UNTIL(etimer_expired(&et)); leds_off(LEDS_BLUE); } PROCESS_END(); } 実行方法 †$ sudo make test02 TARGET=sky Motes=/dev/ttyUSB0 $ sudo make test02.upload TARGET=sky Motes=/dev/ttyUSB0 パケットを送信してLチカ †test03.c †#include "contiki.h" #include "dev/leds.h" #include "net/rime.h" #include <stdio.h> PROCESS(test03_process, "test03 process"); AUTOSTART_PROCESSES(&test03_process); static void abc_recv(struct abc_conn *c) { } static struct abc_conn abc; static const struct abc_callbacks abc_call = {abc_recv}; PROCESS_THREAD(test03_process, ev, data) { static struct etimer et; PROCESS_BEGIN(); abc_open(&abc, 128, &abc_call); while(1){ etimer_set(&et, CLOCK_SECOND); PROCESS_WAIT_UNTIL(etimer_expired(&et)); leds_toggle(LEDS_BLUE); packetbuf_copyfrom("hello", 6); abc_send(&abc); } PROCESS_END(); } 解説 †LEDをtoggleに変更。 1秒毎に青LEDをチカチカさせながらパケットを送信。 RIMEの中でも最もレガシーなabc (Anonymous best-effort local area broadcast)を使って送信。abcはAnonymous BroadCastから来ているのだと思われる。 パケットを受信してLチカ †test04.c †#include "contiki.h" #include "dev/leds.h" #include "net/rime.h" #include <stdio.h> PROCESS(test04_process, "test04 process"); AUTOSTART_PROCESSES(&test04_process); static void abc_recv(struct abc_conn *c) { printf("packet received!\n"); leds_toggle(LEDS_RED); } static struct abc_conn abc; static const struct abc_callbacks abc_call = {abc_recv}; PROCESS_THREAD(test04_process, ev, data) { static struct etimer et; PROCESS_BEGIN(); abc_open(&abc, 128, &abc_call); while(1){ etimer_set(&et, CLOCK_SECOND); PROCESS_WAIT_UNTIL(etimer_expired(&et)); leds_toggle(LEDS_BLUE); } PROCESS_END(); } 解説 †青色LEDをチカチカさせながらパケットを受信したら赤色LEDをチカチカ。 送信周波数の変更 (CC2420) †test05.c †#include "contiki.h" #include "dev/leds.h" #include "dev/cc2420.h" #include "net/rime.h" #include <stdio.h> PROCESS(test05_process, "test05 process"); AUTOSTART_PROCESSES(&test05_process); static void abc_recv(struct abc_conn *c) { } static struct abc_conn abc; static const struct abc_callbacks abc_call = {abc_recv}; PROCESS_THREAD(test05_process, ev, data) { static struct etimer et; PROCESS_BEGIN(); cc2420_set_channel(11); abc_open(&abc, 128, &abc_call); while(1){ etimer_set(&et, CLOCK_SECOND); PROCESS_WAIT_UNTIL(etimer_expired(&et)); leds_toggle(LEDS_BLUE); leds_toggle(LEDS_GREEN); packetbuf_copyfrom("hello", 6); abc_send(&abc); } PROCESS_END(); } 解説 †dev/cc2420.hのcc2420_set_channelを使う。 上の例ではチャネル11に変更。 デフォルトは26。 が、 をみたところチャネルは11~26の模様... パケットの中身を表示する †送信側は上記のtest03と一緒。 test04をベースに拡張。 test08.c †#include "contiki.h" #include "dev/leds.h" #include "net/rime.h" #include <stdio.h> PROCESS(test08_process, "test08 process"); AUTOSTART_PROCESSES(&test08_process); static void abc_recv(struct abc_conn *c) { uint8_t total, data, header, ret; char msg[16]; data = packetbuf_datalen(); total = packetbuf_totlen(); header = packetbuf_hdrlen(); printf("packet received!\n"); printf("total = %d, header = %d, data = %d\n", total, header, data); ret = packetbuf_copyto(msg); msg[ret] = 0; printf("%d copied: %s\n", ret, msg); leds_toggle(LEDS_RED); } static struct abc_conn abc; static const struct abc_callbacks abc_call = {abc_recv}; PROCESS_THREAD(test08_process, ev, data) { static struct etimer et; PROCESS_BEGIN(); abc_open(&abc, 128, &abc_call); while(1){ etimer_set(&et, CLOCK_SECOND); PROCESS_WAIT_UNTIL(etimer_expired(&et)); leds_toggle(LEDS_BLUE); } PROCESS_END(); } 実行結果 †total = 9, header = 0, data = 9 9 copied: hello 211 packet received! total = 9, header = 0, data = 9 9 copied: hello 212 packet received! total = 9, header = 0, data = 9 9 copied: hello 213 packet received! total = 9, header = 0, data = 9 9 copied: hello 214 解説 †packetbuf_copytoはペイロードを持ってくる関数。 packetbuf_datalenはデータ部のサイズ、packetbuf_hdrlenはヘッダのサイズ、packetbuf_totlenはパケット全体のサイズを持ってくる。 TelosB上で動作するContikiではデフォルトはIEEE 802.15.4のヘッダを持っているはずなのだがヘッダはなぜかゼロが出力される。 フーム... TelosB環境ではネットワークスタックは
となっている。 参考情報 † |