標準以外のMACを使ってみる

Makefileに

DEFINES = NETSTACK_CONF_RDC=nullrdc_driver,NETSTACK_CONF_MAC=nullmac_driver

と加えるとMACなし、RDCなし、framerは802.15.4で動作する。

  1. Network: rime_driver (default)
  2. MAC: nullmac_driver
  3. RDC: nullrdc_driver
  4. Framer: framer_802.15.4 (default)
  5. Radio: cc2420_driver (default)

同じ設定同士だと送受信が成功。

送信側と受信側で一つでも違うと通信はできない様子。

今度は

  1. Network: rime_driver (default)
  2. MAC: nullmac_driver
  3. RDC: nullrdc_driver
  4. Framer: framer_nullmac
  5. Radio: cc2420_driver (default)

としてみた。 すると通信することができない。 どうやらTelosBはframer_802154が必須のようだ。

たぶんできると思いつつDuty CyclingなしのCSMAが動くかチェック。

  1. Network: rime_driver (default)
  2. MAC: csma_driver (default)
  3. RDC: nullrdc_driver
  4. Framer: framer_802.15.4 (default)
  5. Radio: cc2420_driver (default)

やはり動く。

使用しているモジュールの確認方法

ソースコードを追うまでどのMACが組み込まれているか調べる方法が分からなかったのでここにメモ。 ContikiはTelosBで動かすときにはxmacもcontikimacも全て組み込むようで、makeの出力を見てるだけでは分からなかったです。

test09.c

#include "contiki.h"
#include "net/netstack.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("NET=%s\n", NETSTACK_NETWORK.name);
  printf("MAC=%s\n", NETSTACK_MAC.name);
  printf("RDC=%s\n", NETSTACK_RDC.name);

  PROCESS_END();
}

解説

NETSTACKの.nameを見るとどのモジュールを使っているかが分かります。 残念ながらFRAMERとRADIOは.nameを持っていないようです。 net/netstack.hをインクルードするのを忘れずに。

動作確認

sudo make test09.upload TARGET=sky MOTES=/dev/ttyUSB0

でmakeとuploadを同時に。

ログインは

sudo make test09 login TARGET=sky MOTES=/dev/ttyUSB0

最初は何も出てこないのでTelosB上のresetボタンを押すと以下が出力されます。

Rime started with address 242.109
MAC f2:6d:00:00:00:00:00:00 Contiki 2.6 started. Node id is not set.
CSMA ContikiMAC, channel check rate 8 Hz, radio channel 65491
Starting 'Hello world process'
NET=Rime
MAC=CSMA
RDC=ContikiMAC

オリジナルMACの作り方

まず、core/net/mac以下にtestmac.h、testmac.cを作ります。

testmac.h

#ifndef __TESTMAC_H__
#define __TESTMAC_H__

#include "net/mac/mac.h"

extern const struct mac_driver testmac_driver;

#endif

testmac.c

#include "net/mac/testmac.h"
#include "net/netstack.h"

static void send_packet(mac_callback_t sent, void *ptr)
{
}

static void packet_input(void)
{
}

static int on(void)
{
  return 0;
}

static int off(int keep_radio_on)
{
  return 0;
}

static unsigned short channel_check_interval(void)
{
  return 0;
}

static void init(void)
{
}

const struct mac_driver testmac_driver = {
  "testmac",
  init,
  send_packet,
  packet_input,
  on,
  off,
  channel_check_interval,
};

ポイントは「net/netstack.h」をincludeすることです。

これができたらcore/net/mac/Makefile.macにtestmac.cを追記。

Makefile.mac

CONTIKI_SOURCEFILES += cxmac.c xmac.c nullmac.c lpp.c frame802154.c sicslowmac.c nullrdc.c nullrdc-noframer.c mac.c
CONTIKI_SOURCEFILES += framer-nullmac.c framer-802154.c csma.c contikimac.c phase.c testmac.c

これが終わったら後は適当なディレクトリにアプリケーションプログラム用のMakefileでtestmac_driverを指定するだけです。

例えばここではtest10というディレクトリにtest10.cというアプリケーションプログラムを書いています。

test10/Makefile

all:

CONTIKI = /home/user/contiki
DEFINES = NETSTACK_CONF_MAC=testmac_driver
include $(CONTIKI)/Makefile.include

clean:
        rm -rf *sky *.a *.map

teset10/test10.c

#include "contiki.h"
#include "net/netstack.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("NET=%s\n", NETSTACK_NETWORK.name);
  printf("MAC=%s\n", NETSTACK_MAC.name);
  printf("RDC=%s\n", NETSTACK_RDC.name);

  PROCESS_END();
}

コンパイル

$ sudo make test10.upload TARGET=sky MOTES=/dev/ttyUSB0

実行結果

coojaでの実行結果です。 testmacがロードされているのが分かります。

original_mac.jpg

添付ファイル: fileoriginal_mac.jpg 417件 [詳細]

  添付編集
Last-modified: 2015-06-08 (月) 12:35:52 (918d)