はじめに †
Contiki OSをTelosB (sky)で使っているといろんなIDが出てきます。
ざっと僕が気が付いただけ挙げると
- nodeid → 2バイトのID。xmemに書き込まれた値。
- RIMEアドレス → rimeで使うID。2バイトの場合と8バイトの場合がある。
- linkaddr_node_addr → rime_addrの実態。
- IPv4アドレス → 32bitのIPv4のアドレス。
- IPv6アドレス → 128bitのIPv6のアドレス。
- MACアドレス → 8バイトのアドレス。CC2420に設定する。longaddrと等しい
- longaddr → CC2420に設定するMAC層の8バイトのアドレス。
- shortaddr → CC2420に設定するMAC層の2バイトのアドレス。
- PAN ID → CC2420に設定するPAN (Personal Area Network)を識別するためのID。Contiki OSでは0xABCDに統一している模様。
などなど。
また、これらのアドレスが
- IPv6を使う場合
- IPv4を使う場合
- IPv6もIPv4も使わない場合
で状況がいろいろと異なってくるのでとても混乱します...
xmemに書き込む方法 †
IPv6を使う場合 †
Contiki OSをTelosBで使う場合にはIDの観点ではIPv6対応にしておいた方が楽そうです。
IPv6を使いたい場合にはMakefileに
CONTIKI_WITH_IPV6 = 1
と書きます。
そうするとIDは基本的にはTelosBに組み込まれたds2411の値を使用する設定になります。
- nodeid → 使われない。
- RIMEアドレス → ds2411の値が使われる。
- linkaddr_node_addr → ds2411の値が使われる。
- IPv4アドレス → IPv6モードだと同時には使えない
- IPv6アドレス → 上位8バイトがfe80:0000:0000:0000で、下位8バイトがds2411の値が使われる。
- MACアドレス → ds2411の値が使われる。
- shortaddr → ds2411の値の下位2バイトが使われる。
- longaddr → ds2411の値が使われる。
- PAN ID → 0xABCDが使われる。
IPv4を使う場合 †
IPv4を使う場合にはIPv6とかなり変わってきます。
Makefileには
CONTIKI_WITH_RIME = 1
CONTIKI_WITH_IPV4 = 1
と書きこみます。
IPv6とは共存できないので注意。
- nodeid → xmemに書き込まれた値、もしくは0。
- RIMEアドレス → 2バイトの値が使用される。nodeidがある場合にはnodeid。nodeidが0の場合にはds2411の下2バイトからリトルエンディアンになる。例えばnodeidが1ならrime_addrは1.0になる。
- linkaddr_node_addr → rime_addrの実態なのでnodeidかds2411の下2バイト。
- IPv4アドレス → 先頭2バイトが172.16、残り2バイトがrime_addrになる。
- IPv6アドレス → IPv4モードでは使えない。
- MACアドレス → 先頭2バイトがRIMEアドレスで、残りの6バイトが0。
- shortaddr → RIMEアドレスと同じ。
- longaddr → MACアドレスと同じ。
- PAN ID → 0xABCDが使われる。
IPv4もIPv6も使わない場合 †
Makefileに
CONTIKI_WITH_RIME = 1
のみを指定するとIPが付かないモードになります。
MakefileにRIMEもIPv4もIPv6も何も指定しないと、IPv6のモードになるので注意。
使われるアドレスは以下の通りとなります。
- nodeid → xmemに書き込まれた値、もしくは0。
- RIMEアドレス → 2バイトの値が使用される。nodeidがある場合にはnodeid。nodeidが0の場合にはds2411の下2バイトからリトルエンディアンになる。例えばnodeidが1ならrime_addrは1.0になる。
- linkaddr_node_addr → rime_addrの実態なのでnodeidかds2411の下2バイト。
- MACアドレス → 先頭2バイトがRIMEアドレスで、残りの6バイトが0。
- shortaddr → RIMEアドレスと同じ。
- longaddr → MACアドレスと同じ。
- PAN ID → 0xABCDが使われる。
シミュレーションでのID †
シミュレーションでの挙動はxmemの値とds2411の値がそれぞれエミュレートされて与えられます。
xmemではcoojaでアサインされたIDがそのまま割り当てられます。
ds2411からの値は先頭3バイトが00:12:74、残りがnodeid:00:nodeid:nodeid:nodeidとなります。
nodeidが255を超えると残り5バイトの00の部分が桁上がりして01になります。
おわりに †
いろいろ試してみた結果、Contikiを使う場合にはIPv6を前提にした方がいろいろとよさそうです。