| 標準以外のMACを使ってみる †Makefileに DEFINES = NETSTACK_CONF_RDC=nullrdc_driver,NETSTACK_CONF_MAC=nullmac_driver と加えるとMACなし、RDCなし、framerは802.15.4で動作する。 
 同じ設定同士だと送受信が成功。 送信側と受信側で一つでも違うと通信はできない様子。 今度は 
 としてみた。 すると通信することができない。 どうやらTelosBはframer_802154が必須のようだ。 たぶんできると思いつつDuty CyclingなしのCSMAが動くかチェック。 
 やはり動く。 使用しているモジュールの確認方法 †ソースコードを追うまでどの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がロードされているのが分かります。 |