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。 が、 http://www.zigbee-rf.com/image/table2.gif をみたところチャネルは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環境ではネットワークスタックは

  1. Network: rime_driver
  2. MAC: csma_driver
  3. RDC: contikimac_driver
  4. Framer: framer_802.15.4
  5. Radio: cc2420_driver

となっている。

参考情報

  1. http://anrg.usc.edu/contiki/
  2. https://github.com/contiki-os/contiki/wiki

  添付編集
Last-modified: 2015-06-06 (土) 09:59:46 (3219d)